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/appweb/ejs/ejs.h"
25 #include "scripting/ejs/smbcalls.h"
26 #include "librpc/gen_ndr/ndr_security.h"
27 #include "librpc/gen_ndr/lsa.h"
28 #include "librpc/gen_ndr/winreg.h"
29 #include "scripting/ejs/ejsrpc.h"
30 #include "libcli/security/proto.h"
33 set the switch var to be used by the next union switch
35 void ejs_set_switch(struct ejs_rpc *ejs, uint32_t switch_var)
37 ejs->switch_var = switch_var;
41 panic in the ejs wrapper code
43 NTSTATUS ejs_panic(struct ejs_rpc *ejs, const char *why)
45 ejsSetErrorMsg(ejs->eid, "rpc_call '%s' failed - %s", ejs->callname, why);
46 return NT_STATUS_INTERNAL_ERROR;
50 start the ejs pull process for a structure
52 NTSTATUS ejs_pull_struct_start(struct ejs_rpc *ejs, struct MprVar **v, const char *name)
54 return mprGetVar(v, name);
59 start the ejs push process for a structure
61 NTSTATUS ejs_push_struct_start(struct ejs_rpc *ejs, struct MprVar **v, const char *name)
63 NDR_CHECK(mprSetVar(*v, name, mprObject(name)));
64 return mprGetVar(v, name);
68 pull a uint8 from a mpr variable to a C element
70 NTSTATUS ejs_pull_uint8(struct ejs_rpc *ejs,
71 struct MprVar *v, const char *name, uint8_t *r)
73 NDR_CHECK(mprGetVar(&v, name));
74 *r = mprVarToInteger(v);
79 NTSTATUS ejs_push_uint8(struct ejs_rpc *ejs,
80 struct MprVar *v, const char *name, const uint8_t *r)
82 return mprSetVar(v, name, mprCreateIntegerVar(*r));
86 pull a uint16 from a mpr variable to a C element
88 NTSTATUS ejs_pull_uint16(struct ejs_rpc *ejs,
89 struct MprVar *v, const char *name, uint16_t *r)
91 NDR_CHECK(mprGetVar(&v, name));
92 *r = mprVarToInteger(v);
97 NTSTATUS ejs_push_uint16(struct ejs_rpc *ejs,
98 struct MprVar *v, const char *name, const uint16_t *r)
100 return mprSetVar(v, name, mprCreateIntegerVar(*r));
104 pull a uint32 from a mpr variable to a C element
106 NTSTATUS ejs_pull_uint32(struct ejs_rpc *ejs,
107 struct MprVar *v, const char *name, uint32_t *r)
109 NDR_CHECK(mprGetVar(&v, name));
110 *r = mprVarToInteger(v);
114 NTSTATUS ejs_push_uint32(struct ejs_rpc *ejs,
115 struct MprVar *v, const char *name, const uint32_t *r)
117 return mprSetVar(v, name, mprCreateIntegerVar(*r));
121 pull a int32 from a mpr variable to a C element
123 NTSTATUS ejs_pull_int32(struct ejs_rpc *ejs,
124 struct MprVar *v, const char *name, int32_t *r)
126 NDR_CHECK(mprGetVar(&v, name));
127 *r = mprVarToInteger(v);
131 NTSTATUS ejs_push_int32(struct ejs_rpc *ejs,
132 struct MprVar *v, const char *name, const int32_t *r)
134 return mprSetVar(v, name, mprCreateIntegerVar(*r));
138 pull a uint32 from a mpr variable to a C element
140 NTSTATUS ejs_pull_time_t(struct ejs_rpc *ejs,
141 struct MprVar *v, const char *name, time_t *r)
143 NDR_CHECK(mprGetVar(&v, name));
144 *r = mprVarToInteger(v);
148 NTSTATUS ejs_push_time_t(struct ejs_rpc *ejs,
149 struct MprVar *v, const char *name, const time_t *r)
151 return mprSetVar(v, name, mprCreateIntegerVar(*r));
154 NTSTATUS ejs_pull_hyper(struct ejs_rpc *ejs,
155 struct MprVar *v, const char *name, uint64_t *r)
157 NDR_CHECK(mprGetVar(&v, name));
158 *r = mprVarToNumber(v);
162 NTSTATUS ejs_push_hyper(struct ejs_rpc *ejs,
163 struct MprVar *v, const char *name, const uint64_t *r)
165 return mprSetVar(v, name, mprCreateNumberVar(*r));
168 NTSTATUS ejs_pull_dlong(struct ejs_rpc *ejs,
169 struct MprVar *v, const char *name, int64_t *r)
171 return ejs_pull_hyper(ejs, v, name, (uint64_t *)r);
174 NTSTATUS ejs_push_dlong(struct ejs_rpc *ejs,
175 struct MprVar *v, const char *name, const int64_t *r)
177 return ejs_push_hyper(ejs, v, name, (const uint64_t *)r);
180 NTSTATUS ejs_pull_udlong(struct ejs_rpc *ejs,
181 struct MprVar *v, const char *name, uint64_t *r)
183 return ejs_pull_hyper(ejs, v, name, r);
186 NTSTATUS ejs_push_udlong(struct ejs_rpc *ejs,
187 struct MprVar *v, const char *name, const uint64_t *r)
189 return ejs_push_hyper(ejs, v, name, r);
192 NTSTATUS ejs_pull_NTTIME(struct ejs_rpc *ejs,
193 struct MprVar *v, const char *name, uint64_t *r)
195 return ejs_pull_hyper(ejs, v, name, r);
198 NTSTATUS ejs_push_NTTIME(struct ejs_rpc *ejs,
199 struct MprVar *v, const char *name, const uint64_t *r)
201 return ejs_push_hyper(ejs, v, name, r);
204 NTSTATUS ejs_push_WERROR(struct ejs_rpc *ejs,
205 struct MprVar *v, const char *name, const WERROR *r)
207 return ejs_push_string(ejs, v, name, win_errstr(*r));
210 NTSTATUS ejs_push_NTSTATUS(struct ejs_rpc *ejs,
211 struct MprVar *v, const char *name, const NTSTATUS *r)
213 return ejs_push_string(ejs, v, name, nt_errstr(*r));
218 pull a enum from a mpr variable to a C element
219 a enum is just treating as an unsigned integer at this level
221 NTSTATUS ejs_pull_enum(struct ejs_rpc *ejs,
222 struct MprVar *v, const char *name, unsigned *r)
224 NDR_CHECK(mprGetVar(&v, name));
225 *r = mprVarToInteger(v);
230 NTSTATUS ejs_push_enum(struct ejs_rpc *ejs,
231 struct MprVar *v, const char *name, const unsigned *r)
233 return mprSetVar(v, name, mprCreateIntegerVar(*r));
240 NTSTATUS ejs_pull_string(struct ejs_rpc *ejs,
241 struct MprVar *v, const char *name, const char **s)
243 NDR_CHECK(mprGetVar(&v, name));
251 NTSTATUS ejs_push_string(struct ejs_rpc *ejs,
252 struct MprVar *v, const char *name, const char *s)
254 return mprSetVar(v, name, mprString(s));
257 NTSTATUS ejs_pull_dom_sid(struct ejs_rpc *ejs,
258 struct MprVar *v, const char *name, struct dom_sid *r)
261 NDR_CHECK(mprGetVar(&v, name));
262 sid = dom_sid_parse_talloc(ejs, mprToString(v));
263 NT_STATUS_HAVE_NO_MEMORY(sid);
268 NTSTATUS ejs_push_dom_sid(struct ejs_rpc *ejs,
269 struct MprVar *v, const char *name, const struct dom_sid *r)
271 char *sidstr = dom_sid_string(ejs, r);
272 NT_STATUS_HAVE_NO_MEMORY(sidstr);
273 return mprSetVar(v, name, mprString(sidstr));
276 NTSTATUS ejs_pull_GUID(struct ejs_rpc *ejs,
277 struct MprVar *v, const char *name, struct GUID *r)
279 NDR_CHECK(mprGetVar(&v, name));
280 return GUID_from_string(mprToString(v), r);
283 NTSTATUS ejs_push_GUID(struct ejs_rpc *ejs,
284 struct MprVar *v, const char *name, const struct GUID *r)
286 char *guid = GUID_string(ejs, r);
287 NT_STATUS_HAVE_NO_MEMORY(guid);
288 return mprSetVar(v, name, mprString(guid));
291 NTSTATUS ejs_push_null(struct ejs_rpc *ejs, struct MprVar *v, const char *name)
293 return mprSetVar(v, name, mprCreatePtrVar(NULL));
296 BOOL ejs_pull_null(struct ejs_rpc *ejs, struct MprVar *v, const char *name)
298 NTSTATUS status = mprGetVar(&v, name);
299 if (!NT_STATUS_IS_OK(status)) {
302 if (v->type == MPR_TYPE_PTR && v->ptr == NULL) {
311 NTSTATUS ejs_pull_lsa_String(struct ejs_rpc *ejs,
312 struct MprVar *v, const char *name, struct lsa_String *r)
314 return ejs_pull_string(ejs, v, name, &r->string);
320 NTSTATUS ejs_push_lsa_String(struct ejs_rpc *ejs,
321 struct MprVar *v, const char *name, const struct lsa_String *r)
323 return ejs_push_string(ejs, v, name, r->string);
329 NTSTATUS ejs_pull_winreg_String(struct ejs_rpc *ejs,
330 struct MprVar *v, const char *name, struct winreg_String *r)
332 return ejs_pull_string(ejs, v, name, &r->name);
338 NTSTATUS ejs_push_winreg_String(struct ejs_rpc *ejs,
339 struct MprVar *v, const char *name, const struct winreg_String *r)
341 return ejs_push_string(ejs, v, name, r->name);
344 NTSTATUS ejs_pull_DATA_BLOB(struct ejs_rpc *ejs,
345 struct MprVar *v, const char *name, DATA_BLOB *r)
347 return NT_STATUS_NOT_IMPLEMENTED;
350 NTSTATUS ejs_push_DATA_BLOB(struct ejs_rpc *ejs,
351 struct MprVar *v, const char *name,
354 return NT_STATUS_NOT_IMPLEMENTED;
357 NTSTATUS ejs_pull_BOOL(struct ejs_rpc *ejs,
358 struct MprVar *v, const char *name, BOOL *r)
360 NDR_CHECK(mprGetVar(&v, name));
361 *r = mprVarToBool(v);
365 NTSTATUS ejs_push_BOOL(struct ejs_rpc *ejs,
366 struct MprVar *v, const char *name, const BOOL *r)
368 return mprSetVar(v, name, mprCreateBoolVar(*r));
373 pull a uint8 array from a mpr variable to a C element - treating as a data blob
375 NTSTATUS ejs_pull_array_uint8(struct ejs_rpc *ejs,
376 struct MprVar *v, const char *name,
377 uint8_t *r, uint32_t length)
382 status = mprGetVar(&v, name);
383 NT_STATUS_NOT_OK_RETURN(status);
385 blob = mprToDataBlob(v);
387 return NT_STATUS_OBJECT_NAME_INVALID;
389 if (blob->length != length) {
390 return NT_STATUS_INFO_LENGTH_MISMATCH;
392 memcpy(r, blob->data, length);
397 NTSTATUS ejs_push_array_uint8(struct ejs_rpc *ejs,
398 struct MprVar *v, const char *name,
399 const uint8_t *r, uint32_t length)
402 blob.data = discard_const(r);
403 blob.length = length;
404 mprSetVar(v, name, mprDataBlob(blob));