3 # Create ejs interfaces for structures in a C header file
8 my $basename = basename($file, ".h");
10 require smb_interfaces;
11 my $parser = new smb_interfaces;
12 $header = $parser->parse($file);
15 #print Dumper($header);
19 open(FILE, ">ejs_${basename}.h");
21 print FILE "/* header auto-generated by build_smb_interfaces.pl */\n\n";
23 print FILE "#ifndef _ejs_${basename}_h\n";
24 print FILE "#define _ejs_${basename}_h\n\n";
29 return defined($obj->{STRUCT_NAME}) ? $obj->{STRUCT_NAME} : $obj->{UNION_NAME};
35 my $name = struct_name($obj);
37 print FILE "NTSTATUS ejs_push_$name(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n";
38 print FILE "NTSTATUS ejs_pull_$name(struct ejs_rpc *, struct MprVar *, const char *, const uint32_t *);\n";
44 my $name = struct_name($obj);
46 print FILE "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n";
49 print FILE "\tNDR_CHECK(ejs_push_struct_start(ejs, &v, \"output\"));\n";
51 print FILE "\n\treturn NT_STATUS_OK;\n";
54 print FILE "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const uint32_t *r)\n";
57 print FILE "\tNDR_CHECK(ejs_pull_struct_start(ejs, &v, \"input\"));\n";
59 print FILE "\treturn NT_STATUS_OK;\n";
63 foreach my $x (@{$header}) {
65 # Prototypes for top level structures and unions
69 # Prototypes for non-anonymous nested structures and unions
71 foreach my $e1 (@{$x->{DATA}}) {
72 foreach my $e2 (@{$e1->{DATA}}) {
73 if (defined($e2->{STRUCT_NAME}) or defined($e2->{UNION_NAME})) {
80 print FILE "#endif\n";
86 open(FILE, ">ejs_${basename}.c");
88 print FILE "/* EJS wrapper functions auto-generated by build_smb_interfaces.pl */\n\n";
92 foreach my $x (@{$header}) {
93 next, if $x->{STRUCT_NAME} eq "";
94 print FILE "static int ejs_$x->{STRUCT_NAME}(int eid, int argc, struct MprVar **argv)\n";
96 print FILE "\tejsSetErrorMsg(eid, \"Not implemented\");\n";
97 print FILE "\treturn -1;\n";
101 # Module initialisation
103 print FILE "static int ejs_${basename}_init(int eid, int argc, struct MprVar **argv)\n";
105 print FILE "\tstruct MprVar *obj = mprInitObject(eid, \"${basename}\", argc, argtv);\n\n";
107 foreach my $x (@{$header}) {
108 next, if $x->{STRUCT_NAME} eq "";
109 print FILE "\tmprSetCFunction(obj, \"$x->{STRUCT_NAME}\", ejs_$x->{STRUCT_NAME});\n";
114 print FILE "NTSTATUS ejs_init_${basename}(void)\n";
116 print FILE "\treturn smbcalls_register_ejs(\"${basename}_init\", ejs_${basename}_init);\n";