r8260: added an init based registration system for the generated ejs rpc code, so
authorAndrew Tridgell <tridge@samba.org>
Sat, 9 Jul 2005 11:48:59 +0000 (11:48 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:19:27 +0000 (13:19 -0500)
adding a new pipe only involves changes to librpc/config.mk
(This used to be commit 0e54fa446665f380e9c46723a6e2be5a08b8d51c)

source4/build/pidl/ejs.pm
source4/librpc/config.mk
source4/scripting/ejs/ejsrpc.h
source4/scripting/ejs/smbcalls_rpc.c

index f67379526f1877798d54620e4408993199f98d8c..8420f8fa87a40b90092a3d5880ea8babffc85070 100644 (file)
@@ -674,13 +674,16 @@ sub EjsInterface($)
 
        pidl "void setup_ejs_$name(void)";
        pidl "{";
+       indent;
        foreach (@fns) {
                pidl "ejsDefineCFunction(-1, \"dcerpc_$_\", ejs_$_, NULL, MPR_VAR_SCRIPT_HANDLE);";
        }
+       deindent;
        pidl "}\n";
 
        pidl "void setup_ejs_constants_$name(int eid)";
        pidl "{";
+       indent;
        foreach my $v (keys %constants) {
                my $value = $constants{$v};
                if (substr($value, 0, 1) eq "\"") {
@@ -689,6 +692,14 @@ sub EjsInterface($)
                        pidl "ejs_set_constant_int(eid, \"$v\", $value);";
                }
        }
+       deindent;
+       pidl "}\n";
+
+       pidl "NTSTATUS ejs_init_$name(void)";
+       pidl "{";
+       indent;
+       pidl "return smbcalls_register_ejs(\"$name\", setup_ejs_$name, setup_ejs_constants_$name);";
+       deindent;
        pidl "}";
 }
 
index c7d45bcf4b5813ba1882821418d5eaaed1300346..b0af15771478c6db3afa151ae0ac4e012763e461 100644 (file)
@@ -552,26 +552,31 @@ REQUIRED_SUBSYSTEMS = NDR_RAW RPC_RAW LIBSMB NDR_MISC NDR_DCERPC NDR_SCHANNEL ND
 ################################################
 
 [SUBSYSTEM::RPC_EJS_ECHO]
+INIT_FUNCTION = ejs_init_rpcecho
 OBJ_FILES = librpc/gen_ndr/ndr_echo_ejs.o
 REQUIRED_SUBSYSTEMS = RPC NDR_ECHO
 NOPROTO = YES
 
 [SUBSYSTEM::RPC_EJS_MISC]
+INIT_FUNCTION = ejs_init_misc
 OBJ_FILES = librpc/gen_ndr/ndr_misc_ejs.o
 REQUIRED_SUBSYSTEMS = RPC NDR_MISC
 NOPROTO = YES
 
 [SUBSYSTEM::RPC_EJS_SAMR]
+INIT_FUNCTION = ejs_init_samr
 OBJ_FILES = librpc/gen_ndr/ndr_samr_ejs.o
 REQUIRED_SUBSYSTEMS = RPC NDR_SAMR
 NOPROTO = YES
 
 [SUBSYSTEM::RPC_EJS_SECURITY]
+INIT_FUNCTION = ejs_init_security
 OBJ_FILES = librpc/gen_ndr/ndr_security_ejs.o
 REQUIRED_SUBSYSTEMS = RPC LIB_SECURITY_NDR
 NOPROTO = YES
 
 [SUBSYSTEM::RPC_EJS_LSA]
+INIT_FUNCTION = ejs_init_lsarpc
 OBJ_FILES = librpc/gen_ndr/ndr_lsa_ejs.o
 REQUIRED_SUBSYSTEMS = RPC NDR_LSA
 NOPROTO = YES
