s3-spoolss: Use tmp_ctx in winreg_add_driver_internal.
[Samba/gbeck.git] / source3 / rpc_server / spoolss / srv_spoolss_util.c
blob820a75b50373ffe596fe03574872a05d84500b75
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;
221 TALLOC_CTX *tmp_ctx;
223 tmp_ctx = talloc_stackframe();
224 if (tmp_ctx == NULL) {
225 return WERR_NOMEM;
228 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
229 if (!W_ERROR_IS_OK(result)) {
230 talloc_free(tmp_ctx);
231 return result;
234 result = winreg_update_printer(mem_ctx,
236 sharename,
237 info2_mask,
238 info2,
239 devmode,
240 secdesc);
242 talloc_free(tmp_ctx);
243 return result;
246 WERROR winreg_set_printer_dataex_internal(TALLOC_CTX *mem_ctx,
247 const struct auth_session_info *session_info,
248 struct messaging_context *msg_ctx,
249 const char *printer,
250 const char *key,
251 const char *value,
252 enum winreg_Type type,
253 uint8_t *data,
254 uint32_t data_size)
256 WERROR result;
257 struct dcerpc_binding_handle *b;
258 TALLOC_CTX *tmp_ctx;
260 tmp_ctx = talloc_stackframe();
261 if (tmp_ctx == NULL) {
262 return WERR_NOMEM;
265 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
266 if (!W_ERROR_IS_OK(result)) {
267 talloc_free(tmp_ctx);
268 return result;
271 result = winreg_set_printer_dataex(mem_ctx,
273 printer,
274 key,
275 value,
276 type,
277 data,
278 data_size);
280 talloc_free(tmp_ctx);
281 return result;
284 WERROR winreg_enum_printer_dataex_internal(TALLOC_CTX *mem_ctx,
285 const struct auth_session_info *session_info,
286 struct messaging_context *msg_ctx,
287 const char *printer,
288 const char *key,
289 uint32_t *pnum_values,
290 struct spoolss_PrinterEnumValues **penum_values)
292 WERROR result;
293 struct dcerpc_binding_handle *b;
294 TALLOC_CTX *tmp_ctx;
296 tmp_ctx = talloc_stackframe();
297 if (tmp_ctx == NULL) {
298 return WERR_NOMEM;
301 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
302 if (!W_ERROR_IS_OK(result)) {
303 talloc_free(tmp_ctx);
304 return result;
307 result = winreg_enum_printer_dataex(mem_ctx,
309 printer,
310 key,
311 pnum_values,
312 penum_values);
314 talloc_free(tmp_ctx);
315 return result;
318 WERROR winreg_get_printer_dataex_internal(TALLOC_CTX *mem_ctx,
319 const struct auth_session_info *session_info,
320 struct messaging_context *msg_ctx,
321 const char *printer,
322 const char *key,
323 const char *value,
324 enum winreg_Type *type,
325 uint8_t **data,
326 uint32_t *data_size)
328 WERROR result;
329 struct dcerpc_binding_handle *b;
330 TALLOC_CTX *tmp_ctx;
332 tmp_ctx = talloc_stackframe();
333 if (tmp_ctx == NULL) {
334 return WERR_NOMEM;
337 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
338 if (!W_ERROR_IS_OK(result)) {
339 talloc_free(tmp_ctx);
340 return result;
343 result = winreg_get_printer_dataex(mem_ctx,
345 printer,
346 key,
347 value,
348 type,
349 data,
350 data_size);
352 talloc_free(tmp_ctx);
353 return result;
356 WERROR winreg_delete_printer_dataex_internal(TALLOC_CTX *mem_ctx,
357 const struct auth_session_info *session_info,
358 struct messaging_context *msg_ctx,
359 const char *printer,
360 const char *key,
361 const char *value)
363 WERROR result;
364 struct dcerpc_binding_handle *b;
365 TALLOC_CTX *tmp_ctx;
367 tmp_ctx = talloc_stackframe();
368 if (tmp_ctx == NULL) {
369 return WERR_NOMEM;
372 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
373 if (!W_ERROR_IS_OK(result)) {
374 talloc_free(tmp_ctx);
375 return result;
378 result = winreg_delete_printer_dataex(mem_ctx,
380 printer,
381 key,
382 value);
384 talloc_free(tmp_ctx);
385 return result;
388 WERROR winreg_get_driver_internal(TALLOC_CTX *mem_ctx,
389 const struct auth_session_info *session_info,
390 struct messaging_context *msg_ctx,
391 const char *architecture,
392 const char *driver_name,
393 uint32_t driver_version,
394 struct spoolss_DriverInfo8 **_info8)
396 WERROR result;
397 struct dcerpc_binding_handle *b;
398 TALLOC_CTX *tmp_ctx;
400 tmp_ctx = talloc_stackframe();
401 if (tmp_ctx == NULL) {
402 return WERR_NOMEM;
405 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
406 if (!W_ERROR_IS_OK(result)) {
407 talloc_free(tmp_ctx);
408 return result;
411 result = winreg_get_driver(mem_ctx,
413 architecture,
414 driver_name,
415 driver_version,
416 _info8);
418 talloc_free(tmp_ctx);
419 return result;
422 WERROR winreg_get_driver_list_internal(TALLOC_CTX *mem_ctx,
423 const struct auth_session_info *session_info,
424 struct messaging_context *msg_ctx,
425 const char *architecture,
426 uint32_t version,
427 uint32_t *num_drivers,
428 const char ***drivers_p)
430 WERROR result;
431 struct dcerpc_binding_handle *b;
432 TALLOC_CTX *tmp_ctx;
434 tmp_ctx = talloc_stackframe();
435 if (tmp_ctx == NULL) {
436 return WERR_NOMEM;
439 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
440 if (!W_ERROR_IS_OK(result)) {
441 talloc_free(tmp_ctx);
442 return result;
445 result = winreg_get_driver_list(mem_ctx,
447 architecture,
448 version,
449 num_drivers,
450 drivers_p);
452 talloc_free(tmp_ctx);
453 return result;
456 WERROR winreg_del_driver_internal(TALLOC_CTX *mem_ctx,
457 const struct auth_session_info *session_info,
458 struct messaging_context *msg_ctx,
459 struct spoolss_DriverInfo8 *info8,
460 uint32_t version)
462 WERROR result;
463 struct dcerpc_binding_handle *b;
464 TALLOC_CTX *tmp_ctx;
466 tmp_ctx = talloc_stackframe();
467 if (tmp_ctx == NULL) {
468 return WERR_NOMEM;
471 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
472 if (!W_ERROR_IS_OK(result)) {
473 talloc_free(tmp_ctx);
474 return result;
477 result = winreg_del_driver(mem_ctx,
479 info8,
480 version);
482 talloc_free(tmp_ctx);
483 return result;
486 WERROR winreg_add_driver_internal(TALLOC_CTX *mem_ctx,
487 const struct auth_session_info *session_info,
488 struct messaging_context *msg_ctx,
489 struct spoolss_AddDriverInfoCtr *r,
490 const char **driver_name,
491 uint32_t *driver_version)
493 WERROR result;
494 struct dcerpc_binding_handle *b;
495 TALLOC_CTX *tmp_ctx;
497 tmp_ctx = talloc_stackframe();
498 if (tmp_ctx == NULL) {
499 return WERR_NOMEM;
502 result = winreg_printer_binding_handle(tmp_ctx, session_info, msg_ctx, &b);
503 if (!W_ERROR_IS_OK(result)) {
504 talloc_free(tmp_ctx);
505 return result;
508 result = winreg_add_driver(mem_ctx,
511 driver_name,
512 driver_version);
514 talloc_free(tmp_ctx);
515 return result;
518 WERROR winreg_get_printer_secdesc_internal(TALLOC_CTX *mem_ctx,
519 const struct auth_session_info *session_info,
520 struct messaging_context *msg_ctx,
521 const char *sharename,
522 struct spoolss_security_descriptor **psecdesc)
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_get_printer_secdesc(mem_ctx, b,
531 sharename,
532 psecdesc);
535 WERROR winreg_set_printer_secdesc_internal(TALLOC_CTX *mem_ctx,
536 const struct auth_session_info *session_info,
537 struct messaging_context *msg_ctx,
538 const char *sharename,
539 const struct spoolss_security_descriptor *secdesc)
541 WERROR result;
542 struct dcerpc_binding_handle *b;
544 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
545 W_ERROR_NOT_OK_RETURN(result);
547 return winreg_set_printer_secdesc(mem_ctx, b,
548 sharename,
549 secdesc);
552 WERROR winreg_printer_enumforms1_internal(TALLOC_CTX *mem_ctx,
553 const struct auth_session_info *session_info,
554 struct messaging_context *msg_ctx,
555 uint32_t *pnum_info,
556 union spoolss_FormInfo **pinfo)
558 WERROR result;
559 struct dcerpc_binding_handle *b;
561 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
562 W_ERROR_NOT_OK_RETURN(result);
564 return winreg_printer_enumforms1(mem_ctx, b,
565 pnum_info,
566 pinfo);
569 WERROR winreg_printer_getform1_internal(TALLOC_CTX *mem_ctx,
570 const struct auth_session_info *session_info,
571 struct messaging_context *msg_ctx,
572 const char *form_name,
573 struct spoolss_FormInfo1 *r)
575 WERROR result;
576 struct dcerpc_binding_handle *b;
578 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
579 W_ERROR_NOT_OK_RETURN(result);
581 return winreg_printer_getform1(mem_ctx, b,
582 form_name,
586 WERROR winreg_printer_addform1_internal(TALLOC_CTX *mem_ctx,
587 const struct auth_session_info *session_info,
588 struct messaging_context *msg_ctx,
589 struct spoolss_AddFormInfo1 *form)
591 WERROR result;
592 struct dcerpc_binding_handle *b;
594 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
595 W_ERROR_NOT_OK_RETURN(result);
597 return winreg_printer_addform1(mem_ctx, b,
598 form);
601 WERROR winreg_printer_setform1_internal(TALLOC_CTX *mem_ctx,
602 const struct auth_session_info *session_info,
603 struct messaging_context *msg_ctx,
604 const char *form_name,
605 struct spoolss_AddFormInfo1 *form)
607 WERROR result;
608 struct dcerpc_binding_handle *b;
610 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
611 W_ERROR_NOT_OK_RETURN(result);
613 return winreg_printer_setform1(mem_ctx, b,
614 form_name,
615 form);
618 WERROR winreg_printer_deleteform1_internal(TALLOC_CTX *mem_ctx,
619 const struct auth_session_info *session_info,
620 struct messaging_context *msg_ctx,
621 const char *form_name)
623 WERROR result;
624 struct dcerpc_binding_handle *b;
626 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
627 W_ERROR_NOT_OK_RETURN(result);
629 return winreg_printer_deleteform1(mem_ctx, b,
630 form_name);
633 WERROR winreg_enum_printer_key_internal(TALLOC_CTX *mem_ctx,
634 const struct auth_session_info *session_info,
635 struct messaging_context *msg_ctx,
636 const char *printer,
637 const char *key,
638 uint32_t *pnum_subkeys,
639 const char ***psubkeys)
641 WERROR result;
642 struct dcerpc_binding_handle *b;
644 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
645 W_ERROR_NOT_OK_RETURN(result);
647 return winreg_enum_printer_key(mem_ctx, b,
648 printer,
649 key,
650 pnum_subkeys,
651 psubkeys);