summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
Diffstat (limited to 'source4')
-rwxr-xr-xsource4/script/build_smb_interfaces.pl61
1 files changed, 50 insertions, 11 deletions
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);