mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
r8281: pass the callnum and rpc interface table directly from the generated
code in pidl for ejs calls. This means that ejs_rpc_call() doesn't need to scan the rpc tables for the right interface, and doesn't need to scan for the call name
This commit is contained in:
parent
1c170138a8
commit
1c6b1102e5
@ -628,15 +628,18 @@ sub EjsPushFunction($)
|
||||
|
||||
#################################
|
||||
# generate a ejs mapping function
|
||||
sub EjsFunction($)
|
||||
sub EjsFunction($$)
|
||||
{
|
||||
my $d = shift;
|
||||
my $iface = shift;
|
||||
my $name = $d->{NAME};
|
||||
my $callnum = uc("DCERPC_$name");
|
||||
my $table = "&dcerpc_table_$iface";
|
||||
|
||||
pidl "static int ejs_$name(int eid, int argc, struct MprVar **argv)";
|
||||
pidl "{";
|
||||
indent;
|
||||
pidl "return ejs_rpc_call(eid, argc, argv, \"$name\", (ejs_pull_function_t)ejs_pull_$name, (ejs_push_function_t)ejs_push_$name);";
|
||||
pidl "return ejs_rpc_call(eid, argc, argv, $table, $callnum, (ejs_pull_function_t)ejs_pull_$name, (ejs_push_function_t)ejs_push_$name);";
|
||||
deindent;
|
||||
pidl "}\n";
|
||||
}
|
||||
@ -669,7 +672,7 @@ sub EjsInterface($$)
|
||||
|
||||
EjsPullFunction($d);
|
||||
EjsPushFunction($d);
|
||||
EjsFunction($d);
|
||||
EjsFunction($d, $name);
|
||||
|
||||
push (@fns, $d->{NAME});
|
||||
}
|
||||
|
@ -43,7 +43,8 @@ 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,
|
||||
int ejs_rpc_call(int eid, int argc, struct MprVar **argv,
|
||||
const struct dcerpc_interface_table *iface, int callnum,
|
||||
ejs_pull_function_t ejs_pull, ejs_push_function_t ejs_push);
|
||||
|
||||
NTSTATUS ejs_pull_struct_start(struct ejs_rpc *ejs, struct MprVar **v, const char *name);
|
||||
|
@ -164,23 +164,31 @@ done:
|
||||
|
||||
|
||||
/*
|
||||
make an rpc call
|
||||
example:
|
||||
status = rpc_call(conn, "echo_AddOne", io);
|
||||
make an irpc call - called via the same interface as rpc
|
||||
*/
|
||||
static int ejs_irpc_call(int eid, struct MprVar *conn, struct MprVar *io,
|
||||
const struct dcerpc_interface_table *iface, int callnum,
|
||||
ejs_pull_function_t ejs_pull, ejs_push_function_t ejs_push)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
backend code for making an rpc call - this is called from the pidl generated ejs
|
||||
code
|
||||
*/
|
||||
int ejs_rpc_call(int eid, int argc, struct MprVar **argv,
|
||||
const char *callname,
|
||||
const struct dcerpc_interface_table *iface, int callnum,
|
||||
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 struct dcerpc_interface_call *call;
|
||||
NTSTATUS status;
|
||||
void *ptr;
|
||||
struct rpc_request *req;
|
||||
int callnum;
|
||||
struct ejs_rpc *ejs;
|
||||
const struct dcerpc_interface_call *call;
|
||||
|
||||
if (argc != 2 ||
|
||||
argv[0]->type != MPR_TYPE_OBJECT ||
|
||||
@ -192,30 +200,28 @@ done:
|
||||
conn = argv[0];
|
||||
io = argv[1];
|
||||
|
||||
if (mprGetPtr(conn, "irpc")) {
|
||||
/* its an irpc call */
|
||||
return ejs_irpc_call(eid, conn, io, iface, callnum, ejs_pull, ejs_push);
|
||||
}
|
||||
|
||||
/* get the pipe info */
|
||||
p = mprGetPtr(conn, "pipe");
|
||||
iface = mprGetPtr(conn, "iface");
|
||||
if (p == NULL || iface == NULL) {
|
||||
if (p == NULL) {
|
||||
ejsSetErrorMsg(eid, "rpc_call invalid pipe");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* find the call by name */
|
||||
call = dcerpc_iface_find_call(iface, callname);
|
||||
if (call == NULL) {
|
||||
status = NT_STATUS_OBJECT_NAME_INVALID;
|
||||
goto done;
|
||||
}
|
||||
callnum = call - iface->calls;
|
||||
|
||||
ejs = talloc(mprMemCtx(), struct ejs_rpc);
|
||||
if (ejs == NULL) {
|
||||
status = NT_STATUS_NO_MEMORY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
call = &iface->calls[callnum];
|
||||
|
||||
ejs->eid = eid;
|
||||
ejs->callname = callname;
|
||||
ejs->callname = call->name;
|
||||
|
||||
/* allocate the C structure */
|
||||
ptr = talloc_zero_size(ejs, call->struct_size);
|
||||
|
Loading…
Reference in New Issue
Block a user