################################################### # Samba3 server generator for IDL structures # on top of Samba4 style NDR functions # Copyright jelmer@samba.org 2005-2006 # released under the GNU GPL package Parse::Pidl::Samba3::ServerNDR; use strict; use Parse::Pidl::Typelist qw(hasType getType mapType scalar_is_reference); use Parse::Pidl::Util qw(has_property ParseExpr is_constant); use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred); use Parse::Pidl::Samba4 qw(DeclLong); use vars qw($VERSION); $VERSION = '0.01'; my $res; my $res_hdr; my $tabs = ""; sub indent() { $tabs.="\t"; } sub deindent() { $tabs = substr($tabs, 1); } sub pidl($) { $res .= $tabs.(shift)."\n"; } sub pidl_hdr($) { $res_hdr .= (shift)."\n"; } sub fatal($$) { my ($e,$s) = @_; die("$e->{ORIGINAL}->{FILE}:$e->{ORIGINAL}->{LINE}: $s\n"); } sub warning($$) { my ($e,$s) = @_; warn("$e->{ORIGINAL}->{FILE}:$e->{ORIGINAL}->{LINE}: $s\n"); } sub fn_declare($) { my ($n) = @_; pidl $n; pidl_hdr "$n;"; } sub ParseFunction($$) { my ($if,$fn) = @_; pidl "static BOOL api_$fn->{NAME}(pipes_struct *p)"; pidl "{"; indent; deindent; pidl "}"; pidl ""; } sub ParseInterface($) { my $if = shift; my $uif = uc($if->{NAME}); pidl_hdr "#ifndef __SRV_$uif\__"; pidl_hdr "#define __SRV_$uif\__"; 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}) . "\", DCERPC_" . uc($_->{NAME}) . ", api_$_->{NAME}},"; } deindent; pidl "};"; pidl ""; pidl_hdr "void $if->{NAME}_get_pipe_fns(struct api_struct **fns, int *n_fns);"; 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_hdr "NTSTATUS rpc_netdfs_init(void);"; pidl "NTSTATUS rpc_netdfs_init(void)"; pidl "{"; pidl "\treturn 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));"; pidl "}"; pidl_hdr "#endif /* __SRV_$uif\__ */"; } sub Parse($$$) { my($ndr,$header,$ndr_header) = @_; $res = ""; $res_hdr = ""; pidl "/*"; pidl " * Unix SMB/CIFS implementation."; pidl " * server auto-generated by pidl. DO NOT MODIFY!"; pidl " */"; pidl ""; pidl "#include \"includes.h\""; pidl "#include \"$header\""; pidl_hdr "#include \"$ndr_header\""; pidl ""; foreach (@$ndr) { ParseInterface($_) if ($_->{TYPE} eq "INTERFACE"); } return ($res, $res_hdr); } 1;