s3-spoolss: Use tmp_ctx in winreg_printer_get_changeid_internal.
[Samba/id10ts.git] / source3 / rpc_server / spoolss / srv_spoolss_util.c
blob52ba183d5eacd36d45d453605e3b463e9d7ce0d0
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;
161 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
162 W_ERROR_NOT_OK_RETURN(result);
164 return winreg_get_printer(mem_ctx, b,
165 printer,
166 pinfo2);
170 WERROR winreg_create_printer_internal(TALLOC_CTX *mem_ctx,
171 const struct auth_session_info *session_info,
172 struct messaging_context *msg_ctx,
173 const char *sharename)
175 WERROR result;
176 struct dcerpc_binding_handle *b;
178 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
179 W_ERROR_NOT_OK_RETURN(result);
181 return winreg_create_printer(mem_ctx, b,
182 sharename);
185 WERROR winreg_update_printer_internal(TALLOC_CTX *mem_ctx,
186 const struct auth_session_info *session_info,
187 struct messaging_context *msg_ctx,
188 const char *sharename,
189 uint32_t info2_mask,
190 struct spoolss_SetPrinterInfo2 *info2,
191 struct spoolss_DeviceMode *devmode,
192 struct security_descriptor *secdesc)
194 WERROR result;
195 struct dcerpc_binding_handle *b;
197 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
198 W_ERROR_NOT_OK_RETURN(result);
200 return winreg_update_printer(mem_ctx, b,
201 sharename,
202 info2_mask,
203 info2,
204 devmode,
205 secdesc);
208 WERROR winreg_set_printer_dataex_internal(TALLOC_CTX *mem_ctx,
209 const struct auth_session_info *session_info,
210 struct messaging_context *msg_ctx,
211 const char *printer,
212 const char *key,
213 const char *value,
214 enum winreg_Type type,
215 uint8_t *data,
216 uint32_t data_size)
218 WERROR result;
219 struct dcerpc_binding_handle *b;
221 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
222 W_ERROR_NOT_OK_RETURN(result);
224 return winreg_set_printer_dataex(mem_ctx, b,
225 printer,
226 key,
227 value,
228 type,
229 data,
230 data_size);
233 WERROR winreg_enum_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 uint32_t *pnum_values,
239 struct spoolss_PrinterEnumValues **penum_values)
241 WERROR result;
242 struct dcerpc_binding_handle *b;
244 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
245 W_ERROR_NOT_OK_RETURN(result);
247 return winreg_enum_printer_dataex(mem_ctx, b,
248 printer,
249 key,
250 pnum_values,
251 penum_values);
254 WERROR winreg_get_printer_dataex_internal(TALLOC_CTX *mem_ctx,
255 const struct auth_session_info *session_info,
256 struct messaging_context *msg_ctx,
257 const char *printer,
258 const char *key,
259 const char *value,
260 enum winreg_Type *type,
261 uint8_t **data,
262 uint32_t *data_size)
264 WERROR result;
265 struct dcerpc_binding_handle *b;
267 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
268 W_ERROR_NOT_OK_RETURN(result);
270 return winreg_get_printer_dataex(mem_ctx, b,
271 printer,
272 key,
273 value,
274 type,
275 data,
276 data_size);
279 WERROR winreg_delete_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)
286 WERROR result;
287 struct dcerpc_binding_handle *b;
289 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
290 W_ERROR_NOT_OK_RETURN(result);
292 return winreg_delete_printer_dataex(mem_ctx, b,
293 printer,
294 key,
295 value);
298 WERROR winreg_get_driver_internal(TALLOC_CTX *mem_ctx,
299 const struct auth_session_info *session_info,
300 struct messaging_context *msg_ctx,
301 const char *architecture,
302 const char *driver_name,
303 uint32_t driver_version,
304 struct spoolss_DriverInfo8 **_info8)
306 WERROR result;
307 struct dcerpc_binding_handle *b;
309 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
310 W_ERROR_NOT_OK_RETURN(result);
312 return winreg_get_driver(mem_ctx, b,
313 architecture,
314 driver_name,
315 driver_version,
316 _info8);
319 WERROR winreg_get_driver_list_internal(TALLOC_CTX *mem_ctx,
320 const struct auth_session_info *session_info,
321 struct messaging_context *msg_ctx,
322 const char *architecture,
323 uint32_t version,
324 uint32_t *num_drivers,
325 const char ***drivers_p)
327 WERROR result;
328 struct dcerpc_binding_handle *b;
330 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
331 W_ERROR_NOT_OK_RETURN(result);
333 return winreg_get_driver_list(mem_ctx, b,
334 architecture,
335 version,
336 num_drivers,
337 drivers_p);
340 WERROR winreg_del_driver_internal(TALLOC_CTX *mem_ctx,
341 const struct auth_session_info *session_info,
342 struct messaging_context *msg_ctx,
343 struct spoolss_DriverInfo8 *info8,
344 uint32_t version)
346 WERROR result;
347 struct dcerpc_binding_handle *b;
349 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
350 W_ERROR_NOT_OK_RETURN(result);
352 return winreg_del_driver(mem_ctx, b,
353 info8,
354 version);
357 WERROR winreg_add_driver_internal(TALLOC_CTX *mem_ctx,
358 const struct auth_session_info *session_info,
359 struct messaging_context *msg_ctx,
360 struct spoolss_AddDriverInfoCtr *r,
361 const char **driver_name,
362 uint32_t *driver_version)
364 WERROR result;
365 struct dcerpc_binding_handle *b;
367 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
368 W_ERROR_NOT_OK_RETURN(result);
370 return winreg_add_driver(mem_ctx, b,
372 driver_name,
373 driver_version);
376 WERROR winreg_get_printer_secdesc_internal(TALLOC_CTX *mem_ctx,
377 const struct auth_session_info *session_info,
378 struct messaging_context *msg_ctx,
379 const char *sharename,
380 struct spoolss_security_descriptor **psecdesc)
382 WERROR result;
383 struct dcerpc_binding_handle *b;
385 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
386 W_ERROR_NOT_OK_RETURN(result);
388 return winreg_get_printer_secdesc(mem_ctx, b,
389 sharename,
390 psecdesc);
393 WERROR winreg_set_printer_secdesc_internal(TALLOC_CTX *mem_ctx,
394 const struct auth_session_info *session_info,
395 struct messaging_context *msg_ctx,
396 const char *sharename,
397 const struct spoolss_security_descriptor *secdesc)
399 WERROR result;
400 struct dcerpc_binding_handle *b;
402 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
403 W_ERROR_NOT_OK_RETURN(result);
405 return winreg_set_printer_secdesc(mem_ctx, b,
406 sharename,
407 secdesc);
410 WERROR winreg_printer_enumforms1_internal(TALLOC_CTX *mem_ctx,
411 const struct auth_session_info *session_info,
412 struct messaging_context *msg_ctx,
413 uint32_t *pnum_info,
414 union spoolss_FormInfo **pinfo)
416 WERROR result;
417 struct dcerpc_binding_handle *b;
419 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
420 W_ERROR_NOT_OK_RETURN(result);
422 return winreg_printer_enumforms1(mem_ctx, b,
423 pnum_info,
424 pinfo);
427 WERROR winreg_printer_getform1_internal(TALLOC_CTX *mem_ctx,
428 const struct auth_session_info *session_info,
429 struct messaging_context *msg_ctx,
430 const char *form_name,
431 struct spoolss_FormInfo1 *r)
433 WERROR result;
434 struct dcerpc_binding_handle *b;
436 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
437 W_ERROR_NOT_OK_RETURN(result);
439 return winreg_printer_getform1(mem_ctx, b,
440 form_name,
444 WERROR winreg_printer_addform1_internal(TALLOC_CTX *mem_ctx,
445 const struct auth_session_info *session_info,
446 struct messaging_context *msg_ctx,
447 struct spoolss_AddFormInfo1 *form)
449 WERROR result;
450 struct dcerpc_binding_handle *b;
452 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
453 W_ERROR_NOT_OK_RETURN(result);
455 return winreg_printer_addform1(mem_ctx, b,
456 form);
459 WERROR winreg_printer_setform1_internal(TALLOC_CTX *mem_ctx,
460 const struct auth_session_info *session_info,
461 struct messaging_context *msg_ctx,
462 const char *form_name,
463 struct spoolss_AddFormInfo1 *form)
465 WERROR result;
466 struct dcerpc_binding_handle *b;
468 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
469 W_ERROR_NOT_OK_RETURN(result);
471 return winreg_printer_setform1(mem_ctx, b,
472 form_name,
473 form);
476 WERROR winreg_printer_deleteform1_internal(TALLOC_CTX *mem_ctx,
477 const struct auth_session_info *session_info,
478 struct messaging_context *msg_ctx,
479 const char *form_name)
481 WERROR result;
482 struct dcerpc_binding_handle *b;
484 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
485 W_ERROR_NOT_OK_RETURN(result);
487 return winreg_printer_deleteform1(mem_ctx, b,
488 form_name);
491 WERROR winreg_enum_printer_key_internal(TALLOC_CTX *mem_ctx,
492 const struct auth_session_info *session_info,
493 struct messaging_context *msg_ctx,
494 const char *printer,
495 const char *key,
496 uint32_t *pnum_subkeys,
497 const char ***psubkeys)
499 WERROR result;
500 struct dcerpc_binding_handle *b;
502 result = winreg_printer_binding_handle(mem_ctx, session_info, msg_ctx, &b);
503 W_ERROR_NOT_OK_RETURN(result);
505 return winreg_enum_printer_key(mem_ctx, b,
506 printer,
507 key,
508 pnum_subkeys,
509 psubkeys);