s3-spoolss: Use tmp_ctx in winreg_create_printer_internal.
[Samba/bjacke.git] / source3 / rpc_server / spoolss / srv_spoolss_util.c
blobd6c3b46c769dd67a50fa7059a6d6582910d25bd3
1 /*
2 * Unix SMB/CIFS implementation.
4 * SPOOLSS RPC Pipe server / winreg client routines
6 * Copyright (c) 2010 Andreas Schneider <asn@samba.org>
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 3 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, see <http://www.gnu.org/licenses/>.
22 #include "includes.h"
23 #include "rpc_server/rpc_ncacn_np.h"
24 #include "../lib/tsocket/tsocket.h"
25 #include "../librpc/gen_ndr/ndr_spoolss.h"
26 #include "../librpc/gen_ndr/ndr_winreg.h"
27 #include "srv_spoolss_util.h"
28 #include "rpc_client/cli_winreg_spoolss.h"
30 WERROR winreg_printer_binding_handle(TALLOC_CTX *mem_ctx,
31 const struct auth_session_info *session_info,
32 struct messaging_context *msg_ctx,
33 struct dcerpc_binding_handle **winreg_binding_handle)
35 struct tsocket_address *local;
36 NTSTATUS status;
37 int rc;
39 rc = tsocket_address_inet_from_strings(mem_ctx,
40 "ip",
41 "127.0.0.1",
43 &local);
44 if (rc < 0) {
45 return WERR_NOMEM;
48 status = rpcint_binding_handle(mem_ctx,
49 &ndr_table_winreg,
50 local,
51 session_info,
52 msg_ctx,
53 winreg_binding_handle);
54 talloc_free(local);
55 if (!NT_STATUS_IS_OK(status)) {
56 DEBUG(0, ("winreg_printer_binding_handle: Could not connect to winreg pipe: %s\n",
57 nt_errstr(status)));
58 return ntstatus_to_werror(status);
61 return WERR_OK;
64 WERROR winreg_delete_printer_key_internal(TALLOC_CTX *mem_ctx,
65 const struct auth_session_info *session_info,
66 struct messaging_context *msg_ctx,
67 const char *printer,
68 const char *key)
70 WERROR result;
71 struct dcerpc_binding_handle *b;
72 TALLOC_CTX *tmp_ctx;
74 tmp_ctx = talloc_stackframe();
75 if (tmp_ctx == NULL) {
76 return WERR_NOMEM;
79 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
80 if (!W_ERROR_IS_OK(result)) {
81 talloc_free(tmp_ctx);
82 return result;
85 result = winreg_delete_printer_key(tmp_ctx,
87 printer,
88 key);
90 talloc_free(tmp_ctx);
91 return result;
94 WERROR winreg_printer_update_changeid_internal(TALLOC_CTX *mem_ctx,
95 const struct auth_session_info *session_info,
96 struct messaging_context *msg_ctx,
97 const char *printer)
99 WERROR result;
100 struct dcerpc_binding_handle *b;
101 TALLOC_CTX *tmp_ctx;
103 tmp_ctx = talloc_stackframe();
104 if (tmp_ctx == NULL) {
105 return WERR_NOMEM;
108 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
109 if (!W_ERROR_IS_OK(result)) {
110 talloc_free(tmp_ctx);
111 return result;
114 result = winreg_printer_update_changeid(mem_ctx,
116 printer);
118 talloc_free(tmp_ctx);
119 return result;
122 WERROR winreg_printer_get_changeid_internal(TALLOC_CTX *mem_ctx,
123 const struct auth_session_info *session_info,
124 struct messaging_context *msg_ctx,
125 const char *printer,
126 uint32_t *pchangeid)
128 WERROR result;
129 struct dcerpc_binding_handle *b;
130 TALLOC_CTX *tmp_ctx;
132 tmp_ctx = talloc_stackframe();
133 if (tmp_ctx == NULL) {
134 return WERR_NOMEM;
137 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
138 if (!W_ERROR_IS_OK(result)) {
139 talloc_free(tmp_ctx);
140 return result;
143 result = winreg_printer_get_changeid(mem_ctx,
145 printer,
146 pchangeid);
148 talloc_free(tmp_ctx);
149 return result;
152 WERROR winreg_get_printer_internal(TALLOC_CTX *mem_ctx,
153 const struct auth_session_info *session_info,
154 struct messaging_context *msg_ctx,
155 const char *printer,
156 struct spoolss_PrinterInfo2 **pinfo2)
158 WERROR result;
159 struct dcerpc_binding_handle *b;
160 TALLOC_CTX *tmp_ctx;
162 tmp_ctx = talloc_stackframe();
163 if (tmp_ctx == NULL) {
164 return WERR_NOMEM;
167 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
168 if (!W_ERROR_IS_OK(result)) {
169 talloc_free(tmp_ctx);
170 return result;
173 result = winreg_get_printer(mem_ctx,
175 printer,
176 pinfo2);
178 talloc_free(tmp_ctx);
179 return result;
182 WERROR winreg_create_printer_internal(TALLOC_CTX *mem_ctx,
183 const struct auth_session_info *session_info,
184 struct messaging_context *msg_ctx,
185 const char *sharename)
187 WERROR result;
188 struct dcerpc_binding_handle *b;
189 TALLOC_CTX *tmp_ctx;
191 tmp_ctx = talloc_stackframe();
192 if (tmp_ctx == NULL) {
193 return WERR_NOMEM;
196 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
197 if (!W_ERROR_IS_OK(result)) {
198 talloc_free(tmp_ctx);
199 return result;
202 result = winreg_create_printer(mem_ctx,
204 sharename);
206 talloc_free(tmp_ctx);
207 return result;
210 WERROR winreg_update_printer_internal(TALLOC_CTX *mem_ctx,
211 const struct auth_session_info *session_info,
212 struct messaging_context *msg_ctx,
213 const char *sharename,
214 uint32_t info2_mask,
215 struct spoolss_SetPrinterInfo2 *info2,
216 struct spoolss_DeviceMode *devmode,
217 struct security_descriptor *secdesc)
219 WERROR result;
220 struct dcerpc_binding_handle *b;
222 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
223 W_ERROR_NOT_OK_RETURN(result);
225 return winreg_update_printer(mem_ctx, b,
226 sharename,
227 info2_mask,
228 info2,
229 devmode,
230 secdesc);
233 WERROR winreg_set_printer_dataex_internal(TALLOC_CTX *mem_ctx,
234 const struct auth_session_info *session_info,
235 struct messaging_context *msg_ctx,
236 const char *printer,
237 const char *key,
238 const char *value,
239 enum winreg_Type type,
240 uint8_t *data,
241 uint32_t data_size)
243 WERROR result;
244 struct dcerpc_binding_handle *b;
246 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
247 W_ERROR_NOT_OK_RETURN(result);
249 return winreg_set_printer_dataex(mem_ctx, b,
250 printer,
251 key,
252 value,
253 type,
254 data,
255 data_size);
258 WERROR winreg_enum_printer_dataex_internal(TALLOC_CTX *mem_ctx,
259 const struct auth_session_info *session_info,
260 struct messaging_context *msg_ctx,
261 const char *printer,
262 const char *key,
263 uint32_t *pnum_values,
264 struct spoolss_PrinterEnumValues **penum_values)
266 WERROR result;
267 struct dcerpc_binding_handle *b;
269 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
270 W_ERROR_NOT_OK_RETURN(result);
272 return winreg_enum_printer_dataex(mem_ctx, b,
273 printer,
274 key,
275 pnum_values,
276 penum_values);
279 WERROR winreg_get_printer_dataex_internal(TALLOC_CTX *mem_ctx,
280 const struct auth_session_info *session_info,
281 struct messaging_context *msg_ctx,
282 const char *printer,
283 const char *key,
284 const char *value,
285 enum winreg_Type *type,
286 uint8_t **data,
287 uint32_t *data_size)
289 WERROR result;
290 struct dcerpc_binding_handle *b;
292 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
293 W_ERROR_NOT_OK_RETURN(result);
295 return winreg_get_printer_dataex(mem_ctx, b,
296 printer,
297 key,
298 value,
299 type,
300 data,
301 data_size);
304 WERROR winreg_delete_printer_dataex_internal(TALLOC_CTX *mem_ctx,
305 const struct auth_session_info *session_info,
306 struct messaging_context *msg_ctx,
307 const char *printer,
308 const char *key,
309 const char *value)
311 WERROR result;
312 struct dcerpc_binding_handle *b;
314 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
315 W_ERROR_NOT_OK_RETURN(result);
317 return winreg_delete_printer_dataex(mem_ctx, b,
318 printer,
319 key,
320 value);
323 WERROR winreg_get_driver_internal(TALLOC_CTX *mem_ctx,
324 const struct auth_session_info *session_info,
325 struct messaging_context *msg_ctx,
326 const char *architecture,
327 const char *driver_name,
328 uint32_t driver_version,
329 struct spoolss_DriverInfo8 **_info8)
331 WERROR result;
332 struct dcerpc_binding_handle *b;
334 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
335 W_ERROR_NOT_OK_RETURN(result);
337 return winreg_get_driver(mem_ctx, b,
338 architecture,
339 driver_name,
340 driver_version,
341 _info8);
344 WERROR winreg_get_driver_list_internal(TALLOC_CTX *mem_ctx,
345 const struct auth_session_info *session_info,
346 struct messaging_context *msg_ctx,
347 const char *architecture,
348 uint32_t version,
349 uint32_t *num_drivers,
350 const char ***drivers_p)
352 WERROR result;
353 struct dcerpc_binding_handle *b;
355 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
356 W_ERROR_NOT_OK_RETURN(result);
358 return winreg_get_driver_list(mem_ctx, b,
359 architecture,
360 version,
361 num_drivers,
362 drivers_p);
365 WERROR winreg_del_driver_internal(TALLOC_CTX *mem_ctx,
366 const struct auth_session_info *session_info,
367 struct messaging_context *msg_ctx,
368 struct spoolss_DriverInfo8 *info8,
369 uint32_t version)
371 WERROR result;
372 struct dcerpc_binding_handle *b;
374 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
375 W_ERROR_NOT_OK_RETURN(result);
377 return winreg_del_driver(mem_ctx, b,
378 info8,
379 version);
382 WERROR winreg_add_driver_internal(TALLOC_CTX *mem_ctx,
383 const struct auth_session_info *session_info,
384 struct messaging_context *msg_ctx,
385 struct spoolss_AddDriverInfoCtr *r,
386 const char **driver_name,
387 uint32_t *driver_version)
389 WERROR result;
390 struct dcerpc_binding_handle *b;
392 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
393 W_ERROR_NOT_OK_RETURN(result);
395 return winreg_add_driver(mem_ctx, b,
397 driver_name,
398 driver_version);
401 WERROR winreg_get_printer_secdesc_internal(TALLOC_CTX *mem_ctx,
402 const struct auth_session_info *session_info,
403 struct messaging_context *msg_ctx,
404 const char *sharename,
405 struct spoolss_security_descriptor **psecdesc)
407 WERROR result;
408 struct dcerpc_binding_handle *b;
410 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
411 W_ERROR_NOT_OK_RETURN(result);
413 return winreg_get_printer_secdesc(mem_ctx, b,
414 sharename,
415 psecdesc);
418 WERROR winreg_set_printer_secdesc_internal(TALLOC_CTX *mem_ctx,
419 const struct auth_session_info *session_info,
420 struct messaging_context *msg_ctx,
421 const char *sharename,
422 const struct spoolss_security_descriptor *secdesc)
424 WERROR result;
425 struct dcerpc_binding_handle *b;
427 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
428 W_ERROR_NOT_OK_RETURN(result);
430 return winreg_set_printer_secdesc(mem_ctx, b,
431 sharename,
432 secdesc);
435 WERROR winreg_printer_enumforms1_internal(TALLOC_CTX *mem_ctx,
436 const struct auth_session_info *session_info,
437 struct messaging_context *msg_ctx,
438 uint32_t *pnum_info,
439 union spoolss_FormInfo **pinfo)
441 WERROR result;
442 struct dcerpc_binding_handle *b;
444 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
445 W_ERROR_NOT_OK_RETURN(result);
447 return winreg_printer_enumforms1(mem_ctx, b,
448 pnum_info,
449 pinfo);
452 WERROR winreg_printer_getform1_internal(TALLOC_CTX *mem_ctx,
453 const struct auth_session_info *session_info,
454 struct messaging_context *msg_ctx,
455 const char *form_name,
456 struct spoolss_FormInfo1 *r)
458 WERROR result;
459 struct dcerpc_binding_handle *b;
461 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
462 W_ERROR_NOT_OK_RETURN(result);
464 return winreg_printer_getform1(mem_ctx, b,
465 form_name,
469 WERROR winreg_printer_addform1_internal(TALLOC_CTX *mem_ctx,
470 const struct auth_session_info *session_info,
471 struct messaging_context *msg_ctx,
472 struct spoolss_AddFormInfo1 *form)
474 WERROR result;
475 struct dcerpc_binding_handle *b;
477 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
478 W_ERROR_NOT_OK_RETURN(result);
480 return winreg_printer_addform1(mem_ctx, b,
481 form);
484 WERROR winreg_printer_setform1_internal(TALLOC_CTX *mem_ctx,
485 const struct auth_session_info *session_info,
486 struct messaging_context *msg_ctx,
487 const char *form_name,
488 struct spoolss_AddFormInfo1 *form)
490 WERROR result;
491 struct dcerpc_binding_handle *b;
493 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
494 W_ERROR_NOT_OK_RETURN(result);
496 return winreg_printer_setform1(mem_ctx, b,
497 form_name,
498 form);
501 WERROR winreg_printer_deleteform1_internal(TALLOC_CTX *mem_ctx,
502 const struct auth_session_info *session_info,
503 struct messaging_context *msg_ctx,
504 const char *form_name)
506 WERROR result;
507 struct dcerpc_binding_handle *b;
509 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
510 W_ERROR_NOT_OK_RETURN(result);
512 return winreg_printer_deleteform1(mem_ctx, b,
513 form_name);
516 WERROR winreg_enum_printer_key_internal(TALLOC_CTX *mem_ctx,
517 const struct auth_session_info *session_info,
518 struct messaging_context *msg_ctx,
519 const char *printer,
520 const char *key,
521 uint32_t *pnum_subkeys,
522 const char ***psubkeys)
524 WERROR result;
525 struct dcerpc_binding_handle *b;
527 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
528 W_ERROR_NOT_OK_RETURN(result);
530 return winreg_enum_printer_key(mem_ctx, b,
531 printer,
532 key,
533 pnum_subkeys,
534 psubkeys);