From cd88764ba16bc35f0209fbdf1a975f10bd3eb9ac Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 9 Jul 2005 11:48:59 +0000 Subject: r8260: added an init based registration system for the generated ejs rpc code, so adding a new pipe only involves changes to librpc/config.mk (This used to be commit 0e54fa446665f380e9c46723a6e2be5a08b8d51c) --- source4/scripting/ejs/ejsrpc.h | 7 +++++ source4/scripting/ejs/smbcalls_rpc.c | 58 +++++++++++++++++++++++++----------- 2 files changed, 47 insertions(+), 18 deletions(-) (limited to 'source4/scripting') diff --git a/source4/scripting/ejs/ejsrpc.h b/source4/scripting/ejs/ejsrpc.h index c45b66d385..44b4b7dd96 100644 --- a/source4/scripting/ejs/ejsrpc.h +++ b/source4/scripting/ejs/ejsrpc.h @@ -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); diff --git a/source4/scripting/ejs/smbcalls_rpc.c b/source4/scripting/ejs/smbcalls_rpc.c index 3c3b8515f1..12b0d95e8e 100644 --- a/source4/scripting/ejs/smbcalls_rpc.c +++ b/source4/scripting/ejs/smbcalls_rpc.c @@ -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); } + + -- cgit