index c45b66d3851245b3f8c843b578e59c56a1f2ed74..44b4b7dd9653029b4a394b8d34e245a334cd11b1 100644 (file)
@@ -36,6 +36,13 @@ typedef NTSTATUS (*ejs_push_function_t)(struct ejs_rpc *, struct MprVar *, const
 NTSTATUS ejs_panic(struct ejs_rpc *ejs, const char *why);
 void ejs_set_switch(struct ejs_rpc *ejs, uint32_t switch_var);
 
+typedef void (*ejs_setup_t)(void);
+typedef void (*ejs_constants_t)(int);
+
+NTSTATUS smbcalls_register_ejs(const char *name, 
+                              ejs_setup_t setup,
+                              ejs_constants_t constants);
+
 int ejs_rpc_call(int eid, int argc, struct MprVar **argv, const char *callname,
                 ejs_pull_function_t ejs_pull, ejs_push_function_t ejs_push);
 
index 3c3b8515f11856666245921c7088b6494a8c56d3..12b0d95e8e52c19271ef7e2cf8bdde3cf70cdaef 100644 (file)
@@ -25,6 +25,7 @@
 #include "librpc/gen_ndr/ndr_echo.h"
 #include "lib/cmdline/popt_common.h"
 #include "scripting/ejs/ejsrpc.h"
+#include "dlinklist.h"
 
 /*
   connect to an rpc server
@@ -175,22 +176,46 @@ done:
 }
 
 
+/* a list of registered ejs rpc modules */
+static struct ejs_register {
+       struct ejs_register *next, *prev;
+       const char *name;
+       ejs_setup_t setup;
+       ejs_constants_t constants;
+} *ejs_registered;
+
+/*
+  register a generated ejs module
+*/
+ NTSTATUS smbcalls_register_ejs(const char *name, 
+                               ejs_setup_t setup,
+                               ejs_constants_t constants)
+{
+       struct ejs_register *r;
+       void *ctx = ejs_registered;
+       if (ctx == NULL) {
+               ctx = talloc_autofree_context();
+       }
+       r = talloc(ctx, struct ejs_register);
+       NT_STATUS_HAVE_NO_MEMORY(r);
+       r->name = name;
+       r->setup = setup;
+       r->constants = constants;
+       DLIST_ADD(ejs_registered, r);
+       return NT_STATUS_OK;
+}
+
 /*
   setup C functions that be called from ejs
 */
 void smb_setup_ejs_rpc(void)
 {
-       void setup_ejs_rpcecho(void);
-       void setup_ejs_samr(void);
-       void setup_ejs_misc(void);
-       void setup_ejs_security(void);
+       struct ejs_register *r;
 
        ejsDefineCFunction(-1, "rpc_connect", ejs_rpc_connect, NULL, MPR_VAR_SCRIPT_HANDLE);
-
-       setup_ejs_rpcecho();
-       setup_ejs_samr();
-       setup_ejs_misc();
-       setup_ejs_security();
+       for (r=ejs_registered;r;r=r->next) {
+               r->setup();
+       }
 }
 
 /*
@@ -198,18 +223,15 @@ void smb_setup_ejs_rpc(void)
 */
 void smb_setup_ejs_rpc_constants(int eid)
 {
+       struct ejs_register *r;
        struct MprVar v;
 
-       void setup_ejs_constants_rpcecho(int);
-       void setup_ejs_constants_samr(int);
-       void setup_ejs_constants_misc(int);
-       void setup_ejs_constants_security(int);
+       for (r=ejs_registered;r;r=r->next) {
+               r->constants(eid);
+       }
 
-       setup_ejs_constants_rpcecho(eid);
-       setup_ejs_constants_samr(eid);
-       setup_ejs_constants_misc(eid);
-       setup_ejs_constants_security(eid);
-       
        v = mprCreatePtrVar(NULL, "NULL");
        mprSetProperty(ejsGetGlobalObject(eid), "NULL", &v);
 }
+
+