diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2005-10-03 23:27:33 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:39:20 -0500 |
commit | f9a416743401121e1bc2961402cd6f87de68ca00 (patch) | |
tree | c5b83bc137b130022159934b22a90227da0ae67b /source4/pidl/lib/Parse/Pidl/Samba3/Server.pm | |
parent | 012893cb421d77efc538c9f4c78b2421aef3f06e (diff) | |
download | samba-f9a416743401121e1bc2961402cd6f87de68ca00.tar.gz samba-f9a416743401121e1bc2961402cd6f87de68ca00.tar.bz2 samba-f9a416743401121e1bc2961402cd6f87de68ca00.zip |
r10694: Add some work I did this afternoon on getting pidl to output Samba3
RPC parsers. Currently the following files can be generated:
- include/rpc_BASENAME.h
- rpc_server/srv_BASENAME.c
- rpc_server/srv_BASENAME_nt.c (template only, user has to fill in functions)
- rpc_client/cli_BASENAME.c
- rpc_parse/parse_BASENAME.c
So far, I have been working on getting DFS working. Currently still to do
(all in rpc_parse/parse_BASENAME.c):
- Proper handling of declarations
- Proper handling of scalar/buffer parts of structs and unions
- Subcontexts
- Proper handling of arrays
- Support for custom (non-scalar) types
I hope to have a somewhat more working version later this week.
Some files as currently generated are available from:
http://samba.org/~jelmer/pidl_samba3/
(This used to be commit 8af8eaeeef6d46f4d25ccb1d25890e1eef063e4f)
Diffstat (limited to 'source4/pidl/lib/Parse/Pidl/Samba3/Server.pm')
-rw-r--r-- | source4/pidl/lib/Parse/Pidl/Samba3/Server.pm | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/source4/pidl/lib/Parse/Pidl/Samba3/Server.pm b/source4/pidl/lib/Parse/Pidl/Samba3/Server.pm new file mode 100644 index 0000000000..0372cf1117 --- /dev/null +++ b/source4/pidl/lib/Parse/Pidl/Samba3/Server.pm @@ -0,0 +1,115 @@ +################################################### +# Samba3 NDR server generator for IDL structures +# Copyright jelmer@samba.org 2005 +# released under the GNU GPL + +package Parse::Pidl::Samba3::Server; + +use strict; +use Parse::Pidl::Typelist qw(hasType getType mapType); +use Parse::Pidl::Util qw(has_property ParseExpr); +use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred); + +my $res = ""; +my $tabs = ""; + +sub indent() { $tabs.="\t"; } +sub deindent() { $tabs = substr($tabs, 1); } +sub pidl($) { $res .= $tabs.(shift)."\n"; } + +use vars qw($VERSION); +$VERSION = '0.01'; + +sub ParseFunction($$) +{ + my ($if,$fn) = @_; + + pidl "/******************************************************************"; + pidl " api_$fn->{NAME}"; + pidl " *****************************************************************/"; + pidl ""; + pidl "static BOOL api_$fn->{NAME}(pipes_struct *p)"; + pidl "{"; + indent; + pidl uc("$if->{NAME}_q_$fn->{NAME}") . " q_u;"; + pidl uc("$if->{NAME}_r_$fn->{NAME}") . " r_u;"; + pidl "prs_struct *data = &p->in_data.data"; + pidl "prs_struct *rdata = &p->out_data.rdata"; + pidl ""; + pidl "if (!$if->{NAME}_io_q_$fn->{NAME}(\"\", &q_u, data, 0))"; + pidl "\treturn False;"; + pidl ""; + pidl "r_u.status = _$fn->{NAME}(p, &q_u, &r_u);"; + pidl ""; + pidl "if (!$if->{NAME}_io_r_$fn->{NAME}(\"\", &r_u, rdata, 0))"; + pidl "\treturn False;"; + pidl ""; + pidl "return True;"; + deindent; + pidl "}"; +} + +sub ParseInterface($) +{ + my $if = shift; + + ParseFunction($if, $_) foreach (@{$if->{FUNCTIONS}}); + + pidl ""; + pidl "/* Tables */"; + pidl "static struct api_struct api_$if->{NAME}_cmds[] = "; + pidl "{"; + indent; + foreach (@{$if->{FUNCTIONS}}) { + pidl "{\"" . uc($_->{NAME}) . "\", " . uc($_->{NAME}) . ", api_$_->{NAME}},"; + } + deindent; + pidl "};"; + + pidl ""; + + pidl "void $if->{NAME}_get_pipe_fns(struct api_struct **fns, int *n_fns)"; + pidl "{"; + indent; + pidl "*fns = api_$if->{NAME}_cmds;"; + pidl "*n_fns = sizeof(api_$if->{NAME}_cmds) / sizeof(struct api_struct);"; + deindent; + pidl "}"; + + pidl ""; + + pidl "NTSTATUS rpc_$if->{NAME}_init(void)"; + pidl "{"; + indent; + pidl "return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, \"$if->{NAME}\", \"$if->{NAME}\", api_$if->{NAME}_cmds, sizeof(api_$if->{NAME}_cmds) / sizeof(struct api_struct));"; + deindent; + pidl "}"; +} + +sub Parse($$) +{ + my($ndr,$filename) = @_; + + $tabs = ""; + $res = ""; + + pidl "/*"; + pidl " * Unix SMB/CIFS implementation."; + pidl " * server auto-generated by pidl. DO NOT MODIFY!"; + pidl " */"; + pidl ""; + pidl "#include \"includes.h\""; + pidl "#include \"nterr.h\""; + pidl ""; + pidl "#undef DBGC_CLASS"; + pidl "#define DBGC_CLASS DBGC_RPC"; + pidl ""; + + foreach (@$ndr) { + ParseInterface($_) if ($_->{TYPE} eq "INTERFACE"); + } + + return $res; +} + +1; |