diff options
-rw-r--r-- | source4/librpc/config.mk | 5 | ||||
-rw-r--r-- | source4/scripting/ejs/config.mk | 7 | ||||
-rw-r--r-- | source4/scripting/ejs/ejsrpc.c | 121 | ||||
-rw-r--r-- | source4/scripting/ejs/ejsrpc.h | 32 | ||||
-rw-r--r-- | source4/scripting/ejs/smbcalls_irpc.c | 2 | ||||
-rw-r--r-- | source4/scripting/ejs/smbcalls_rpc.c | 23 |
6 files changed, 160 insertions, 30 deletions
diff --git a/source4/librpc/config.mk b/source4/librpc/config.mk index 7c93ba9abb..bd7b788178 100644 --- a/source4/librpc/config.mk +++ b/source4/librpc/config.mk @@ -550,3 +550,8 @@ NOPROTO = YES REQUIRED_SUBSYSTEMS = NDR_RAW RPC_RAW LIBSMB NDR_MISC NDR_DCERPC NDR_SCHANNEL NDR_LSA NDR_NETLOGON NDR_SAMR NDR_UNIXINFO RPC_NDR_NETLOGON RPC_NDR_EPMAPPER # End SUBSYSTEM RPC ################################################ + +[SUBSYSTEM::RPC_EJS_ECHO] +OBJ_FILES = librpc/gen_ndr/ndr_echo_ejs.o +REQUIRED_SUBSYSTEMS = RPC NDR_ECHO +NOPROTO = YES diff --git a/source4/scripting/ejs/config.mk b/source4/scripting/ejs/config.mk index 0ce7f2df83..0c0caa9ef0 100644 --- a/source4/scripting/ejs/config.mk +++ b/source4/scripting/ejs/config.mk @@ -2,9 +2,8 @@ # Start LIBRARY EJSRPC [SUBSYSTEM::EJSRPC] OBJ_FILES = \ - scripting/ejs/ejsrpc.o \ - scripting/ejs/ejs_echo.o -REQUIRED_SUBSYSTEMS = RPC_NDR_ECHO + scripting/ejs/ejsrpc.o +REQUIRED_SUBSYSTEMS = RPC_EJS_ECHO NOPROTO = YES # End SUBSYSTEM EJSRPC ####################### @@ -20,7 +19,7 @@ OBJ_FILES = \ scripting/ejs/smbcalls_cli.o \ scripting/ejs/smbcalls_rpc.o \ scripting/ejs/mprutil.o -REQUIRED_SUBSYSTEMS = AUTH EJS LIBBASIC RPC_NDR_ECHO EJSRPC +REQUIRED_SUBSYSTEMS = AUTH EJS LIBBASIC EJSRPC # End SUBSYSTEM SMBCALLS ####################### diff --git a/source4/scripting/ejs/ejsrpc.c b/source4/scripting/ejs/ejsrpc.c index 990dee123c..242d748b36 100644 --- a/source4/scripting/ejs/ejsrpc.c +++ b/source4/scripting/ejs/ejsrpc.c @@ -96,6 +96,32 @@ static NTSTATUS mprSetVar(struct MprVar *v, const char *name, struct MprVar val) /* + start the ejs pull process for a structure +*/ +NTSTATUS ejs_pull_struct_start(struct ejs_rpc *ejs, struct MprVar **v, const char *name) +{ + *v = mprGetProperty(*v, name, NULL); + if (*v == NULL) { + return NT_STATUS_INVALID_PARAMETER; + } + return NT_STATUS_OK; +} + + +/* + start the ejs push process for a structure +*/ +NTSTATUS ejs_push_struct_start(struct ejs_rpc *ejs, struct MprVar **v, const char *name) +{ + struct MprVar s = mprCreateObjVar(name, MPR_DEFAULT_HASH_SIZE); + *v = mprSetProperty(*v, name, &s); + if (*v == NULL) { + return NT_STATUS_INVALID_PARAMETER; + } + return NT_STATUS_OK; +} + +/* pull a uint8 from a mpr variable to a C element */ NTSTATUS ejs_pull_uint8(struct ejs_rpc *ejs, @@ -152,7 +178,6 @@ NTSTATUS ejs_pull_uint32(struct ejs_rpc *ejs, } *r = mprVarToInteger(var); return NT_STATUS_OK; - } NTSTATUS ejs_push_uint32(struct ejs_rpc *ejs, @@ -160,3 +185,97 @@ NTSTATUS ejs_push_uint32(struct ejs_rpc *ejs, { return mprSetVar(v, name, mprCreateIntegerVar(r)); } + +NTSTATUS ejs_pull_hyper(struct ejs_rpc *ejs, + struct MprVar *v, const char *name, uint64_t *r) +{ + struct MprVar *var; + var = mprGetVar(v, name); + if (var == NULL) { + return NT_STATUS_INVALID_PARAMETER_MIX; + } + *r = mprVarToInteger(var); + return NT_STATUS_OK; +} + +NTSTATUS ejs_push_hyper(struct ejs_rpc *ejs, + struct MprVar *v, const char *name, uint64_t r) +{ + return mprSetVar(v, name, mprCreateIntegerVar(r)); +} + + +/* + pull a enum from a mpr variable to a C element + a enum is just treating as an unsigned integer at this level +*/ +NTSTATUS ejs_pull_enum(struct ejs_rpc *ejs, + struct MprVar *v, const char *name, unsigned *r) +{ + struct MprVar *var; + var = mprGetVar(v, name); + if (var == NULL) { + return NT_STATUS_INVALID_PARAMETER_MIX; + } + *r = mprVarToInteger(var); + return NT_STATUS_OK; + +} + +NTSTATUS ejs_push_enum(struct ejs_rpc *ejs, + struct MprVar *v, const char *name, unsigned r) +{ + return mprSetVar(v, name, mprCreateIntegerVar(r)); +} + + +/* + pull an array of elements +*/ +NTSTATUS ejs_pull_array(struct ejs_rpc *ejs, + struct MprVar *v, const char *name, uint32_t length, + size_t elsize, void **r, ejs_pull_t ejs_pull) +{ + int i; + char *data; + + NDR_CHECK(ejs_pull_struct_start(ejs, &v, name)); + + (*r) = talloc_array_size(ejs, elsize, length); + NT_STATUS_HAVE_NO_MEMORY(*r); + + data = *r; + + for (i=0;i<length;i++) { + char *id = talloc_asprintf(ejs, "%u", i); + NT_STATUS_HAVE_NO_MEMORY(id); + NDR_CHECK(ejs_pull(ejs, v, id, (i*elsize)+data)); + talloc_free(id); + } + return mprSetVar(v, "length", mprCreateIntegerVar(i)); +} + + +/* + push an array of elements +*/ +NTSTATUS ejs_push_array(struct ejs_rpc *ejs, + struct MprVar *v, const char *name, uint32_t length, + size_t elsize, void *r, ejs_push_t ejs_push) +{ + int i; + char *data; + + NDR_CHECK(ejs_push_struct_start(ejs, &v, name)); + + data = r; + + for (i=0;i<length;i++) { + char *id = talloc_asprintf(ejs, "%u", i); + NT_STATUS_HAVE_NO_MEMORY(id); + NDR_CHECK(ejs_push(ejs, v, id, (i*elsize)+data)); + talloc_free(id); + } + return NT_STATUS_OK; +} + diff --git a/source4/scripting/ejs/ejsrpc.h b/source4/scripting/ejs/ejsrpc.h index 4ce1858474..8ddd6a394e 100644 --- a/source4/scripting/ejs/ejsrpc.h +++ b/source4/scripting/ejs/ejsrpc.h @@ -24,35 +24,43 @@ struct ejs_rpc { }; +typedef NTSTATUS (*ejs_pull_t)(struct ejs_rpc *, struct MprVar *, const char *, void *); +typedef NTSTATUS (*ejs_push_t)(struct ejs_rpc *, struct MprVar *, const char *, const void *); typedef NTSTATUS (*ejs_pull_function_t)(struct ejs_rpc *, struct MprVar *, void *); typedef NTSTATUS (*ejs_push_function_t)(struct ejs_rpc *, struct MprVar *, const void *); +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); NTSTATUS ejs_pull_rpc(struct MprVar *v, void *ptr, ejs_pull_function_t ejs_pull); NTSTATUS ejs_push_rpc(struct MprVar *v, const void *ptr, ejs_push_function_t ejs_push); +NTSTATUS ejs_pull_struct_start(struct ejs_rpc *ejs, struct MprVar **v, const char *name); +NTSTATUS ejs_push_struct_start(struct ejs_rpc *ejs, struct MprVar **v, const char *name); NTSTATUS ejs_pull_uint8(struct ejs_rpc *ejs, struct MprVar *v, const char *name, uint8_t *r); NTSTATUS ejs_push_uint8(struct ejs_rpc *ejs, struct MprVar *v, const char *name, uint8_t r); - NTSTATUS ejs_pull_uint16(struct ejs_rpc *ejs, struct MprVar *v, const char *name, uint16_t *r); NTSTATUS ejs_push_uint16(struct ejs_rpc *ejs, struct MprVar *v, const char *name, uint16_t r); - NTSTATUS ejs_pull_uint32(struct ejs_rpc *ejs, struct MprVar *v, const char *name, uint32_t *r); NTSTATUS ejs_push_uint32(struct ejs_rpc *ejs, struct MprVar *v, const char *name, uint32_t r); +NTSTATUS ejs_pull_hyper(struct ejs_rpc *ejs, + struct MprVar *v, const char *name, uint64_t *r); +NTSTATUS ejs_push_hyper(struct ejs_rpc *ejs, + struct MprVar *v, const char *name, uint64_t r); +NTSTATUS ejs_pull_enum(struct ejs_rpc *ejs, + struct MprVar *v, const char *name, unsigned *r); +NTSTATUS ejs_push_enum(struct ejs_rpc *ejs, + struct MprVar *v, const char *name, unsigned r); +NTSTATUS ejs_pull_array(struct ejs_rpc *ejs, + struct MprVar *v, const char *name, uint32_t length, + size_t elsize, void **r, ejs_pull_t ejs_pull); +NTSTATUS ejs_push_array(struct ejs_rpc *ejs, + struct MprVar *v, const char *name, uint32_t length, + size_t elsize, void *r, ejs_push_t ejs_push); -/* echo calls - PLEASE LEAVE THESE HERE TILL PIDL KNOWS HOW TO - GENERATE THEM */ - -#include "librpc/gen_ndr/ndr_echo.h" - -NTSTATUS ejs_pull_echo_AddOne(struct ejs_rpc *ejs, - struct MprVar *v, struct echo_AddOne *r); -NTSTATUS ejs_push_echo_AddOne(struct ejs_rpc *ejs, - struct MprVar *v, - const struct echo_AddOne *r); diff --git a/source4/scripting/ejs/smbcalls_irpc.c b/source4/scripting/ejs/smbcalls_irpc.c index 9b0efc69e4..4fd4671732 100644 --- a/source4/scripting/ejs/smbcalls_irpc.c +++ b/source4/scripting/ejs/smbcalls_irpc.c @@ -187,7 +187,7 @@ static NTSTATUS ejs_push_nbtd_info(struct ndr_ejs *ndr, union nbtd_info *r, return NT_STATUS_OK; } -static NTSTATUS ndr_push_nbtd_information(struct ndr_push *ndr, +static NTSTATUS ndr_push_nbtd_information(struct ndr_ejs *ndr, struct nbtd_information *r, struct MprVar *v) { NDR_CHECK(ejs_push_set_switch_value(ndr, &r->out.info, r->in.level)); diff --git a/source4/scripting/ejs/smbcalls_rpc.c b/source4/scripting/ejs/smbcalls_rpc.c index ec47da0e9c..631f1c3a37 100644 --- a/source4/scripting/ejs/smbcalls_rpc.c +++ b/source4/scripting/ejs/smbcalls_rpc.c @@ -81,29 +81,28 @@ done: example: status = rpc_call(conn, "echo_AddOne", io); */ -static int ejs_rpc_call(MprVarHandle eid, int argc, struct MprVar **argv) + 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) { struct MprVar *conn, *io; const struct dcerpc_interface_table *iface; struct dcerpc_pipe *p; - const char *callname; const struct dcerpc_interface_call *call; NTSTATUS status; void *ptr; struct rpc_request *req; int callnum; - if (argc != 3 || + if (argc != 2 || argv[0]->type != MPR_TYPE_OBJECT || - argv[1]->type != MPR_TYPE_STRING || - argv[2]->type != MPR_TYPE_OBJECT) { + argv[1]->type != MPR_TYPE_OBJECT) { ejsSetErrorMsg(eid, "rpc_call invalid arguments"); return -1; } conn = argv[0]; - callname = mprToString(argv[1]); - io = argv[2]; + io = argv[1]; /* get the pipe info */ p = mprGetPtr(conn, "pipe"); @@ -129,7 +128,7 @@ static int ejs_rpc_call(MprVarHandle eid, int argc, struct MprVar **argv) } /* convert the mpr object into a C structure */ - status = ejs_pull_rpc(io, ptr, (ejs_pull_function_t)ejs_pull_echo_AddOne); + status = ejs_pull_rpc(io, ptr, ejs_pull); if (!NT_STATUS_IS_OK(status)) { goto done; } @@ -153,7 +152,7 @@ static int ejs_rpc_call(MprVarHandle eid, int argc, struct MprVar **argv) ndr_print_function_debug(call->ndr_print, call->name, NDR_OUT, ptr); } - status = ejs_push_rpc(io, ptr, (ejs_push_function_t)ejs_push_echo_AddOne); + status = ejs_push_rpc(io, ptr, ejs_push); talloc_free(ptr); done: @@ -161,13 +160,13 @@ done: return 0; } + /* setup C functions that be called from ejs */ void smb_setup_ejs_rpc(void) { + void setup_ejs_rpcecho(void); ejsDefineCFunction(-1, "rpc_connect", ejs_rpc_connect, NULL, MPR_VAR_SCRIPT_HANDLE); - ejsDefineCFunction(-1, "rpc_call", ejs_rpc_call, NULL, MPR_VAR_SCRIPT_HANDLE); + setup_ejs_rpcecho(); } - - |