2 Unix SMB/CIFS implementation.
4 provide interfaces to rpc calls from ejs scripts
6 Copyright (C) Andrew Tridgell 2005
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "lib/ejs/ejs.h"
25 #include "scripting/ejs/ejsrpc.h"
27 NTSTATUS ejs_pull_rpc(int eid, const char *callname,
28 struct MprVar *v, void *ptr, ejs_pull_function_t ejs_pull)
30 struct ejs_rpc *ejs = talloc(ptr, struct ejs_rpc);
31 NT_STATUS_HAVE_NO_MEMORY(ejs);
33 ejs->callname = callname;
34 return ejs_pull(ejs, v, ptr);
38 NTSTATUS ejs_push_rpc(int eid, const char *callname,
39 struct MprVar *v, const void *ptr, ejs_push_function_t ejs_push)
41 struct ejs_rpc *ejs = talloc(ptr, struct ejs_rpc);
42 NT_STATUS_HAVE_NO_MEMORY(ejs);
44 ejs->callname = callname;
45 return ejs_push(ejs, v, ptr);
49 set the switch var to be used by the next union switch
51 void ejs_set_switch(struct ejs_rpc *ejs, uint32_t switch_var)
53 ejs->switch_var = switch_var;
57 panic in the ejs wrapper code
59 NTSTATUS ejs_panic(struct ejs_rpc *ejs, const char *why)
61 ejsSetErrorMsg(ejs->eid, "rpc_call '%s' failed - %s", ejs->callname, why);
62 return NT_STATUS_INTERNAL_ERROR;
66 find a mpr component, allowing for sub objects, using the '.' convention
68 static struct MprVar *mprGetVar(struct MprVar *v, const char *name)
70 const char *p = strchr(name, '.');
74 return mprGetProperty(v, name, NULL);
76 objname = talloc_strndup(mprMemCtx(), name, p-name);
77 if (objname == NULL) {
80 v2 = mprGetProperty(v, objname, NULL);
85 v2 = mprGetVar(v2, p+1);
92 set a mpr component, allowing for sub objects, using the '.' convention
94 static NTSTATUS mprSetVar(struct MprVar *v, const char *name, struct MprVar val)
96 const char *p = strchr(name, '.');
101 v2 = mprSetProperty(v, name, &val);
103 return NT_STATUS_INVALID_PARAMETER_MIX;
107 objname = talloc_strndup(mprMemCtx(), name, p-name);
108 if (objname == NULL) {
109 return NT_STATUS_NO_MEMORY;
111 v2 = mprGetProperty(v, objname, NULL);
113 struct MprVar val2 = mprCreateObjVar(objname, MPR_DEFAULT_HASH_SIZE);
114 v2 = mprCreateProperty(v, objname, &val2);
116 status = mprSetVar(v2, p+1, val);
117 talloc_free(objname);
123 start the ejs pull process for a structure
125 NTSTATUS ejs_pull_struct_start(struct ejs_rpc *ejs, struct MprVar **v, const char *name)
127 *v = mprGetProperty(*v, name, NULL);
129 return NT_STATUS_INVALID_PARAMETER;
136 start the ejs push process for a structure
138 NTSTATUS ejs_push_struct_start(struct ejs_rpc *ejs, struct MprVar **v, const char *name)
140 struct MprVar s = mprCreateObjVar(name, MPR_DEFAULT_HASH_SIZE);
141 *v = mprSetProperty(*v, name, &s);
143 return NT_STATUS_INVALID_PARAMETER;
149 pull a uint8 from a mpr variable to a C element
151 NTSTATUS ejs_pull_uint8(struct ejs_rpc *ejs,
152 struct MprVar *v, const char *name, uint8_t *r)
155 var = mprGetVar(v, name);
157 return NT_STATUS_INVALID_PARAMETER_MIX;
159 *r = mprVarToInteger(var);
164 NTSTATUS ejs_push_uint8(struct ejs_rpc *ejs,
165 struct MprVar *v, const char *name, const uint8_t *r)
167 return mprSetVar(v, name, mprCreateIntegerVar(*r));
171 pull a uint16 from a mpr variable to a C element
173 NTSTATUS ejs_pull_uint16(struct ejs_rpc *ejs,
174 struct MprVar *v, const char *name, uint16_t *r)
177 var = mprGetVar(v, name);
179 return NT_STATUS_INVALID_PARAMETER_MIX;
181 *r = mprVarToInteger(var);
186 NTSTATUS ejs_push_uint16(struct ejs_rpc *ejs,
187 struct MprVar *v, const char *name, const uint16_t *r)
189 return mprSetVar(v, name, mprCreateIntegerVar(*r));
193 pull a uint32 from a mpr variable to a C element
195 NTSTATUS ejs_pull_uint32(struct ejs_rpc *ejs,
196 struct MprVar *v, const char *name, uint32_t *r)
199 var = mprGetVar(v, name);
201 return NT_STATUS_INVALID_PARAMETER_MIX;
203 *r = mprVarToInteger(var);
207 NTSTATUS ejs_push_uint32(struct ejs_rpc *ejs,
208 struct MprVar *v, const char *name, const uint32_t *r)
210 return mprSetVar(v, name, mprCreateIntegerVar(*r));
213 NTSTATUS ejs_pull_hyper(struct ejs_rpc *ejs,
214 struct MprVar *v, const char *name, uint64_t *r)
217 var = mprGetVar(v, name);
219 return NT_STATUS_INVALID_PARAMETER_MIX;
221 *r = mprVarToInteger(var);
225 NTSTATUS ejs_push_hyper(struct ejs_rpc *ejs,
226 struct MprVar *v, const char *name, const uint64_t *r)
228 return mprSetVar(v, name, mprCreateIntegerVar(*r));
233 pull a enum from a mpr variable to a C element
234 a enum is just treating as an unsigned integer at this level
236 NTSTATUS ejs_pull_enum(struct ejs_rpc *ejs,
237 struct MprVar *v, const char *name, unsigned *r)
240 var = mprGetVar(v, name);
242 return NT_STATUS_INVALID_PARAMETER_MIX;
244 *r = mprVarToInteger(var);
249 NTSTATUS ejs_push_enum(struct ejs_rpc *ejs,
250 struct MprVar *v, const char *name, const unsigned *r)
252 return mprSetVar(v, name, mprCreateIntegerVar(*r));
259 NTSTATUS ejs_pull_string(struct ejs_rpc *ejs,
260 struct MprVar *v, const char *name, char **s)
263 var = mprGetVar(v, name);
265 return NT_STATUS_INVALID_PARAMETER_MIX;
267 *s = mprToString(var);
274 NTSTATUS ejs_push_string(struct ejs_rpc *ejs,
275 struct MprVar *v, const char *name, const char *s)
277 return mprSetVar(v, name, mprCreateStringVar(s, True));