From e3374bb48daa0235811d384bce55e39b6cf6abda Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 2 Aug 2005 06:10:31 +0000 Subject: r8910: An initial parser to parse structures in smb_interfaces.h. This will be used to generate ejs objects for making raw smb calls. Running 'make smb_interfaces' should run the build_smb_interfaces.pl script which at the moment only displays a dump of the parsed data. Const is also not working right now but it's bedtime. (This used to be commit 1be5f55d7f6926bf7266ea72623990f0bb558c94) --- source4/script/build_smb_interfaces.pl | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100755 source4/script/build_smb_interfaces.pl (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl new file mode 100755 index 0000000000..31309220c1 --- /dev/null +++ b/source4/script/build_smb_interfaces.pl @@ -0,0 +1,10 @@ +#!/usr/bin/perl + +my $idl_file = shift; + +require smb_interfaces; +my $idl_parser = new smb_interfaces; +$parse = $idl_parser->parse($idl_file); + +use Data::Dumper; +print Dumper($parse); -- cgit From 30c3c77306ad48e41c9d2558f0a05b4cd3c9255b Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 2 Aug 2005 17:02:25 +0000 Subject: r8925: Start generating header and implementation files for smb_interfaces.h (This used to be commit 3a93f1125539eec6bd17003a748f1b7dd76d0031) --- source4/script/build_smb_interfaces.pl | 54 ++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 5 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index 31309220c1..cc3a352987 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -1,10 +1,54 @@ #!/usr/bin/perl +# +# Create ejs interfaces for structures in a C header file +# -my $idl_file = shift; +use File::Basename; +my $file = shift; +my $basename = basename($file, ".h"); require smb_interfaces; -my $idl_parser = new smb_interfaces; -$parse = $idl_parser->parse($idl_file); +my $parser = new smb_interfaces; +$header = $parser->parse($file); -use Data::Dumper; -print Dumper($parse); +#use Data::Dumper; +#print Dumper($header); + +# Create header + +open(FILE, ">ejs_${basename}.h"); + +print FILE "/* header auto-generated by build_smb_interfaces.pl */\n\n"; + +print FILE "#ifndef _ejs_${basename}_h\n"; +print FILE "#define _ejs_${basename}_h\n\n"; + +foreach my $x (@{$header}) { + print FILE "NTSTATUS ejs_push_$x->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; + print FILE "NTSTATUS ejs_pull_$x->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; +} + +print FILE "#endif\n"; + +close(FILE); + +# Create file + +open(FILE, ">ejs_${basename}.c"); + +print FILE "/* EJS wrapper functions auto-generated by build_smb_interfaces.pl */\n\n"; + +# Top level functions + +foreach my $x (@{$header}) { + print FILE "NTSTATUS ejs_push_$x->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *)\n"; + print FILEq "{\n"; + print FILE "\treturn NT_STATUS_OK;\n"; + print FILE "}\n\n"; + print FILE "NTSTATUS ejs_pull_$x->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *)\n"; + print FILE "{\n"; + print FILE "\treturn NT_STATUS_OK;\n"; + print FILE "}\n\n"; +} + +close(FILE); -- cgit From 4216c18f34ad29d015e853f4d1cb1900f754ad44 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 2 Aug 2005 18:56:18 +0000 Subject: r8934: Some refactoring of smb_interfaces code generator. (This used to be commit c016487a0148694a1a1464bb5f7ba0d0e142d14f) --- source4/script/build_smb_interfaces.pl | 61 ++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 11 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index cc3a352987..075786fb04 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -11,7 +11,7 @@ require smb_interfaces; my $parser = new smb_interfaces; $header = $parser->parse($file); -#use Data::Dumper; +use Data::Dumper; #print Dumper($header); # Create header @@ -23,9 +23,55 @@ print FILE "/* header auto-generated by build_smb_interfaces.pl */\n\n"; print FILE "#ifndef _ejs_${basename}_h\n"; print FILE "#define _ejs_${basename}_h\n\n"; +sub struct_name($) +{ + my $obj = shift; + return defined($obj->{STRUCT_NAME}) ? $obj->{STRUCT_NAME} : $obj->{UNION_NAME}; +} + +sub prototypes_for($) +{ + my $obj = shift; + my $name = struct_name($obj); + + print FILE "NTSTATUS ejs_push_$name(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; + print FILE "NTSTATUS ejs_pull_$name(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; +} + +sub pushpull_for($) +{ + my $obj = shift; + my $name = struct_name($obj); + + print FILE "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n"; + print FILE "{\n"; + + print FILE "\tNDR_CHECK(ejs_push_struct_start(ejs, &v, name));\n"; + + print FILE "\n\treturn NT_STATUS_OK;\n"; + print FILE "}\n\n"; + + print FILE "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n"; + print FILE "{\n"; + print FILE "\treturn NT_STATUS_OK;\n"; + print FILE "}\n\n"; +} + foreach my $x (@{$header}) { - print FILE "NTSTATUS ejs_push_$x->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; - print FILE "NTSTATUS ejs_pull_$x->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; + + # Prototypes for top level structures and unions + + prototypes_for($x); + + # Prototypes for non-anonymous nested structures and unions + + foreach my $e1 (@{$x->{DATA}}) { + foreach my $e2 (@{$e1->{DATA}}) { + if (defined($e2->{STRUCT_NAME}) or defined($e2->{UNION_NAME})) { + prototypes_for($e2); + } + } + } } print FILE "#endif\n"; @@ -41,14 +87,7 @@ print FILE "/* EJS wrapper functions auto-generated by build_smb_interfaces.pl * # Top level functions foreach my $x (@{$header}) { - print FILE "NTSTATUS ejs_push_$x->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *)\n"; - print FILEq "{\n"; - print FILE "\treturn NT_STATUS_OK;\n"; - print FILE "}\n\n"; - print FILE "NTSTATUS ejs_pull_$x->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *)\n"; - print FILE "{\n"; - print FILE "\treturn NT_STATUS_OK;\n"; - print FILE "}\n\n"; + pushpull_for($x); } close(FILE); -- cgit From 36a2b361778a8c73b2e79087bf46d52e45d6afbf Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 5 Aug 2005 01:04:45 +0000 Subject: r9089: Start generating module init and top level ejs functions for smb_interfaces. (This used to be commit 0aee33c3de6ba94ec563725a56b7dfbddd0d521a) --- source4/script/build_smb_interfaces.pl | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index 075786fb04..cc942ea3d3 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -46,13 +46,16 @@ sub pushpull_for($) print FILE "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n"; print FILE "{\n"; - print FILE "\tNDR_CHECK(ejs_push_struct_start(ejs, &v, name));\n"; + print FILE "\tNDR_CHECK(ejs_push_struct_start(ejs, &v, \"output\"));\n"; print FILE "\n\treturn NT_STATUS_OK;\n"; print FILE "}\n\n"; print FILE "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n"; print FILE "{\n"; + + print FILE "\tNDR_CHECK(ejs_pull_struct_start(ejs, &v, \"input\"));\n"; + print FILE "\treturn NT_STATUS_OK;\n"; print FILE "}\n\n"; } @@ -87,7 +90,30 @@ print FILE "/* EJS wrapper functions auto-generated by build_smb_interfaces.pl * # Top level functions foreach my $x (@{$header}) { - pushpull_for($x); + next, if $x->{STRUCT_NAME} eq ""; + print FILE "static int ejs_$x->{STRUCT_NAME}(int eid, int argc, struct MprVar **argv)\n"; + print FILE "{\n"; + print FILE "\tejsSetErrorMsg(eid, \"Not implemented\");\n"; + print FILE "\treturn -1;\n"; + print FILE "}\n\n"; } +# Module initialisation + +print FILE "static int ejs_${basename}_init(int eid, int argc, struct MprVar **argv)\n"; +print FILE "{\n"; +print FILE "\tstruct MprVar *obj = mprInitObject(eid, \"${basename}\", argc, argtv);\n\n"; + +foreach my $x (@{$header}) { + next, if $x->{STRUCT_NAME} eq ""; + print FILE "\tmprSetCFunction(obj, \"$x->{STRUCT_NAME}\", ejs_$x->{STRUCT_NAME});\n"; +} + +print FILE "}\n\n"; + +print FILE "NTSTATUS ejs_init_${basename}(void)\n"; +print FILE "{\n"; +print FILE "\treturn smbcalls_register_ejs(\"${basename}_init\", ejs_${basename}_init);\n"; +print FILE "}\n"; + close(FILE); -- cgit From 9cea63d757f9f9f9d409dec2e4b2627dbe01f006 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 5 Aug 2005 01:23:35 +0000 Subject: r9092: Generate some more stub functions. (This used to be commit 301dd7b78b78a4036a8dbf40c12171c0de50974f) --- source4/script/build_smb_interfaces.pl | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index cc942ea3d3..a3a4164d4f 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -87,12 +87,40 @@ open(FILE, ">ejs_${basename}.c"); print FILE "/* EJS wrapper functions auto-generated by build_smb_interfaces.pl */\n\n"; -# Top level functions +# Top level push/pull functions foreach my $x (@{$header}) { + next, if $x->{STRUCT_NAME} eq ""; + + print FILE "static NTSTATUS ejs_pull_$x->{STRUCT_NAME}(struct ejs_rpc *ejs, struct MprVar *v, struct $x->{STRUCT_NAME} *r)\n"; + print FILE "{\n"; + print FILE "\tNDR_CHECK(ejs_pull_struct_start(ejs, &v, \"input\"));\n"; + print FILE "\treturn NT_STATUS_OK;\n"; + print FILE "}\n\n"; + + print FILE "static NTSTATUS ejs_push_$x->{STRUCT_NAME}(struct ejs_rpc *ejs, struct MprVar *v, const struct $x->{STRUCT_NAME} *r)\n\n"; + print FILE "{\n"; + print FILE "\tNDR_CHECK(ejs_push_struct_start(ejs, &v, \"output\"));\n"; + + print FILE "\treturn NT_STATUS_OK;\n"; + print FILE "}\n\n"; +} + +# Top level call functions + +foreach my $x (@{$header}) { + next, if $x->{STRUCT_NAME} eq ""; + + $raw_name = $x->{STRUCT_NAME}; + $raw_name =~ s/smb_/smb_raw_/; + print FILE "static int ejs_$x->{STRUCT_NAME}(int eid, int argc, struct MprVar **argv)\n"; print FILE "{\n"; + print FILE "\tstruct $x->{STRUCT_NAME} parms;\n\n"; + + print FILE "\t$raw_name(tree, ¶ms);\n"; + print FILE "\tejsSetErrorMsg(eid, \"Not implemented\");\n"; print FILE "\treturn -1;\n"; print FILE "}\n\n"; -- cgit From daaf7714981575bd44693cc49a304cf67bd6a192 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 5 Aug 2005 04:50:32 +0000 Subject: r9099: Start generating code to pull/push fields. Generate functions to call the smb_raw_foo() calls. (This used to be commit 39dfabe66d1a377ed5a473db0309ca97adf24e7a) --- source4/script/build_smb_interfaces.pl | 98 +++++++++++++++++++++++----------- 1 file changed, 67 insertions(+), 31 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index a3a4164d4f..bfa73b32a5 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -4,6 +4,8 @@ # use File::Basename; +use Data::Dumper; + my $file = shift; my $basename = basename($file, ".h"); @@ -11,9 +13,6 @@ require smb_interfaces; my $parser = new smb_interfaces; $header = $parser->parse($file); -use Data::Dumper; -#print Dumper($header); - # Create header open(FILE, ">ejs_${basename}.h"); @@ -38,28 +37,6 @@ sub prototypes_for($) print FILE "NTSTATUS ejs_pull_$name(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; } -sub pushpull_for($) -{ - my $obj = shift; - my $name = struct_name($obj); - - print FILE "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n"; - print FILE "{\n"; - - print FILE "\tNDR_CHECK(ejs_push_struct_start(ejs, &v, \"output\"));\n"; - - print FILE "\n\treturn NT_STATUS_OK;\n"; - print FILE "}\n\n"; - - print FILE "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n"; - print FILE "{\n"; - - print FILE "\tNDR_CHECK(ejs_pull_struct_start(ejs, &v, \"input\"));\n"; - - print FILE "\treturn NT_STATUS_OK;\n"; - print FILE "}\n\n"; -} - foreach my $x (@{$header}) { # Prototypes for top level structures and unions @@ -89,21 +66,58 @@ print FILE "/* EJS wrapper functions auto-generated by build_smb_interfaces.pl * # Top level push/pull functions +sub print_field($$) { + my $f = shift; + my $suffix = shift; + + if ($f->{TYPE} eq "char" and $f->{POINTERS} == 1) { + $type = "string"; + } + + if ($f->{TYPE} =~ /_t$/) { + $type = $f->{TYPE}; + $type =~ s/_t$//; + } + + foreach my $x (@{$f->{NAME}}) { + print FILE "\tNDR_CHECK(ejs_pull_$type(ejs, v, \"$x\", &r->$suffix.$x));\n"; + } +} + foreach my $x (@{$header}) { next, if $x->{STRUCT_NAME} eq ""; + # Pull in to struct.in + print FILE "static NTSTATUS ejs_pull_$x->{STRUCT_NAME}(struct ejs_rpc *ejs, struct MprVar *v, struct $x->{STRUCT_NAME} *r)\n"; print FILE "{\n"; print FILE "\tNDR_CHECK(ejs_pull_struct_start(ejs, &v, \"input\"));\n"; - print FILE "\treturn NT_STATUS_OK;\n"; + + foreach my $e (@{$x->{DATA}}) { + next, if $e->{NAME}[0] ne 'in'; + foreach my $f (@{$e->{DATA}}) { + print_field($f, "in"); + } + } + + print FILE "\n\treturn NT_STATUS_OK;\n"; print FILE "}\n\n"; + # Push from struct.out + print FILE "static NTSTATUS ejs_push_$x->{STRUCT_NAME}(struct ejs_rpc *ejs, struct MprVar *v, const struct $x->{STRUCT_NAME} *r)\n\n"; print FILE "{\n"; print FILE "\tNDR_CHECK(ejs_push_struct_start(ejs, &v, \"output\"));\n"; - print FILE "\treturn NT_STATUS_OK;\n"; + foreach my $e (@{$x->{DATA}}) { + next, if $e->{NAME}[0] ne 'out'; + foreach my $f (@{$e->{DATA}}) { + print_field($f, "out"); + } + } + + print FILE "\n\treturn NT_STATUS_OK;\n"; print FILE "}\n\n"; } @@ -117,12 +131,34 @@ foreach my $x (@{$header}) { print FILE "static int ejs_$x->{STRUCT_NAME}(int eid, int argc, struct MprVar **argv)\n"; print FILE "{\n"; - print FILE "\tstruct $x->{STRUCT_NAME} parms;\n\n"; + print FILE "\tstruct $x->{STRUCT_NAME} parms;\n"; + print FILE "\tstruct smbcli_tree *tree;\n"; + print FILE "\tNTSTATUS result;\n\n"; + + $output = << "__HERE__"; + if (argc != 1 || argv[0]->type != MPR_TYPE_OBJECT) { + ejsSetErrorMsg(eid, "invalid arguments"); + return -1; + } + + tree = mprGetThisPtr(eid, "tree"); + + if (!tree) { + ejsSetErrorMsg(eid, "invalid tree"); + return -1; + } + +__HERE__ + + print FILE $output; + print FILE "\tresult = $raw_name(tree, ¶ms);\n\n"; - print FILE "\t$raw_name(tree, ¶ms);\n"; + print FILE "\tmpr_Return(eid, mprNTSTATUS(status));\n"; + print FILE "\tif (NT_STATUS_EQUAL(status, NT_STATUS_INTERNAL_ERROR)) {\n"; + print FILE "\t\treturn -1;\n"; + print FILE "\t}\n\n"; + print FILE "\treturn 0;\n"; - print FILE "\tejsSetErrorMsg(eid, \"Not implemented\");\n"; - print FILE "\treturn -1;\n"; print FILE "}\n\n"; } -- cgit From 2d9d6c46897ab87c0a331900cade73e72c257ea9 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 5 Aug 2005 05:32:39 +0000 Subject: r9102: Generate files in $srcdir/libcli/gen_raw instead of $srcdir. Start fixing compile problems in generated output. (This used to be commit e85b938ea0577c6263a28ceb722e173df475ead3) --- source4/script/build_smb_interfaces.pl | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index bfa73b32a5..7c9bd3d365 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -13,9 +13,11 @@ require smb_interfaces; my $parser = new smb_interfaces; $header = $parser->parse($file); +stat "libcli/gen_raw" || mkdir("libcli/gen_raw") || die("mkdir"); + # Create header -open(FILE, ">ejs_${basename}.h"); +open(FILE, ">libcli/gen_raw/ejs_${basename}.h"); print FILE "/* header auto-generated by build_smb_interfaces.pl */\n\n"; @@ -60,16 +62,23 @@ close(FILE); # Create file -open(FILE, ">ejs_${basename}.c"); +open(FILE, ">libcli/gen_raw/ejs_${basename}.c"); print FILE "/* EJS wrapper functions auto-generated by build_smb_interfaces.pl */\n\n"; +print FILE "#include \"includes.h\"\n"; +print FILE "#include \"lib/appweb/ejs/ejs.h\"\n"; +print FILE "#include \"scripting/ejs/ejsrpc.h\"\n"; # TODO: remove this +print FILE "\n"; + # Top level push/pull functions sub print_field($$) { my $f = shift; my $suffix = shift; + my $type = "UNKNOWN"; + if ($f->{TYPE} eq "char" and $f->{POINTERS} == 1) { $type = "string"; } @@ -106,7 +115,7 @@ foreach my $x (@{$header}) { # Push from struct.out - print FILE "static NTSTATUS ejs_push_$x->{STRUCT_NAME}(struct ejs_rpc *ejs, struct MprVar *v, const struct $x->{STRUCT_NAME} *r)\n\n"; + print FILE "static NTSTATUS ejs_push_$x->{STRUCT_NAME}(struct ejs_rpc *ejs, struct MprVar *v, struct $x->{STRUCT_NAME} *r)\n\n"; print FILE "{\n"; print FILE "\tNDR_CHECK(ejs_push_struct_start(ejs, &v, \"output\"));\n"; -- cgit From 94e5cafff2f9eae90b4218c04eb554e0eff30316 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 5 Aug 2005 15:54:11 +0000 Subject: r9124: Handle more types pointers to simple types. (This used to be commit acd34c1cac151e16f5cecae8c80a01b36ccd3fc0) --- source4/script/build_smb_interfaces.pl | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index 7c9bd3d365..3aacc6df55 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -77,7 +77,7 @@ sub print_field($$) { my $f = shift; my $suffix = shift; - my $type = "UNKNOWN"; + my $type = $f->{TYPE}; if ($f->{TYPE} eq "char" and $f->{POINTERS} == 1) { $type = "string"; @@ -88,8 +88,16 @@ sub print_field($$) { $type =~ s/_t$//; } + my $deref = "&"; + if ($f->{POINTERS} == 1 && $type ne "string") { + $deref = ""; + } + foreach my $x (@{$f->{NAME}}) { - print FILE "\tNDR_CHECK(ejs_pull_$type(ejs, v, \"$x\", &r->$suffix.$x));\n"; + if ($f->{POINTERS} > 0) { + print FILE "\t// alloc $x?\n"; + } + print FILE "\tNDR_CHECK(ejs_pull_$type(ejs, v, \"$x\", ${deref}r->$suffix.$x));\n"; } } -- cgit From 53c38c5ca658d8bdb33943992bf1a5cd3451686f Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Fri, 5 Aug 2005 18:06:15 +0000 Subject: r9129: Start working on nested anonymous structures and unions. A better design is starting to become clearer. (-: (This used to be commit 23b9f8f3b59cc497fc7368c40ca7fce474370ed3) --- source4/script/build_smb_interfaces.pl | 59 +++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 4 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index 3aacc6df55..7358eab85a 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -45,13 +45,32 @@ foreach my $x (@{$header}) { prototypes_for($x); - # Prototypes for non-anonymous nested structures and unions - foreach my $e1 (@{$x->{DATA}}) { foreach my $e2 (@{$e1->{DATA}}) { + + # Prototypes for non-anonymous nested structures and unions: + # + # e.g struct foo {...}; + if (defined($e2->{STRUCT_NAME}) or defined($e2->{UNION_NAME})) { prototypes_for($e2); } + + # We also would like to push/pull nested structures and unions: + # + # e.g struct foo { + # struct {...} bar; + # }; + + if ($e2->{TYPE} eq "struct") { + if (defined($e2->{NAME}) and !defined($e2->{STRUCT_NAME})) { + foreach my $x (@{$e2->{NAME}}) { + $name = "$e1->{NAME}[0]_$x"; + print FILE "NTSTATUS ejs_push_$name(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; + print FILE "NTSTATUS ejs_pull_$name(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; + } + } + } } } } @@ -97,6 +116,11 @@ sub print_field($$) { if ($f->{POINTERS} > 0) { print FILE "\t// alloc $x?\n"; } + + if ($f->{TYPE} eq "struct") { + $type = $f->{STRUCT_NAME}; + } + print FILE "\tNDR_CHECK(ejs_pull_$type(ejs, v, \"$x\", ${deref}r->$suffix.$x));\n"; } } @@ -138,6 +162,33 @@ foreach my $x (@{$header}) { print FILE "}\n\n"; } +# Nested anonymous structures + +foreach my $x (@{$header}) { + foreach my $e1 (@{$x->{DATA}}) { + foreach my $e2 (@{$e1->{DATA}}) { + if ($e2->{TYPE} eq "struct") { + if (defined($e2->{NAME}) and !defined($e2->{STRUCT_NAME})) { + foreach my $x (@{$e2->{NAME}}) { + + $name = "$e1->{NAME}[0]_$x"; + + print FILE "static NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n"; + print FILE "{\n"; + print FILE "\treturn NT_STATUS_OK;\n"; + print FILE "}\n\n"; + + print FILE "static NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n"; + print FILE "{\n"; + print FILE "\treturn NT_STATUS_OK;\n"; + print FILE "}\n\n"; + } + } + } + } + } +} + # Top level call functions foreach my $x (@{$header}) { @@ -148,7 +199,7 @@ foreach my $x (@{$header}) { print FILE "static int ejs_$x->{STRUCT_NAME}(int eid, int argc, struct MprVar **argv)\n"; print FILE "{\n"; - print FILE "\tstruct $x->{STRUCT_NAME} parms;\n"; + print FILE "\tstruct $x->{STRUCT_NAME} params;\n"; print FILE "\tstruct smbcli_tree *tree;\n"; print FILE "\tNTSTATUS result;\n\n"; @@ -183,7 +234,7 @@ __HERE__ print FILE "static int ejs_${basename}_init(int eid, int argc, struct MprVar **argv)\n"; print FILE "{\n"; -print FILE "\tstruct MprVar *obj = mprInitObject(eid, \"${basename}\", argc, argtv);\n\n"; +print FILE "\tstruct MprVar *obj = mprInitObject(eid, \"${basename}\", argc, argv);\n\n"; foreach my $x (@{$header}) { next, if $x->{STRUCT_NAME} eq ""; -- cgit From d8a490ab1bff8e62e76e34b7a16eb27a74b30f66 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Sun, 7 Aug 2005 18:04:34 +0000 Subject: r9185: Make second pass over the parser tree and tidy things up to make it a bit easier for the code generator. (This used to be commit a6f1f251e86bac43b894d551e93536256bab7329) --- source4/script/build_smb_interfaces.pl | 86 +++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 2 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index 7358eab85a..192a7d7094 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -6,13 +6,95 @@ use File::Basename; use Data::Dumper; -my $file = shift; -my $basename = basename($file, ".h"); +# +# Generate parse tree for header file +# +my $file = shift; require smb_interfaces; my $parser = new smb_interfaces; $header = $parser->parse($file); +# +# Make second pass over tree to make it easier to process. Ugh - this +# is all done in place as the parser generates references. +# + +my $newheader = []; + +sub flatten_names($) { + my $obj = shift; + + # Map NAME, STRUCT_NAME and UNION_NAME elements into a more likeable + # property. + + if ($obj->{TYPE} eq "struct" or $obj->{TYPE} eq "union") { + + # struct foo {}; + # struct {} bar; + # struct foo {} bar; + + $obj->{TYPE_NAME} = defined($obj->{STRUCT_NAME}) ? $obj->{STRUCT_NAME} + : $obj->{UNION_NAME}; + + delete $obj->{STRUCT_NAME}; + delete $obj->{UNION_NAME}; + } + + # Convert DATA array to a hash by field name + + foreach my $elt (@{$obj->{DATA}}) { + foreach my $name (@{$elt->{NAME}}) { + $obj->{FIELDS}{$name} = $elt; + delete $obj->{FIELDS}{$name}{NAME}; + } + } + + # Recurse down into substructures + + foreach my $elt (@{$obj->{DATA}}) { + flatten_names($elt); + } + + delete $obj->{DATA}; +} + +foreach my $s (@{$header}) { # For each parsed structure + flatten_names($s); +} + +print Dumper($header); + +exit; + +foreach my $s (@{$header}) { # For each parsed structure + print Dumper($s); + my $newdata; + foreach my $e (@{$s->{DATA}}) { # For each element in structure + foreach my $n (@{$e->{NAME}}) { # For each field in element + + my $newdata2; + foreach my $e2 (@{$e->{DATA}}) { + foreach my $n2 (@{$e2->{NAME}}) { + my $d = $e2; + $d->{NAME} = $n2; + push(@{$newdata2}, $d); + } + } + + push(@{$newdata}, {"NAME" => $n, "DATA" => $newdata2}); + } + } + my $newstruct = $s; + $newstruct->{DATA} = $newdata; + push(@{$newheader}, $newstruct); +} + +print Dumper($newheader); +exit 0; + + +my $basename = basename($file, ".h"); stat "libcli/gen_raw" || mkdir("libcli/gen_raw") || die("mkdir"); # Create header -- cgit From 3824a0caa8c95b75e7d98340a5c9eb8d40c0b38d Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Sun, 7 Aug 2005 19:22:20 +0000 Subject: r9191: Generate headers for nested structures that need pushing or pulling. (This used to be commit c56a530d3ba31a603d1a5615bdd2a0788cf1f967) --- source4/script/build_smb_interfaces.pl | 72 ++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 34 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index 192a7d7094..63cc25080c 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -46,7 +46,8 @@ sub flatten_names($) { foreach my $elt (@{$obj->{DATA}}) { foreach my $name (@{$elt->{NAME}}) { $obj->{FIELDS}{$name} = $elt; - delete $obj->{FIELDS}{$name}{NAME}; + $obj->{FIELDS}{$name}{NAME} = $name; + $obj->{FIELDS}{$name}{PARENT} = $obj; } } @@ -63,42 +64,13 @@ foreach my $s (@{$header}) { # For each parsed structure flatten_names($s); } -print Dumper($header); - -exit; - -foreach my $s (@{$header}) { # For each parsed structure - print Dumper($s); - my $newdata; - foreach my $e (@{$s->{DATA}}) { # For each element in structure - foreach my $n (@{$e->{NAME}}) { # For each field in element - - my $newdata2; - foreach my $e2 (@{$e->{DATA}}) { - foreach my $n2 (@{$e2->{NAME}}) { - my $d = $e2; - $d->{NAME} = $n2; - push(@{$newdata2}, $d); - } - } - - push(@{$newdata}, {"NAME" => $n, "DATA" => $newdata2}); - } - } - my $newstruct = $s; - $newstruct->{DATA} = $newdata; - push(@{$newheader}, $newstruct); -} - -print Dumper($newheader); -exit 0; - +# +# Generate header +# my $basename = basename($file, ".h"); stat "libcli/gen_raw" || mkdir("libcli/gen_raw") || die("mkdir"); -# Create header - open(FILE, ">libcli/gen_raw/ejs_${basename}.h"); print FILE "/* header auto-generated by build_smb_interfaces.pl */\n\n"; @@ -106,6 +78,36 @@ print FILE "/* header auto-generated by build_smb_interfaces.pl */\n\n"; print FILE "#ifndef _ejs_${basename}_h\n"; print FILE "#define _ejs_${basename}_h\n\n"; + +# Generate a push/pull prototype for every top level structure, as +# well as every non-anonymous nested structure (i.e TYPE_NAME element +# is undefined. + +foreach my $s (@{$header}) { + + # Top level + + print FILE "NTSTATUS ejs_push_$s->{TYPE_NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; + print FILE "NTSTATUS ejs_pull_$s->{TYPE_NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; + + sub header_for($$) { + my $prefix = shift; + my $obj = shift; + + return if !($obj->{TYPE} eq "struct" or $obj->{TYPE} eq "union"); + return if ($obj->{NAME} eq "in" or $obj->{NAME} eq "out"); + + print FILE "NTSTATUS ejs_push_${prefix}_$obj->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; + print FILE "NTSTATUS ejs_pull_${prefix}_$obj->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; + + foreach my $key (%{$obj->{FIELDS}}) { + header_for("${prefix}.$obj->{TYPE_NAME}", $obj->{FIELDS}{$key}); + } + } +} + +exit; + sub struct_name($) { my $obj = shift; @@ -161,7 +163,9 @@ print FILE "#endif\n"; close(FILE); -# Create file +# +# Generate implementation +# open(FILE, ">libcli/gen_raw/ejs_${basename}.c"); -- cgit From 7dfaea15b35d9c25cd9079dfc985b54176d0204d Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Sun, 7 Aug 2005 21:10:32 +0000 Subject: r9199: Another go at recursive flattening of structs. (This used to be commit a6541a07028d7d53e441a1eb78457c0d572109af) --- source4/script/build_smb_interfaces.pl | 43 ++++++++++++++-------------------- 1 file changed, 18 insertions(+), 25 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index 63cc25080c..b4fa70f4f0 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -16,54 +16,47 @@ my $parser = new smb_interfaces; $header = $parser->parse($file); # -# Make second pass over tree to make it easier to process. Ugh - this -# is all done in place as the parser generates references. +# Make second pass over tree to make it easier to process. # -my $newheader = []; +my @structs; -sub flatten_names($) { +sub flatten_structs($) { my $obj = shift; + my $s = { %$obj }; # Map NAME, STRUCT_NAME and UNION_NAME elements into a more likeable # property. - if ($obj->{TYPE} eq "struct" or $obj->{TYPE} eq "union") { + if (defined($obj->{STRUCT_NAME}) or defined($obj->{UNION_NAME})) { - # struct foo {}; - # struct {} bar; - # struct foo {} bar; - - $obj->{TYPE_NAME} = defined($obj->{STRUCT_NAME}) ? $obj->{STRUCT_NAME} + $s->{TYPE_DEFINED} = defined($obj->{STRUCT_NAME}) ? $obj->{STRUCT_NAME} : $obj->{UNION_NAME}; - delete $obj->{STRUCT_NAME}; - delete $obj->{UNION_NAME}; + delete $s->{STRUCT_NAME}; + delete $s->{UNION_NAME}; } - # Convert DATA array to a hash by field name - foreach my $elt (@{$obj->{DATA}}) { foreach my $name (@{$elt->{NAME}}) { - $obj->{FIELDS}{$name} = $elt; - $obj->{FIELDS}{$name}{NAME} = $name; - $obj->{FIELDS}{$name}{PARENT} = $obj; + my $new_elt = { %$elt }; + $new_elt->{NAME} = $name; + push(@{$s->{FIELDS}}, flatten_structs($new_elt)); } } - # Recurse down into substructures + delete $s->{DATA}; - foreach my $elt (@{$obj->{DATA}}) { - flatten_names($elt); - } - - delete $obj->{DATA}; + return $s; } foreach my $s (@{$header}) { # For each parsed structure - flatten_names($s); + print Dumper(flatten_structs($s)); } +print Dumper(@structs); +exit; + # # Generate header # @@ -111,7 +104,7 @@ exit; sub struct_name($) { my $obj = shift; - return defined($obj->{STRUCT_NAME}) ? $obj->{STRUCT_NAME} : $obj->{UNION_NAME}; + return defined($obj->{STRUCT_NAE}) ? $obj->{STRUCT_NAME} : $obj->{UNION_NAME}; } sub prototypes_for($) -- cgit From febfcd33ec150bcb815fd950afe407d14264f263 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Sun, 7 Aug 2005 22:14:30 +0000 Subject: r9202: OK now we are getting somewhere. Generate js stubs for top level structs and each arm of top level unions. Don't generate a header file (duh) as the namespace stuff is done in the module init. (This used to be commit dde7f8be97f1a85b2f8221a98eb2edd357eb8cf2) --- source4/script/build_smb_interfaces.pl | 245 +++++---------------------------- 1 file changed, 38 insertions(+), 207 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index b4fa70f4f0..e06f05b25d 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -19,8 +19,6 @@ $header = $parser->parse($file); # Make second pass over tree to make it easier to process. # -my @structs; - sub flatten_structs($) { my $obj = shift; my $s = { %$obj }; @@ -37,10 +35,13 @@ sub flatten_structs($) { delete $s->{UNION_NAME}; } + # Create a new list of structure fields with flattened names + foreach my $elt (@{$obj->{DATA}}) { foreach my $name (@{$elt->{NAME}}) { my $new_elt = { %$elt }; $new_elt->{NAME} = $name; + $new_elt->{PARENT} = $s; push(@{$s->{FIELDS}}, flatten_structs($new_elt)); } } @@ -50,111 +51,7 @@ sub flatten_structs($) { return $s; } -foreach my $s (@{$header}) { # For each parsed structure - print Dumper(flatten_structs($s)); -} - -print Dumper(@structs); -exit; - -# -# Generate header -# - -my $basename = basename($file, ".h"); -stat "libcli/gen_raw" || mkdir("libcli/gen_raw") || die("mkdir"); - -open(FILE, ">libcli/gen_raw/ejs_${basename}.h"); - -print FILE "/* header auto-generated by build_smb_interfaces.pl */\n\n"; - -print FILE "#ifndef _ejs_${basename}_h\n"; -print FILE "#define _ejs_${basename}_h\n\n"; - - -# Generate a push/pull prototype for every top level structure, as -# well as every non-anonymous nested structure (i.e TYPE_NAME element -# is undefined. - -foreach my $s (@{$header}) { - - # Top level - - print FILE "NTSTATUS ejs_push_$s->{TYPE_NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; - print FILE "NTSTATUS ejs_pull_$s->{TYPE_NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; - - sub header_for($$) { - my $prefix = shift; - my $obj = shift; - - return if !($obj->{TYPE} eq "struct" or $obj->{TYPE} eq "union"); - return if ($obj->{NAME} eq "in" or $obj->{NAME} eq "out"); - - print FILE "NTSTATUS ejs_push_${prefix}_$obj->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; - print FILE "NTSTATUS ejs_pull_${prefix}_$obj->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; - - foreach my $key (%{$obj->{FIELDS}}) { - header_for("${prefix}.$obj->{TYPE_NAME}", $obj->{FIELDS}{$key}); - } - } -} - -exit; - -sub struct_name($) -{ - my $obj = shift; - return defined($obj->{STRUCT_NAE}) ? $obj->{STRUCT_NAME} : $obj->{UNION_NAME}; -} - -sub prototypes_for($) -{ - my $obj = shift; - my $name = struct_name($obj); - - print FILE "NTSTATUS ejs_push_$name(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; - print FILE "NTSTATUS ejs_pull_$name(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; -} - -foreach my $x (@{$header}) { - - # Prototypes for top level structures and unions - - prototypes_for($x); - - foreach my $e1 (@{$x->{DATA}}) { - foreach my $e2 (@{$e1->{DATA}}) { - - # Prototypes for non-anonymous nested structures and unions: - # - # e.g struct foo {...}; - - if (defined($e2->{STRUCT_NAME}) or defined($e2->{UNION_NAME})) { - prototypes_for($e2); - } - - # We also would like to push/pull nested structures and unions: - # - # e.g struct foo { - # struct {...} bar; - # }; - - if ($e2->{TYPE} eq "struct") { - if (defined($e2->{NAME}) and !defined($e2->{STRUCT_NAME})) { - foreach my $x (@{$e2->{NAME}}) { - $name = "$e1->{NAME}[0]_$x"; - print FILE "NTSTATUS ejs_push_$name(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; - print FILE "NTSTATUS ejs_pull_$name(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n"; - } - } - } - } - } -} - -print FILE "#endif\n"; - -close(FILE); +@newheader = map { flatten_structs($_) } @{$header}; # # Generate implementation @@ -169,106 +66,59 @@ print FILE "#include \"lib/appweb/ejs/ejs.h\"\n"; print FILE "#include \"scripting/ejs/ejsrpc.h\"\n"; # TODO: remove this print FILE "\n"; -# Top level push/pull functions - -sub print_field($$) { - my $f = shift; - my $suffix = shift; - - my $type = $f->{TYPE}; - - if ($f->{TYPE} eq "char" and $f->{POINTERS} == 1) { - $type = "string"; - } - - if ($f->{TYPE} =~ /_t$/) { - $type = $f->{TYPE}; - $type =~ s/_t$//; - } +# Top level call functions - my $deref = "&"; - if ($f->{POINTERS} == 1 && $type ne "string") { - $deref = ""; - } +foreach my $s (@newheader) { - foreach my $x (@{$f->{NAME}}) { - if ($f->{POINTERS} > 0) { - print FILE "\t// alloc $x?\n"; - } + if ($s->{TYPE} eq "struct") { - if ($f->{TYPE} eq "struct") { - $type = $f->{STRUCT_NAME}; - } - - print FILE "\tNDR_CHECK(ejs_pull_$type(ejs, v, \"$x\", ${deref}r->$suffix.$x));\n"; - } -} + # Top level struct -foreach my $x (@{$header}) { + print FILE "static NTSTATUS ejs_$s->{TYPE_DEFINED}(int eid, int argc, struct MprVar **argv)\n"; + print FILE "{\n"; + print FILE "\treturn NT_STATUS_OK;\n"; + print FILE "}\n\n"; - next, if $x->{STRUCT_NAME} eq ""; + } else { - # Pull in to struct.in + # Top level union - print FILE "static NTSTATUS ejs_pull_$x->{STRUCT_NAME}(struct ejs_rpc *ejs, struct MprVar *v, struct $x->{STRUCT_NAME} *r)\n"; - print FILE "{\n"; - print FILE "\tNDR_CHECK(ejs_pull_struct_start(ejs, &v, \"input\"));\n"; + foreach my $arm (@{$s->{FIELDS}}) { - foreach my $e (@{$x->{DATA}}) { - next, if $e->{NAME}[0] ne 'in'; - foreach my $f (@{$e->{DATA}}) { - print_field($f, "in"); + print FILE "static NTSTATUS ejs_$s->{TYPE_DEFINED}_$arm->{NAME}(int eid, int argc, struct MprVar **argv)\n"; + print FILE "{\n"; + print FILE "\treturn NT_STATUS_OK;\n"; + print FILE "}\n\n"; } } +} - print FILE "\n\treturn NT_STATUS_OK;\n"; - print FILE "}\n\n"; - - # Push from struct.out +# Module initialisation - print FILE "static NTSTATUS ejs_push_$x->{STRUCT_NAME}(struct ejs_rpc *ejs, struct MprVar *v, struct $x->{STRUCT_NAME} *r)\n\n"; - print FILE "{\n"; - print FILE "\tNDR_CHECK(ejs_push_struct_start(ejs, &v, \"output\"));\n"; +print FILE "static int ejs_${basename}_init(int eid, int argc, struct MprVar **argv)\n"; +print FILE "{\n"; +print FILE "\tstruct MprVar *obj = mprInitObject(eid, \"${basename}\", argc, argv);\n\n"; - foreach my $e (@{$x->{DATA}}) { - next, if $e->{NAME}[0] ne 'out'; - foreach my $f (@{$e->{DATA}}) { - print_field($f, "out"); +foreach my $s (@newheader) { + if ($s->{TYPE} eq "struct") { + print FILE "\tmprSetCFunction(obj, \"$s->{TYPE_DEFINED}\", ejs_$s->{TYPE_DEFINED});\n"; + } else { + foreach my $arm (@{$s->{FIELDS}}) { + print FILE "\tmprSetCFunction(obj, \"$s->{TYPE_DEFINED}_$arm->{NAME}\", ejs_$s->{TYPE_DEFINED});\n"; } } - - print FILE "\n\treturn NT_STATUS_OK;\n"; - print FILE "}\n\n"; } -# Nested anonymous structures +print FILE "}\n\n"; -foreach my $x (@{$header}) { - foreach my $e1 (@{$x->{DATA}}) { - foreach my $e2 (@{$e1->{DATA}}) { - if ($e2->{TYPE} eq "struct") { - if (defined($e2->{NAME}) and !defined($e2->{STRUCT_NAME})) { - foreach my $x (@{$e2->{NAME}}) { - - $name = "$e1->{NAME}[0]_$x"; - - print FILE "static NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n"; - print FILE "{\n"; - print FILE "\treturn NT_STATUS_OK;\n"; - print FILE "}\n\n"; - - print FILE "static NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n"; - print FILE "{\n"; - print FILE "\treturn NT_STATUS_OK;\n"; - print FILE "}\n\n"; - } - } - } - } - } -} +print FILE "NTSTATUS ejs_init_${basename}(void)\n"; +print FILE "{\n"; +print FILE "\treturn smbcalls_register_ejs(\"${basename}_init\", ejs_${basename}_init);\n"; +print FILE "}\n"; -# Top level call functions +close(FILE); + +exit; foreach my $x (@{$header}) { next, if $x->{STRUCT_NAME} eq ""; @@ -309,22 +159,3 @@ __HERE__ print FILE "}\n\n"; } -# Module initialisation - -print FILE "static int ejs_${basename}_init(int eid, int argc, struct MprVar **argv)\n"; -print FILE "{\n"; -print FILE "\tstruct MprVar *obj = mprInitObject(eid, \"${basename}\", argc, argv);\n\n"; - -foreach my $x (@{$header}) { - next, if $x->{STRUCT_NAME} eq ""; - print FILE "\tmprSetCFunction(obj, \"$x->{STRUCT_NAME}\", ejs_$x->{STRUCT_NAME});\n"; -} - -print FILE "}\n\n"; - -print FILE "NTSTATUS ejs_init_${basename}(void)\n"; -print FILE "{\n"; -print FILE "\treturn smbcalls_register_ejs(\"${basename}_init\", ejs_${basename}_init);\n"; -print FILE "}\n"; - -close(FILE); -- cgit From 16cc2aa58ebd56e117112d1856051f71a79976e8 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Mon, 8 Aug 2005 00:24:05 +0000 Subject: r9205: Generate more stub code for smb_raw ejs functions. (This used to be commit 3407490121344f34c69eeaf838de6ce9c4c7b1fc) --- source4/script/build_smb_interfaces.pl | 109 ++++++++++++++++++++------------- 1 file changed, 65 insertions(+), 44 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index e06f05b25d..990151b2c8 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -57,6 +57,9 @@ sub flatten_structs($) { # Generate implementation # +my $basename = basename($file, ".h"); +stat "libcli/gen_raw" || mkdir("libcli/gen_raw") || die("mkdir"); + open(FILE, ">libcli/gen_raw/ejs_${basename}.c"); print FILE "/* EJS wrapper functions auto-generated by build_smb_interfaces.pl */\n\n"; @@ -74,9 +77,38 @@ foreach my $s (@newheader) { # Top level struct - print FILE "static NTSTATUS ejs_$s->{TYPE_DEFINED}(int eid, int argc, struct MprVar **argv)\n"; + print FILE "static int ejs_$s->{TYPE_DEFINED}(int eid, int argc, struct MprVar **argv)\n"; print FILE "{\n"; - print FILE "\treturn NT_STATUS_OK;\n"; + print FILE "\tstruct $s->{TYPE_DEFINED} params;\n"; + print FILE "\tstruct smbcli_tree *tree;\n"; + print FILE "\tNTSTATUS result;\n\n"; + + print FILE "\tif (argc != 1 || argv[0]->type != MPR_TYPE_OBJECT) {\n"; + print FILE "\t\tejsSetErrorMsg(eid, \"invalid arguments\");\n"; + print FILE "\t\treturn -1;\n"; + print FILE "\t}\n\n"; + + foreach my $field (@{$s->{FIELDS}}) { + next if $field->{NAME} eq "out"; + print FILE "\t// pull params.$field->{NAME}\n"; + } + + my $fn = $s->{TYPE_DEFINED}; + $fn =~ s/^smb_/smb_raw_/; + + print FILE "\n\tresult = $fn(tree, ¶ms);\n\n"; + + foreach my $field (@{$s->{FIELDS}}) { + next if $field->{NAME} eq "in"; + print FILE "\t// push params.$field->{NAME}\n"; + } + + print FILE "\n\tmpr_Return(eid, mprNTSTATUS(result));\n\n"; + print FILE "\tif (NT_STATUS_EQUAL(status, NT_STATUS_INTERNAL_ERROR)) {\n"; + print FILE "\t\treturn -1;\n"; + print FILE "\t}\n\n"; + print FILE "\treturn 0;\n"; + print FILE "}\n\n"; } else { @@ -85,9 +117,38 @@ foreach my $s (@newheader) { foreach my $arm (@{$s->{FIELDS}}) { - print FILE "static NTSTATUS ejs_$s->{TYPE_DEFINED}_$arm->{NAME}(int eid, int argc, struct MprVar **argv)\n"; + print FILE "static int ejs_$s->{TYPE_DEFINED}_$arm->{NAME}(int eid, int argc, struct MprVar **argv)\n"; print FILE "{\n"; - print FILE "\treturn NT_STATUS_OK;\n"; + print FILE "\tunion $s->{TYPE_DEFINED} params;\n"; + print FILE "\tstruct smbcli_tree *tree;\n"; + print FILE "\tNTSTATUS result;\n\n"; + + print FILE "\tif (argc != 1 || argv[0]->type != MPR_TYPE_OBJECT) {\n"; + print FILE "\t\tejsSetErrorMsg(eid, \"invalid arguments\");\n"; + print FILE "\t\treturn -1;\n"; + print FILE "\t}\n\n"; + + foreach my $field (@{$arm->{FIELDS}}) { + next if $field->{NAME} eq "out"; + print FILE "\t// pull params.$arm->{NAME}.$field->{NAME}\n"; + } + + my $fn = $s->{TYPE_DEFINED}; + $fn =~ s/^smb_/smb_raw_/; + + print FILE "\n\tresult = $fn(tree, ¶ms);\n\n"; + + foreach my $field (@{$arm->{FIELDS}}) { + next if $field->{NAME} eq "in"; + print FILE "\t// push params.$arm->{NAME}.$field->{NAME}\n"; + } + + print FILE "\n\tmpr_Return(eid, mprNTSTATUS(result));\n\n"; + print FILE "\tif (NT_STATUS_EQUAL(status, NT_STATUS_INTERNAL_ERROR)) {\n"; + print FILE "\t\treturn -1;\n"; + print FILE "\t}\n\n"; + print FILE "\treturn 0;\n"; + print FILE "}\n\n"; } } @@ -119,43 +180,3 @@ print FILE "}\n"; close(FILE); exit; - -foreach my $x (@{$header}) { - next, if $x->{STRUCT_NAME} eq ""; - - $raw_name = $x->{STRUCT_NAME}; - $raw_name =~ s/smb_/smb_raw_/; - - print FILE "static int ejs_$x->{STRUCT_NAME}(int eid, int argc, struct MprVar **argv)\n"; - print FILE "{\n"; - print FILE "\tstruct $x->{STRUCT_NAME} params;\n"; - print FILE "\tstruct smbcli_tree *tree;\n"; - print FILE "\tNTSTATUS result;\n\n"; - - $output = << "__HERE__"; - if (argc != 1 || argv[0]->type != MPR_TYPE_OBJECT) { - ejsSetErrorMsg(eid, "invalid arguments"); - return -1; - } - - tree = mprGetThisPtr(eid, "tree"); - - if (!tree) { - ejsSetErrorMsg(eid, "invalid tree"); - return -1; - } - -__HERE__ - - print FILE $output; - print FILE "\tresult = $raw_name(tree, ¶ms);\n\n"; - - print FILE "\tmpr_Return(eid, mprNTSTATUS(status));\n"; - print FILE "\tif (NT_STATUS_EQUAL(status, NT_STATUS_INTERNAL_ERROR)) {\n"; - print FILE "\t\treturn -1;\n"; - print FILE "\t}\n\n"; - print FILE "\treturn 0;\n"; - - print FILE "}\n\n"; -} - -- cgit From ac4c941b77a2204c6f2eb75f7a28d8fb708909da Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Mon, 8 Aug 2005 02:19:35 +0000 Subject: r9207: Start generating ejs_push/pull calls for structure elements. (This used to be commit 8ff27a1effd2050733916569190264e347286c45) --- source4/script/build_smb_interfaces.pl | 48 ++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 17 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index 990151b2c8..8dfa52d0eb 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -41,7 +41,7 @@ sub flatten_structs($) { foreach my $name (@{$elt->{NAME}}) { my $new_elt = { %$elt }; $new_elt->{NAME} = $name; - $new_elt->{PARENT} = $s; +# $new_elt->{PARENT} = $s; push(@{$s->{FIELDS}}, flatten_structs($new_elt)); } } @@ -69,6 +69,32 @@ print FILE "#include \"lib/appweb/ejs/ejs.h\"\n"; print FILE "#include \"scripting/ejs/ejsrpc.h\"\n"; # TODO: remove this print FILE "\n"; +sub transfer_element($$$) { + my $dir = shift; + my $prefix = shift; + my $elt = shift; + + print FILE "\tejs_${dir}_$elt->{TYPE}(ejs, v, \"$prefix.$elt->{NAME}\")\n"; +} + +sub transfer_struct($$) { + my $dir = shift; + my $struct = shift; + + foreach my $field (@{$struct->{FIELDS}}) { + next if $dir eq "pull" and $field->{NAME} eq "out"; + next if $dir eq "push" and $field->{NAME} eq "in"; + + if ($field->{TYPE} eq "struct") { + foreach $subfield (@{$field->{FIELDS}}) { + transfer_element($dir, $field->{NAME}, $subfield); + } + } else { + transfer_element($dir, $struct->{NAME}, $field); + } + } +} + # Top level call functions foreach my $s (@newheader) { @@ -88,20 +114,14 @@ foreach my $s (@newheader) { print FILE "\t\treturn -1;\n"; print FILE "\t}\n\n"; - foreach my $field (@{$s->{FIELDS}}) { - next if $field->{NAME} eq "out"; - print FILE "\t// pull params.$field->{NAME}\n"; - } + transfer_struct("pull", $s); my $fn = $s->{TYPE_DEFINED}; $fn =~ s/^smb_/smb_raw_/; print FILE "\n\tresult = $fn(tree, ¶ms);\n\n"; - foreach my $field (@{$s->{FIELDS}}) { - next if $field->{NAME} eq "in"; - print FILE "\t// push params.$field->{NAME}\n"; - } + transfer_struct("push", $s); print FILE "\n\tmpr_Return(eid, mprNTSTATUS(result));\n\n"; print FILE "\tif (NT_STATUS_EQUAL(status, NT_STATUS_INTERNAL_ERROR)) {\n"; @@ -128,20 +148,14 @@ foreach my $s (@newheader) { print FILE "\t\treturn -1;\n"; print FILE "\t}\n\n"; - foreach my $field (@{$arm->{FIELDS}}) { - next if $field->{NAME} eq "out"; - print FILE "\t// pull params.$arm->{NAME}.$field->{NAME}\n"; - } + transfer_struct("pull", $arm); my $fn = $s->{TYPE_DEFINED}; $fn =~ s/^smb_/smb_raw_/; print FILE "\n\tresult = $fn(tree, ¶ms);\n\n"; - foreach my $field (@{$arm->{FIELDS}}) { - next if $field->{NAME} eq "in"; - print FILE "\t// push params.$arm->{NAME}.$field->{NAME}\n"; - } + transfer_struct("push", $arm); print FILE "\n\tmpr_Return(eid, mprNTSTATUS(result));\n\n"; print FILE "\tif (NT_STATUS_EQUAL(status, NT_STATUS_INTERNAL_ERROR)) {\n"; -- cgit From 4b93e377cd9809199487e20fa53d8a2c98ad32ea Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Tue, 9 Aug 2005 00:34:24 +0000 Subject: r9220: Start trying to get autogenerated code to compile. - Split out push/pull of top level elements into separate functions. - Remove _t from simple type names. (This used to be commit c419eef1c93afb51cf2fb42f87c0e5d29d2348ea) --- source4/script/build_smb_interfaces.pl | 55 +++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 11 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index 8dfa52d0eb..511d03e0d7 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -74,7 +74,10 @@ sub transfer_element($$$) { my $prefix = shift; my $elt = shift; - print FILE "\tejs_${dir}_$elt->{TYPE}(ejs, v, \"$prefix.$elt->{NAME}\")\n"; + $type = $elt->{TYPE}; + $type =~ s/_t$//; + + print FILE "\tejs_${dir}_$type(ejs, v, \"$prefix.$elt->{NAME}\")\n"; } sub transfer_struct($$) { @@ -101,29 +104,44 @@ foreach my $s (@newheader) { if ($s->{TYPE} eq "struct") { - # Top level struct + # Push/pull top level struct + + print FILE "NTSTATUS ejs_pull_$s->{TYPE_DEFINED}(struct ejs_rpc *ejs, struct MprVar *v, struct $s->{TYPE_DEFINED} *r)\n"; + print FILE "{\n"; + print FILE "\treturn NT_STATUS_OK;\n"; + print FILE "}\n\n"; + + print FILE "NTSTATUS ejs_push_$s->{TYPE_DEFINED}(struct ejs_rpc *ejs, struct MprVar *v, const struct $s->{TYPE_DEFINED} *r)\n"; + print FILE "{\n"; + print FILE "\treturn NT_STATUS_OK;\n"; + print FILE "}\n\n"; + + # Top level ejs function print FILE "static int ejs_$s->{TYPE_DEFINED}(int eid, int argc, struct MprVar **argv)\n"; print FILE "{\n"; print FILE "\tstruct $s->{TYPE_DEFINED} params;\n"; print FILE "\tstruct smbcli_tree *tree;\n"; - print FILE "\tNTSTATUS result;\n\n"; + print FILE "\tNTSTATUS status;\n\n"; print FILE "\tif (argc != 1 || argv[0]->type != MPR_TYPE_OBJECT) {\n"; print FILE "\t\tejsSetErrorMsg(eid, \"invalid arguments\");\n"; print FILE "\t\treturn -1;\n"; print FILE "\t}\n\n"; - transfer_struct("pull", $s); + print FILE "\tstatus = ejs_pull_$s->{TYPE_DEFINED}(ejs, io, ptr);\n"; + print FILE "\tif (!NT_STATUS_IS_OK(status)) {\n"; + print FILE "\t\treturn -1;\n"; + print FILE "\t}\n\n"; my $fn = $s->{TYPE_DEFINED}; $fn =~ s/^smb_/smb_raw_/; - print FILE "\n\tresult = $fn(tree, ¶ms);\n\n"; + print FILE "\tresult = $fn(tree, ¶ms);\n\n"; - transfer_struct("push", $s); + print FILE "\tstatus = ejs_push_$s->{TYPE_DEFINED}(ejs, io, ptr);\n\n"; - print FILE "\n\tmpr_Return(eid, mprNTSTATUS(result));\n\n"; + print FILE "\tmpr_Return(eid, mprNTSTATUS(result));\n\n"; print FILE "\tif (NT_STATUS_EQUAL(status, NT_STATUS_INTERNAL_ERROR)) {\n"; print FILE "\t\treturn -1;\n"; print FILE "\t}\n\n"; @@ -137,6 +155,18 @@ foreach my $s (@newheader) { foreach my $arm (@{$s->{FIELDS}}) { + # Push/pull union arm + + print FILE "NTSTATUS ejs_pull_$s->{TYPE_DEFINED}_$arm->{NAME}(struct ejs_rpc *ejs, struct MprVar *v, struct $s->{TYPE_DEFINED}_$arm->{NAME} *r)\n"; + print FILE "{\n"; + print FILE "\treturn NT_STATUS_OK;\n"; + print FILE "}\n\n"; + + print FILE "NTSTATUS ejs_push_$s->{TYPE_DEFINED}_$arm->{NAME}(struct ejs_rpc *ejs, struct MprVar *v, const struct $s->{TYPE_DEFINED}_$arm->{NAME} *r)\n"; + print FILE "{\n"; + print FILE "\treturn NT_STATUS_OK;\n"; + print FILE "}\n\n"; + print FILE "static int ejs_$s->{TYPE_DEFINED}_$arm->{NAME}(int eid, int argc, struct MprVar **argv)\n"; print FILE "{\n"; print FILE "\tunion $s->{TYPE_DEFINED} params;\n"; @@ -148,16 +178,19 @@ foreach my $s (@newheader) { print FILE "\t\treturn -1;\n"; print FILE "\t}\n\n"; - transfer_struct("pull", $arm); + print FILE "\tstatus = ejs_pull_$s->{TYPE_DEFINED}_$arm->{NAME}(ejs, io, ptr);\n"; + print FILE "\tif (!NT_STATUS_IS_OK(status)) {\n"; + print FILE "\t\treturn -1;\n"; + print FILE "\t}\n\n"; my $fn = $s->{TYPE_DEFINED}; $fn =~ s/^smb_/smb_raw_/; - print FILE "\n\tresult = $fn(tree, ¶ms);\n\n"; + print FILE "\tresult = $fn(tree, ¶ms);\n\n"; - transfer_struct("push", $arm); + print FILE "\tstatus = ejs_push_$s->{TYPE_DEFINED}_$arm->{NAME}(ejs, io, ptr);\n\n"; - print FILE "\n\tmpr_Return(eid, mprNTSTATUS(result));\n\n"; + print FILE "\tmpr_Return(eid, mprNTSTATUS(result));\n\n"; print FILE "\tif (NT_STATUS_EQUAL(status, NT_STATUS_INTERNAL_ERROR)) {\n"; print FILE "\t\treturn -1;\n"; print FILE "\t}\n\n"; -- cgit From a1ca0889010d5e8093ce788de6001baa7a368ba1 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Sat, 13 Aug 2005 01:42:14 +0000 Subject: r9292: More compiles fixes for autogenerated smb_interfaces ejs wrappers. Add some code to try and work out whether a smb_interface requires a TALLOC_CTX in the function signature. I'm not sure whether this is going to work as the raw api is a bit inconsistent I think. (This used to be commit 13a101653ea7bba3b8b1f74637d981eb004484cc) --- source4/script/build_smb_interfaces.pl | 109 ++++++++++++++++++++++++++++++--- 1 file changed, 101 insertions(+), 8 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index 511d03e0d7..e27e3876c6 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -65,6 +65,7 @@ open(FILE, ">libcli/gen_raw/ejs_${basename}.c"); print FILE "/* EJS wrapper functions auto-generated by build_smb_interfaces.pl */\n\n"; print FILE "#include \"includes.h\"\n"; +print FILE "#include \"scripting/ejs/smbcalls.h\"\n"; print FILE "#include \"lib/appweb/ejs/ejs.h\"\n"; print FILE "#include \"scripting/ejs/ejsrpc.h\"\n"; # TODO: remove this print FILE "\n"; @@ -98,6 +99,52 @@ sub transfer_struct($$) { } } +# Should a structure definition require a memory context to return +# data? + +sub struct_need_mem_ctx($) { + my $s = shift; + + for my $f (@{$s->{FIELDS}}) { + if ($f->{NAME} eq "out") { + + # Look for pointers + + for my $e (@{$f->{FIELDS}}) { + if (defined($e->{POINTERS})) { + return 1; + } + } + return 0; + } + } + + # No 'out' structure found so we can't return anything + + return 0; +} + +# Does the top-level structure definition require a memory context to +# return data? + +sub need_mem_ctx($) { + my $s = shift; + + # Check for presence of an 'out' nested structure that contains a + # pointer. + + if ($s->{TYPE} eq "struct") { + return struct_need_mem_ctx($s); + } else { + foreach my $ss (@{$s->{FIELDS}}) { + return 1 if struct_need_mem_ctx($ss); + } + return 0; + } + + return 1; +} + # Top level call functions foreach my $s (@newheader) { @@ -120,15 +167,34 @@ foreach my $s (@newheader) { print FILE "static int ejs_$s->{TYPE_DEFINED}(int eid, int argc, struct MprVar **argv)\n"; print FILE "{\n"; + print FILE "\tstruct MprVar *io;\n"; + print FILE "\tstruct ejs_rpc *ejs;\n"; print FILE "\tstruct $s->{TYPE_DEFINED} params;\n"; print FILE "\tstruct smbcli_tree *tree;\n"; - print FILE "\tNTSTATUS status;\n\n"; + print FILE "\tNTSTATUS status;\n"; + print FILE "\tvoid *ptr;\n\n"; print FILE "\tif (argc != 1 || argv[0]->type != MPR_TYPE_OBJECT) {\n"; print FILE "\t\tejsSetErrorMsg(eid, \"invalid arguments\");\n"; print FILE "\t\treturn -1;\n"; print FILE "\t}\n\n"; + print FILE "\tio = argv[0];\n\n"; + + print FILE "\tejs = talloc(mprMemCtx(), struct ejs_rpc);\n"; + print FILE "\tif (ejs == NULL) {\n"; + print FILE "\t\tstatus = NT_STATUS_NO_MEMORY;\n"; + print FILE "\t\treturn -1;\n"; + print FILE "\t}\n\n"; + + print FILE "\tptr = talloc_zero_size(ejs, sizeof(struct $s->{TYPE_DEFINED}));\n"; + print FILE "\tif (ptr == NULL) {\n"; + print FILE "\t\tstatus = NT_STATUS_NO_MEMORY;\n"; + print FILE "\t\treturn -1;\n"; + print FILE "\t}\n\n"; + + print FILE "\tejs->eid = eid;\n\n"; + print FILE "\tstatus = ejs_pull_$s->{TYPE_DEFINED}(ejs, io, ptr);\n"; print FILE "\tif (!NT_STATUS_IS_OK(status)) {\n"; print FILE "\t\treturn -1;\n"; @@ -137,11 +203,15 @@ foreach my $s (@newheader) { my $fn = $s->{TYPE_DEFINED}; $fn =~ s/^smb_/smb_raw_/; - print FILE "\tresult = $fn(tree, ¶ms);\n\n"; + if (need_mem_ctx($s)) { + print FILE "\tstatus = $fn(tree, mprMemCtx(), ¶ms);\n\n"; + } else { + print FILE "\tstatus = $fn(tree, ¶ms);\n\n"; + } print FILE "\tstatus = ejs_push_$s->{TYPE_DEFINED}(ejs, io, ptr);\n\n"; - print FILE "\tmpr_Return(eid, mprNTSTATUS(result));\n\n"; + print FILE "\tmpr_Return(eid, mprNTSTATUS(status));\n\n"; print FILE "\tif (NT_STATUS_EQUAL(status, NT_STATUS_INTERNAL_ERROR)) {\n"; print FILE "\t\treturn -1;\n"; print FILE "\t}\n\n"; @@ -157,27 +227,46 @@ foreach my $s (@newheader) { # Push/pull union arm - print FILE "NTSTATUS ejs_pull_$s->{TYPE_DEFINED}_$arm->{NAME}(struct ejs_rpc *ejs, struct MprVar *v, struct $s->{TYPE_DEFINED}_$arm->{NAME} *r)\n"; + print FILE "NTSTATUS ejs_pull_$s->{TYPE_DEFINED}_$arm->{NAME}(struct ejs_rpc *ejs, struct MprVar *v, union $s->{TYPE_DEFINED} *r)\n"; print FILE "{\n"; print FILE "\treturn NT_STATUS_OK;\n"; print FILE "}\n\n"; - print FILE "NTSTATUS ejs_push_$s->{TYPE_DEFINED}_$arm->{NAME}(struct ejs_rpc *ejs, struct MprVar *v, const struct $s->{TYPE_DEFINED}_$arm->{NAME} *r)\n"; + print FILE "NTSTATUS ejs_push_$s->{TYPE_DEFINED}_$arm->{NAME}(struct ejs_rpc *ejs, struct MprVar *v, const union $s->{TYPE_DEFINED} *r)\n"; print FILE "{\n"; print FILE "\treturn NT_STATUS_OK;\n"; print FILE "}\n\n"; print FILE "static int ejs_$s->{TYPE_DEFINED}_$arm->{NAME}(int eid, int argc, struct MprVar **argv)\n"; print FILE "{\n"; + print FILE "\tstruct MprVar *io;\n"; + print FILE "\tstruct ejs_rpc *ejs;\n"; print FILE "\tunion $s->{TYPE_DEFINED} params;\n"; print FILE "\tstruct smbcli_tree *tree;\n"; - print FILE "\tNTSTATUS result;\n\n"; + print FILE "\tNTSTATUS status;\n"; + print FILE "\tvoid *ptr;\n\n"; print FILE "\tif (argc != 1 || argv[0]->type != MPR_TYPE_OBJECT) {\n"; print FILE "\t\tejsSetErrorMsg(eid, \"invalid arguments\");\n"; print FILE "\t\treturn -1;\n"; print FILE "\t}\n\n"; + print FILE "\tio = argv[0];\n\n"; + + print FILE "\tejs = talloc(mprMemCtx(), struct ejs_rpc);\n"; + print FILE "\tif (ejs == NULL) {\n"; + print FILE "\t\tstatus = NT_STATUS_NO_MEMORY;\n"; + print FILE "\t\treturn -1;\n"; + print FILE "\t}\n\n"; + + print FILE "\tptr = talloc_zero_size(ejs, sizeof(union $s->{TYPE_DEFINED}));\n"; + print FILE "\tif (ptr == NULL) {\n"; + print FILE "\t\tstatus = NT_STATUS_NO_MEMORY;\n"; + print FILE "\t\treturn -1;\n"; + print FILE "\t}\n\n"; + + print FILE "\tejs->eid = eid;\n\n"; + print FILE "\tstatus = ejs_pull_$s->{TYPE_DEFINED}_$arm->{NAME}(ejs, io, ptr);\n"; print FILE "\tif (!NT_STATUS_IS_OK(status)) {\n"; print FILE "\t\treturn -1;\n"; @@ -186,11 +275,15 @@ foreach my $s (@newheader) { my $fn = $s->{TYPE_DEFINED}; $fn =~ s/^smb_/smb_raw_/; - print FILE "\tresult = $fn(tree, ¶ms);\n\n"; + if (need_mem_ctx($s)) { + print FILE "\tstatus = $fn(tree, mprMemCtx(), ¶ms);\n\n"; + } else { + print FILE "\tstatus = $fn(tree, ¶ms);\n\n"; + } print FILE "\tstatus = ejs_push_$s->{TYPE_DEFINED}_$arm->{NAME}(ejs, io, ptr);\n\n"; - print FILE "\tmpr_Return(eid, mprNTSTATUS(result));\n\n"; + print FILE "\tmpr_Return(eid, mprNTSTATUS(status));\n\n"; print FILE "\tif (NT_STATUS_EQUAL(status, NT_STATUS_INTERNAL_ERROR)) {\n"; print FILE "\t\treturn -1;\n"; print FILE "\t}\n\n"; -- cgit From c1f165d6e9a894bde0a73dae6b47fc01126bf00a Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Sat, 13 Aug 2005 02:40:02 +0000 Subject: r9295: Tridge had some good suggestions for simplifying the smb_interfaces ejs code. I will try and get just the push/pull functions working rather than getting in a mess with trying to do everything at once. (This used to be commit a7504ebf9557796bd50907620115f8367ea586f0) --- source4/script/build_smb_interfaces.pl | 180 --------------------------------- 1 file changed, 180 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index e27e3876c6..7a3b6aab49 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -99,52 +99,6 @@ sub transfer_struct($$) { } } -# Should a structure definition require a memory context to return -# data? - -sub struct_need_mem_ctx($) { - my $s = shift; - - for my $f (@{$s->{FIELDS}}) { - if ($f->{NAME} eq "out") { - - # Look for pointers - - for my $e (@{$f->{FIELDS}}) { - if (defined($e->{POINTERS})) { - return 1; - } - } - return 0; - } - } - - # No 'out' structure found so we can't return anything - - return 0; -} - -# Does the top-level structure definition require a memory context to -# return data? - -sub need_mem_ctx($) { - my $s = shift; - - # Check for presence of an 'out' nested structure that contains a - # pointer. - - if ($s->{TYPE} eq "struct") { - return struct_need_mem_ctx($s); - } else { - foreach my $ss (@{$s->{FIELDS}}) { - return 1 if struct_need_mem_ctx($ss); - } - return 0; - } - - return 1; -} - # Top level call functions foreach my $s (@newheader) { @@ -163,62 +117,6 @@ foreach my $s (@newheader) { print FILE "\treturn NT_STATUS_OK;\n"; print FILE "}\n\n"; - # Top level ejs function - - print FILE "static int ejs_$s->{TYPE_DEFINED}(int eid, int argc, struct MprVar **argv)\n"; - print FILE "{\n"; - print FILE "\tstruct MprVar *io;\n"; - print FILE "\tstruct ejs_rpc *ejs;\n"; - print FILE "\tstruct $s->{TYPE_DEFINED} params;\n"; - print FILE "\tstruct smbcli_tree *tree;\n"; - print FILE "\tNTSTATUS status;\n"; - print FILE "\tvoid *ptr;\n\n"; - - print FILE "\tif (argc != 1 || argv[0]->type != MPR_TYPE_OBJECT) {\n"; - print FILE "\t\tejsSetErrorMsg(eid, \"invalid arguments\");\n"; - print FILE "\t\treturn -1;\n"; - print FILE "\t}\n\n"; - - print FILE "\tio = argv[0];\n\n"; - - print FILE "\tejs = talloc(mprMemCtx(), struct ejs_rpc);\n"; - print FILE "\tif (ejs == NULL) {\n"; - print FILE "\t\tstatus = NT_STATUS_NO_MEMORY;\n"; - print FILE "\t\treturn -1;\n"; - print FILE "\t}\n\n"; - - print FILE "\tptr = talloc_zero_size(ejs, sizeof(struct $s->{TYPE_DEFINED}));\n"; - print FILE "\tif (ptr == NULL) {\n"; - print FILE "\t\tstatus = NT_STATUS_NO_MEMORY;\n"; - print FILE "\t\treturn -1;\n"; - print FILE "\t}\n\n"; - - print FILE "\tejs->eid = eid;\n\n"; - - print FILE "\tstatus = ejs_pull_$s->{TYPE_DEFINED}(ejs, io, ptr);\n"; - print FILE "\tif (!NT_STATUS_IS_OK(status)) {\n"; - print FILE "\t\treturn -1;\n"; - print FILE "\t}\n\n"; - - my $fn = $s->{TYPE_DEFINED}; - $fn =~ s/^smb_/smb_raw_/; - - if (need_mem_ctx($s)) { - print FILE "\tstatus = $fn(tree, mprMemCtx(), ¶ms);\n\n"; - } else { - print FILE "\tstatus = $fn(tree, ¶ms);\n\n"; - } - - print FILE "\tstatus = ejs_push_$s->{TYPE_DEFINED}(ejs, io, ptr);\n\n"; - - print FILE "\tmpr_Return(eid, mprNTSTATUS(status));\n\n"; - print FILE "\tif (NT_STATUS_EQUAL(status, NT_STATUS_INTERNAL_ERROR)) {\n"; - print FILE "\t\treturn -1;\n"; - print FILE "\t}\n\n"; - print FILE "\treturn 0;\n"; - - print FILE "}\n\n"; - } else { # Top level union @@ -237,86 +135,8 @@ foreach my $s (@newheader) { print FILE "\treturn NT_STATUS_OK;\n"; print FILE "}\n\n"; - print FILE "static int ejs_$s->{TYPE_DEFINED}_$arm->{NAME}(int eid, int argc, struct MprVar **argv)\n"; - print FILE "{\n"; - print FILE "\tstruct MprVar *io;\n"; - print FILE "\tstruct ejs_rpc *ejs;\n"; - print FILE "\tunion $s->{TYPE_DEFINED} params;\n"; - print FILE "\tstruct smbcli_tree *tree;\n"; - print FILE "\tNTSTATUS status;\n"; - print FILE "\tvoid *ptr;\n\n"; - - print FILE "\tif (argc != 1 || argv[0]->type != MPR_TYPE_OBJECT) {\n"; - print FILE "\t\tejsSetErrorMsg(eid, \"invalid arguments\");\n"; - print FILE "\t\treturn -1;\n"; - print FILE "\t}\n\n"; - - print FILE "\tio = argv[0];\n\n"; - - print FILE "\tejs = talloc(mprMemCtx(), struct ejs_rpc);\n"; - print FILE "\tif (ejs == NULL) {\n"; - print FILE "\t\tstatus = NT_STATUS_NO_MEMORY;\n"; - print FILE "\t\treturn -1;\n"; - print FILE "\t}\n\n"; - - print FILE "\tptr = talloc_zero_size(ejs, sizeof(union $s->{TYPE_DEFINED}));\n"; - print FILE "\tif (ptr == NULL) {\n"; - print FILE "\t\tstatus = NT_STATUS_NO_MEMORY;\n"; - print FILE "\t\treturn -1;\n"; - print FILE "\t}\n\n"; - - print FILE "\tejs->eid = eid;\n\n"; - - print FILE "\tstatus = ejs_pull_$s->{TYPE_DEFINED}_$arm->{NAME}(ejs, io, ptr);\n"; - print FILE "\tif (!NT_STATUS_IS_OK(status)) {\n"; - print FILE "\t\treturn -1;\n"; - print FILE "\t}\n\n"; - - my $fn = $s->{TYPE_DEFINED}; - $fn =~ s/^smb_/smb_raw_/; - - if (need_mem_ctx($s)) { - print FILE "\tstatus = $fn(tree, mprMemCtx(), ¶ms);\n\n"; - } else { - print FILE "\tstatus = $fn(tree, ¶ms);\n\n"; - } - - print FILE "\tstatus = ejs_push_$s->{TYPE_DEFINED}_$arm->{NAME}(ejs, io, ptr);\n\n"; - - print FILE "\tmpr_Return(eid, mprNTSTATUS(status));\n\n"; - print FILE "\tif (NT_STATUS_EQUAL(status, NT_STATUS_INTERNAL_ERROR)) {\n"; - print FILE "\t\treturn -1;\n"; - print FILE "\t}\n\n"; - print FILE "\treturn 0;\n"; - - print FILE "}\n\n"; - } - } -} - -# Module initialisation - -print FILE "static int ejs_${basename}_init(int eid, int argc, struct MprVar **argv)\n"; -print FILE "{\n"; -print FILE "\tstruct MprVar *obj = mprInitObject(eid, \"${basename}\", argc, argv);\n\n"; - -foreach my $s (@newheader) { - if ($s->{TYPE} eq "struct") { - print FILE "\tmprSetCFunction(obj, \"$s->{TYPE_DEFINED}\", ejs_$s->{TYPE_DEFINED});\n"; - } else { - foreach my $arm (@{$s->{FIELDS}}) { - print FILE "\tmprSetCFunction(obj, \"$s->{TYPE_DEFINED}_$arm->{NAME}\", ejs_$s->{TYPE_DEFINED});\n"; } } } -print FILE "}\n\n"; - -print FILE "NTSTATUS ejs_init_${basename}(void)\n"; -print FILE "{\n"; -print FILE "\treturn smbcalls_register_ejs(\"${basename}_init\", ejs_${basename}_init);\n"; -print FILE "}\n"; - close(FILE); - -exit; -- cgit From ca1b2eae776d34ad2460cf467ba951c8bb85433c Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Sat, 13 Aug 2005 02:47:14 +0000 Subject: r9296: Reinstate generation of push/pull functions for each field in a struct or union. (This used to be commit 72420f24e654661c8792bd7d0eae610ad182d529) --- source4/script/build_smb_interfaces.pl | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index 7a3b6aab49..1c93385a6d 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -109,12 +109,18 @@ foreach my $s (@newheader) { print FILE "NTSTATUS ejs_pull_$s->{TYPE_DEFINED}(struct ejs_rpc *ejs, struct MprVar *v, struct $s->{TYPE_DEFINED} *r)\n"; print FILE "{\n"; - print FILE "\treturn NT_STATUS_OK;\n"; + + transfer_struct("pull", $s); + + print FILE "\n\treturn NT_STATUS_OK;\n"; print FILE "}\n\n"; print FILE "NTSTATUS ejs_push_$s->{TYPE_DEFINED}(struct ejs_rpc *ejs, struct MprVar *v, const struct $s->{TYPE_DEFINED} *r)\n"; print FILE "{\n"; - print FILE "\treturn NT_STATUS_OK;\n"; + + transfer_struct("push", $s); + + print FILE "\n\treturn NT_STATUS_OK;\n"; print FILE "}\n\n"; } else { @@ -127,12 +133,18 @@ foreach my $s (@newheader) { print FILE "NTSTATUS ejs_pull_$s->{TYPE_DEFINED}_$arm->{NAME}(struct ejs_rpc *ejs, struct MprVar *v, union $s->{TYPE_DEFINED} *r)\n"; print FILE "{\n"; - print FILE "\treturn NT_STATUS_OK;\n"; + + transfer_struct("pull", $arm); + + print FILE "\n\treturn NT_STATUS_OK;\n"; print FILE "}\n\n"; print FILE "NTSTATUS ejs_push_$s->{TYPE_DEFINED}_$arm->{NAME}(struct ejs_rpc *ejs, struct MprVar *v, const union $s->{TYPE_DEFINED} *r)\n"; print FILE "{\n"; - print FILE "\treturn NT_STATUS_OK;\n"; + + transfer_struct("push", $arm); + + print FILE "\n\treturn NT_STATUS_OK;\n"; print FILE "}\n\n"; } -- cgit From c04b6ada5f1a7ce6522277e1a8ad27dfd216fb12 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Sat, 13 Aug 2005 02:59:56 +0000 Subject: r9297: Add a NDR_CHECK() around each ejs push/pull. Some experimentation with the top level function calls. (This used to be commit e8d53d15e4371bc266a691c3c3c82675373ba7f4) --- source4/script/build_smb_interfaces.pl | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'source4/script/build_smb_interfaces.pl') diff --git a/source4/script/build_smb_interfaces.pl b/source4/script/build_smb_interfaces.pl index 1c93385a6d..5fac94ca6e 100755 --- a/source4/script/build_smb_interfaces.pl +++ b/source4/script/build_smb_interfaces.pl @@ -78,7 +78,7 @@ sub transfer_element($$$) { $type = $elt->{TYPE}; $type =~ s/_t$//; - print FILE "\tejs_${dir}_$type(ejs, v, \"$prefix.$elt->{NAME}\")\n"; + print FILE "\tNDR_CHECK(ejs_${dir}_$type(ejs, v, \"$prefix.$elt->{NAME}\"));\n"; } sub transfer_struct($$) { @@ -123,6 +123,13 @@ foreach my $s (@newheader) { print FILE "\n\treturn NT_STATUS_OK;\n"; print FILE "}\n\n"; + # Function call + + print FILE "static int ejs_$s->{TYPE_DEFINED}(int eid, int argc, struct MprVar **argv)\n"; + print FILE "{\n"; + print FILE "\treturn ejs_raw_call(eid, argc, argv, (ejs_pull_function_t)ejs_pull_$s->{TYPE_DEFINED}, (ejs_push_function_t)ejs_push_$s->{TYPE_DEFINED});\n"; + print FILE "}\n\n"; + } else { # Top level union -- cgit