r8276: fixed the remaining memory leaks in smbscript. We can now loop doing
[kai/samba.git] / source / scripting / ejs / ejsrpc.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    provide interfaces to rpc calls from ejs scripts
5
6    Copyright (C) Andrew Tridgell 2005
7    
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.
12    
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.
17    
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.
21 */
22
23 #include "includes.h"
24 #include "lib/ejs/ejs.h"
25 #include "scripting/ejs/smbcalls.h"
26 #include "librpc/gen_ndr/ndr_security.h"
27 #include "librpc/gen_ndr/ndr_lsa.h"
28 #include "scripting/ejs/ejsrpc.h"
29
30 /*
31   set the switch var to be used by the next union switch
32 */
33 void ejs_set_switch(struct ejs_rpc *ejs, uint32_t switch_var)
34 {
35         ejs->switch_var = switch_var;
36 }
37
38 /*
39   panic in the ejs wrapper code
40  */
41 NTSTATUS ejs_panic(struct ejs_rpc *ejs, const char *why)
42 {
43         ejsSetErrorMsg(ejs->eid, "rpc_call '%s' failed - %s", ejs->callname, why);
44         return NT_STATUS_INTERNAL_ERROR;
45 }
46
47 /*
48   start the ejs pull process for a structure
49 */
50 NTSTATUS ejs_pull_struct_start(struct ejs_rpc *ejs, struct MprVar **v, const char *name)
51 {
52         return mprGetVar(v, name);
53 }
54
55
56 /*
57   start the ejs push process for a structure
58 */
59 NTSTATUS ejs_push_struct_start(struct ejs_rpc *ejs, struct MprVar **v, const char *name)
60 {
61         NDR_CHECK(mprSetVar(*v, name, mprCreateObjVar(name, MPR_DEFAULT_HASH_SIZE)));
62         return mprGetVar(v, name);
63 }
64
65 /*
66   pull a uint8 from a mpr variable to a C element
67 */
68 NTSTATUS ejs_pull_uint8(struct ejs_rpc *ejs, 
69                         struct MprVar *v, const char *name, uint8_t *r)
70 {
71         NDR_CHECK(mprGetVar(&v, name));
72         *r = mprVarToInteger(v);
73         return NT_STATUS_OK;
74         
75 }
76
77 NTSTATUS ejs_push_uint8(struct ejs_rpc *ejs, 
78                         struct MprVar *v, const char *name, const uint8_t *r)
79 {
80         return mprSetVar(v, name, mprCreateIntegerVar(*r));
81 }
82
83 /*
84   pull a uint16 from a mpr variable to a C element
85 */
86 NTSTATUS ejs_pull_uint16(struct ejs_rpc *ejs, 
87                          struct MprVar *v, const char *name, uint16_t *r)
88 {
89         NDR_CHECK(mprGetVar(&v, name));
90         *r = mprVarToInteger(v);
91         return NT_STATUS_OK;
92         
93 }
94
95 NTSTATUS ejs_push_uint16(struct ejs_rpc *ejs, 
96                          struct MprVar *v, const char *name, const uint16_t *r)
97 {
98         return mprSetVar(v, name, mprCreateIntegerVar(*r));
99 }
100
101 /*
102   pull a uint32 from a mpr variable to a C element
103 */
104 NTSTATUS ejs_pull_uint32(struct ejs_rpc *ejs, 
105                          struct MprVar *v, const char *name, uint32_t *r)
106 {
107         NDR_CHECK(mprGetVar(&v, name));
108         *r = mprVarToInteger(v);
109         return NT_STATUS_OK;
110 }
111
112 NTSTATUS ejs_push_uint32(struct ejs_rpc *ejs, 
113                          struct MprVar *v, const char *name, const uint32_t *r)
114 {
115         return mprSetVar(v, name, mprCreateIntegerVar(*r));
116 }
117
118 /*
119   pull a int32 from a mpr variable to a C element
120 */
121 NTSTATUS ejs_pull_int32(struct ejs_rpc *ejs, 
122                          struct MprVar *v, const char *name, int32_t *r)
123 {
124         NDR_CHECK(mprGetVar(&v, name));
125         *r = mprVarToInteger(v);
126         return NT_STATUS_OK;
127 }
128
129 NTSTATUS ejs_push_int32(struct ejs_rpc *ejs, 
130                          struct MprVar *v, const char *name, const int32_t *r)
131 {
132         return mprSetVar(v, name, mprCreateIntegerVar(*r));
133 }
134
135 NTSTATUS ejs_pull_hyper(struct ejs_rpc *ejs, 
136                         struct MprVar *v, const char *name, uint64_t *r)
137 {
138         NDR_CHECK(mprGetVar(&v, name));
139         *r = mprVarToInteger(v);
140         return NT_STATUS_OK;
141 }
142
143 NTSTATUS ejs_push_hyper(struct ejs_rpc *ejs, 
144                         struct MprVar *v, const char *name, const uint64_t *r)
145 {
146         return mprSetVar(v, name, mprCreateIntegerVar(*r));
147 }
148
149 NTSTATUS ejs_pull_dlong(struct ejs_rpc *ejs, 
150                         struct MprVar *v, const char *name, uint64_t *r)
151 {
152         NDR_CHECK(mprGetVar(&v, name));
153         *r = mprVarToInteger(v);
154         return NT_STATUS_OK;
155 }
156
157 NTSTATUS ejs_push_dlong(struct ejs_rpc *ejs, 
158                         struct MprVar *v, const char *name, const uint64_t *r)
159 {
160         return mprSetVar(v, name, mprCreateIntegerVar(*r));
161 }
162
163 NTSTATUS ejs_pull_udlong(struct ejs_rpc *ejs, 
164                         struct MprVar *v, const char *name, uint64_t *r)
165 {
166         NDR_CHECK(mprGetVar(&v, name));
167         *r = mprVarToInteger(v);
168         return NT_STATUS_OK;
169 }
170
171 NTSTATUS ejs_push_udlong(struct ejs_rpc *ejs, 
172                         struct MprVar *v, const char *name, const uint64_t *r)
173 {
174         return mprSetVar(v, name, mprCreateIntegerVar(*r));
175 }
176
177 NTSTATUS ejs_pull_NTTIME(struct ejs_rpc *ejs, 
178                         struct MprVar *v, const char *name, uint64_t *r)
179 {
180         NDR_CHECK(mprGetVar(&v, name));
181         *r = mprVarToInteger(v);
182         return NT_STATUS_OK;
183 }
184
185 NTSTATUS ejs_push_NTTIME(struct ejs_rpc *ejs, 
186                         struct MprVar *v, const char *name, const uint64_t *r)
187 {
188         return mprSetVar(v, name, mprCreateIntegerVar(*r));
189 }
190
191
192 /*
193   pull a enum from a mpr variable to a C element
194   a enum is just treating as an unsigned integer at this level
195 */
196 NTSTATUS ejs_pull_enum(struct ejs_rpc *ejs, 
197                        struct MprVar *v, const char *name, unsigned *r)
198 {
199         NDR_CHECK(mprGetVar(&v, name));
200         *r = mprVarToInteger(v);
201         return NT_STATUS_OK;
202         
203 }
204
205 NTSTATUS ejs_push_enum(struct ejs_rpc *ejs, 
206                        struct MprVar *v, const char *name, const unsigned *r)
207 {
208         return mprSetVar(v, name, mprCreateIntegerVar(*r));
209 }
210
211
212 /*
213   pull a string
214 */
215 NTSTATUS ejs_pull_string(struct ejs_rpc *ejs, 
216                          struct MprVar *v, const char *name, const char **s)
217 {
218         NDR_CHECK(mprGetVar(&v, name));
219         *s = mprToString(v);
220         return NT_STATUS_OK;
221 }
222
223 /*
224   push a string
225 */
226 NTSTATUS ejs_push_string(struct ejs_rpc *ejs, 
227                          struct MprVar *v, const char *name, const char *s)
228 {
229         return mprSetVar(v, name, mprCreateStringVar(s, True));
230 }
231
232 /*
233   setup a constant int
234 */
235 void ejs_set_constant_int(int eid, const char *name, int value)
236 {
237         struct MprVar *v = ejsGetGlobalObject(eid);
238         mprSetVar(v, name, mprCreateIntegerVar(value));
239 }
240
241 /*
242   setup a constant string
243 */
244 void ejs_set_constant_string(int eid, const char *name, const char *value)
245 {
246         struct MprVar *v = ejsGetGlobalObject(eid);
247         mprSetVar(v, name, mprCreateStringVar(value, False));
248 }
249
250
251 NTSTATUS ejs_pull_dom_sid(struct ejs_rpc *ejs, 
252                           struct MprVar *v, const char *name, struct dom_sid *r)
253 {
254         struct dom_sid *sid;
255         NDR_CHECK(mprGetVar(&v, name));
256         sid = dom_sid_parse_talloc(ejs, mprToString(v));
257         NT_STATUS_HAVE_NO_MEMORY(sid);
258         *r = *sid;
259         return NT_STATUS_OK;
260 }
261
262 NTSTATUS ejs_push_dom_sid(struct ejs_rpc *ejs, 
263                           struct MprVar *v, const char *name, const struct dom_sid *r)
264 {
265         char *sidstr = dom_sid_string(ejs, r);
266         NT_STATUS_HAVE_NO_MEMORY(sidstr);
267         return mprSetVar(v, name, mprCreateStringVar(sidstr, True));
268 }
269
270 NTSTATUS ejs_pull_GUID(struct ejs_rpc *ejs, 
271                        struct MprVar *v, const char *name, struct GUID *r)
272 {
273         NDR_CHECK(mprGetVar(&v, name));
274         return GUID_from_string(mprToString(v), r);
275 }
276
277 NTSTATUS ejs_push_GUID(struct ejs_rpc *ejs, 
278                        struct MprVar *v, const char *name, const struct GUID *r)
279 {
280         char *guid = GUID_string(ejs, r);
281         NT_STATUS_HAVE_NO_MEMORY(guid);
282         return mprSetVar(v, name, mprCreateStringVar(guid, True));
283 }
284
285 NTSTATUS ejs_push_null(struct ejs_rpc *ejs, struct MprVar *v, const char *name)
286 {
287         return mprSetVar(v, name, mprCreatePtrVar(NULL, name));
288 }
289
290 BOOL ejs_pull_null(struct ejs_rpc *ejs, struct MprVar *v, const char *name)
291 {
292         NTSTATUS status = mprGetVar(&v, name);
293         if (!NT_STATUS_IS_OK(status)) {
294                 return False;
295         }
296         if (v->type == MPR_TYPE_PTR && v->ptr == NULL) {
297                 return True;
298         }
299         return False;
300 }
301
302 /*
303   pull a lsa_String
304 */
305 NTSTATUS ejs_pull_lsa_String(struct ejs_rpc *ejs, 
306                              struct MprVar *v, const char *name, struct lsa_String *r)
307 {
308         return ejs_pull_string(ejs, v, name, &r->string);
309 }
310
311 /*
312   push a lsa_String
313 */
314 NTSTATUS ejs_push_lsa_String(struct ejs_rpc *ejs, 
315                              struct MprVar *v, const char *name, const struct lsa_String *r)
316 {
317         return ejs_push_string(ejs, v, name, r->string);
318 }
319