smbd: Simplify brl_locktest
[Samba.git] / source4 / rpc_server / spoolss / dcesrv_spoolss.c
blob14929764e4d5b10e8f35c6e65d610923cae4d74c
1 /*
2 Unix SMB/CIFS implementation.
4 endpoint server for the spoolss pipe
6 Copyright (C) Tim Potter 2004
7 Copyright (C) Stefan Metzmacher 2005
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "includes.h"
24 #include "rpc_server/dcerpc_server.h"
25 #include "librpc/gen_ndr/ndr_spoolss.h"
26 #include "ntptr/ntptr.h"
27 #include "lib/tsocket/tsocket.h"
28 #include "librpc/gen_ndr/ndr_spoolss_c.h"
29 #include "auth/credentials/credentials.h"
30 #include "param/param.h"
32 enum spoolss_handle {
33 SPOOLSS_NOTIFY
36 #define SPOOLSS_BUFFER_UNION(fn,info,level) \
37 ((info)?ndr_size_##fn(info, level, 0):0)
39 #define SPOOLSS_BUFFER_UNION_ARRAY(fn,info,level,count) \
40 ((info)?ndr_size_##fn##_info(dce_call, level, count, info):0)
42 #define SPOOLSS_BUFFER_OK(val_true,val_false) ((r->in.offered >= *r->out.needed)?val_true:val_false)
44 static WERROR dcesrv_spoolss_parse_printer_name(TALLOC_CTX *mem_ctx, const char *name,
45 const char **_server_name,
46 const char **_object_name,
47 enum ntptr_HandleType *_object_type)
49 char *p;
50 char *server = NULL;
51 char *server_unc = NULL;
52 const char *object = name;
54 /* no printername is there it's like open server */
55 if (!name) {
56 *_server_name = NULL;
57 *_object_name = NULL;
58 *_object_type = NTPTR_HANDLE_SERVER;
59 return WERR_OK;
62 /* just "\\" is invalid */
63 if (strequal("\\\\", name)) {
64 return WERR_INVALID_PRINTER_NAME;
67 if (strncmp("\\\\", name, 2) == 0) {
68 server_unc = talloc_strdup(mem_ctx, name);
69 W_ERROR_HAVE_NO_MEMORY(server_unc);
70 server = server_unc + 2;
72 /* here we know we have "\\" in front not followed
73 * by '\0', now see if we have another "\" in the string
75 p = strchr_m(server, '\\');
76 if (!p) {
77 /* there's no other "\", so it's ("\\%s",server)
79 *_server_name = server_unc;
80 *_object_name = NULL;
81 *_object_type = NTPTR_HANDLE_SERVER;
82 return WERR_OK;
84 /* here we know that we have ("\\%s\",server),
85 * if we have '\0' as next then it's an invalid name
86 * otherwise the printer_name
88 p[0] = '\0';
89 /* everything that follows is the printer name */
90 p++;
91 object = p;
93 /* just "" as server is invalid */
94 if (strequal(server, "")) {
95 return WERR_INVALID_PRINTER_NAME;
99 /* just "" is invalid */
100 if (strequal(object, "")) {
101 return WERR_INVALID_PRINTER_NAME;
104 #define XCV_PORT ",XcvPort "
105 #define XCV_MONITOR ",XcvMonitor "
106 if (strncmp(object, XCV_PORT, strlen(XCV_PORT)) == 0) {
107 object += strlen(XCV_PORT);
109 /* just "" is invalid */
110 if (strequal(object, "")) {
111 return WERR_INVALID_PRINTER_NAME;
114 *_server_name = server_unc;
115 *_object_name = object;
116 *_object_type = NTPTR_HANDLE_PORT;
117 return WERR_OK;
118 } else if (strncmp(object, XCV_MONITOR, strlen(XCV_MONITOR)) == 0) {
119 object += strlen(XCV_MONITOR);
121 /* just "" is invalid */
122 if (strequal(object, "")) {
123 return WERR_INVALID_PRINTER_NAME;
126 *_server_name = server_unc;
127 *_object_name = object;
128 *_object_type = NTPTR_HANDLE_MONITOR;
129 return WERR_OK;
132 *_server_name = server_unc;
133 *_object_name = object;
134 *_object_type = NTPTR_HANDLE_PRINTER;
135 return WERR_OK;
139 * Check server_name is:
140 * - "" , functions that don't allow "",
141 * should check that on their own, before calling this function
142 * - our name (only netbios yet, TODO: need to test dns name!)
143 * - our ip address of the current use socket
144 * otherwise return WERR_INVALID_PRINTER_NAME
146 static WERROR dcesrv_spoolss_check_server_name(struct dcesrv_call_state *dce_call,
147 TALLOC_CTX *mem_ctx,
148 const char *server_name)
150 bool ret;
151 const struct tsocket_address *local_address;
152 char *myaddr;
153 const char **aliases;
154 const char *dnsdomain;
155 unsigned int i;
157 /* NULL is ok */
158 if (!server_name) return WERR_OK;
160 /* "" is ok */
161 ret = strequal("",server_name);
162 if (ret) return WERR_OK;
164 /* just "\\" is invalid */
165 if (strequal("\\\\", server_name)) {
166 return WERR_INVALID_PRINTER_NAME;
169 /* then we need "\\" */
170 if (strncmp("\\\\", server_name, 2) != 0) {
171 return WERR_INVALID_PRINTER_NAME;
174 server_name += 2;
176 /* NETBIOS NAME is ok */
177 ret = strequal(lpcfg_netbios_name(dce_call->conn->dce_ctx->lp_ctx), server_name);
178 if (ret) return WERR_OK;
180 aliases = lpcfg_netbios_aliases(dce_call->conn->dce_ctx->lp_ctx);
182 for (i=0; aliases && aliases[i]; i++) {
183 if (strequal(aliases[i], server_name)) {
184 return WERR_OK;
188 /* DNS NAME is ok
189 * TODO: we need to check if aliases are also ok
191 dnsdomain = lpcfg_dnsdomain(dce_call->conn->dce_ctx->lp_ctx);
192 if (dnsdomain != NULL) {
193 char *str;
195 str = talloc_asprintf(mem_ctx, "%s.%s",
196 lpcfg_netbios_name(dce_call->conn->dce_ctx->lp_ctx),
197 dnsdomain);
198 W_ERROR_HAVE_NO_MEMORY(str);
200 ret = strequal(str, server_name);
201 talloc_free(str);
202 if (ret) return WERR_OK;
205 local_address = dcesrv_connection_get_local_address(dce_call->conn);
207 myaddr = tsocket_address_inet_addr_string(local_address, mem_ctx);
208 W_ERROR_HAVE_NO_MEMORY(myaddr);
210 ret = strequal(myaddr, server_name);
211 talloc_free(myaddr);
212 if (ret) return WERR_OK;
214 return WERR_INVALID_PRINTER_NAME;
217 static NTSTATUS dcerpc_spoolss_bind(struct dcesrv_call_state *dce_call, const struct dcesrv_interface *iface)
219 NTSTATUS status;
220 struct ntptr_context *ntptr;
222 status = ntptr_init_context(dce_call->context, dce_call->conn->event_ctx, dce_call->conn->dce_ctx->lp_ctx,
223 "simple_ldb", &ntptr);
224 NT_STATUS_NOT_OK_RETURN(status);
226 dce_call->context->private_data = ntptr;
228 return NT_STATUS_OK;
231 #define DCESRV_INTERFACE_SPOOLSS_BIND dcerpc_spoolss_bind
234 spoolss_EnumPrinters
236 static WERROR dcesrv_spoolss_EnumPrinters(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
237 struct spoolss_EnumPrinters *r)
239 struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private_data, struct ntptr_context);
240 WERROR status;
242 status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.server);
243 W_ERROR_NOT_OK_RETURN(status);
245 status = ntptr_EnumPrinters(ntptr, mem_ctx, r);
246 W_ERROR_NOT_OK_RETURN(status);
248 *r->out.needed = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPrinters, *r->out.info, r->in.level, *r->out.count);
249 *r->out.info = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
250 *r->out.count = SPOOLSS_BUFFER_OK(*r->out.count, 0);
251 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
254 static WERROR dcesrv_spoolss_OpenPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
255 struct spoolss_OpenPrinterEx *r);
257 spoolss_OpenPrinter
259 static WERROR dcesrv_spoolss_OpenPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
260 struct spoolss_OpenPrinter *r)
262 WERROR status;
263 struct spoolss_OpenPrinterEx *r2;
265 r2 = talloc(mem_ctx, struct spoolss_OpenPrinterEx);
266 W_ERROR_HAVE_NO_MEMORY(r2);
268 r2->in.printername = r->in.printername;
269 r2->in.datatype = r->in.datatype;
270 r2->in.devmode_ctr = r->in.devmode_ctr;
271 r2->in.access_mask = r->in.access_mask;
272 r2->in.userlevel_ctr.level = 1;
273 r2->in.userlevel_ctr.user_info.level1 = NULL;
274 r2->out.handle = r->out.handle;
276 /* TODO: we should take care about async replies here,
277 if spoolss_OpenPrinterEx() would be async!
279 status = dcesrv_spoolss_OpenPrinterEx(dce_call, mem_ctx, r2);
281 r->out.handle = r2->out.handle;
283 return status;
288 spoolss_SetJob
290 static WERROR dcesrv_spoolss_SetJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
291 struct spoolss_SetJob *r)
293 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
298 spoolss_GetJob
300 static WERROR dcesrv_spoolss_GetJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
301 struct spoolss_GetJob *r)
303 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
308 spoolss_EnumJobs
310 static WERROR dcesrv_spoolss_EnumJobs(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
311 struct spoolss_EnumJobs *r)
313 return WERR_OK;
318 spoolss_AddPrinter
320 static WERROR dcesrv_spoolss_AddPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
321 struct spoolss_AddPrinter *r)
323 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
328 spoolss_DeletePrinter
330 static WERROR dcesrv_spoolss_DeletePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
331 struct spoolss_DeletePrinter *r)
333 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
338 spoolss_SetPrinter
340 static WERROR dcesrv_spoolss_SetPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
341 struct spoolss_SetPrinter *r)
343 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
348 spoolss_GetPrinter
350 static WERROR dcesrv_spoolss_GetPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
351 struct spoolss_GetPrinter *r)
353 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
358 spoolss_AddPrinterDriver
360 static WERROR dcesrv_spoolss_AddPrinterDriver(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
361 struct spoolss_AddPrinterDriver *r)
363 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
368 spoolss_EnumPrinterDrivers
370 static WERROR dcesrv_spoolss_EnumPrinterDrivers(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
371 struct spoolss_EnumPrinterDrivers *r)
373 struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private_data, struct ntptr_context);
374 WERROR status;
376 status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.server);
377 W_ERROR_NOT_OK_RETURN(status);
379 status = ntptr_EnumPrinterDrivers(ntptr, mem_ctx, r);
380 W_ERROR_NOT_OK_RETURN(status);
382 *r->out.needed = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPrinterDrivers, *r->out.info, r->in.level, *r->out.count);
383 *r->out.info = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
384 *r->out.count = SPOOLSS_BUFFER_OK(*r->out.count, 0);
385 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
390 spoolss_GetPrinterDriver
392 static WERROR dcesrv_spoolss_GetPrinterDriver(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
393 struct spoolss_GetPrinterDriver *r)
395 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
400 spoolss_GetPrinterDriverDirectory
402 static WERROR dcesrv_spoolss_GetPrinterDriverDirectory(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
403 struct spoolss_GetPrinterDriverDirectory *r)
405 struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private_data, struct ntptr_context);
406 WERROR status;
408 status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.server);
409 W_ERROR_NOT_OK_RETURN(status);
411 status = ntptr_GetPrinterDriverDirectory(ntptr, mem_ctx, r);
412 W_ERROR_NOT_OK_RETURN(status);
414 *r->out.needed = SPOOLSS_BUFFER_UNION(spoolss_DriverDirectoryInfo, r->out.info, r->in.level);
415 r->out.info = SPOOLSS_BUFFER_OK(r->out.info, NULL);
416 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
421 spoolss_DeletePrinterDriver
423 static WERROR dcesrv_spoolss_DeletePrinterDriver(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
424 struct spoolss_DeletePrinterDriver *r)
426 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
431 spoolss_AddPrintProcessor
433 static WERROR dcesrv_spoolss_AddPrintProcessor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
434 struct spoolss_AddPrintProcessor *r)
436 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
441 spoolss_EnumPrintProcessors
443 static WERROR dcesrv_spoolss_EnumPrintProcessors(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
444 struct spoolss_EnumPrintProcessors *r)
446 return WERR_OK;
451 spoolss_GetPrintProcessorDirectory
453 static WERROR dcesrv_spoolss_GetPrintProcessorDirectory(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
454 struct spoolss_GetPrintProcessorDirectory *r)
456 struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private_data, struct ntptr_context);
457 WERROR status;
459 status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.server);
460 W_ERROR_NOT_OK_RETURN(status);
462 status = ntptr_GetPrintProcessorDirectory(ntptr, mem_ctx, r);
463 W_ERROR_NOT_OK_RETURN(status);
465 *r->out.needed = SPOOLSS_BUFFER_UNION(spoolss_PrintProcessorDirectoryInfo, r->out.info, r->in.level);
466 r->out.info = SPOOLSS_BUFFER_OK(r->out.info, NULL);
467 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
472 spoolss_StartDocPrinter
474 static WERROR dcesrv_spoolss_StartDocPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
475 struct spoolss_StartDocPrinter *r)
477 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
482 spoolss_StartPagePrinter
484 static WERROR dcesrv_spoolss_StartPagePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
485 struct spoolss_StartPagePrinter *r)
487 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
492 spoolss_WritePrinter
494 static WERROR dcesrv_spoolss_WritePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
495 struct spoolss_WritePrinter *r)
497 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
502 spoolss_EndPagePrinter
504 static WERROR dcesrv_spoolss_EndPagePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
505 struct spoolss_EndPagePrinter *r)
507 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
512 spoolss_AbortPrinter
514 static WERROR dcesrv_spoolss_AbortPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
515 struct spoolss_AbortPrinter *r)
517 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
522 spoolss_ReadPrinter
524 static WERROR dcesrv_spoolss_ReadPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
525 struct spoolss_ReadPrinter *r)
527 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
532 spoolss_EndDocPrinter
534 static WERROR dcesrv_spoolss_EndDocPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
535 struct spoolss_EndDocPrinter *r)
537 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
542 spoolss_AddJob
544 static WERROR dcesrv_spoolss_AddJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
545 struct spoolss_AddJob *r)
547 if (r->in.level != 1) {
548 return WERR_UNKNOWN_LEVEL;
551 return WERR_INVALID_PARAM;
556 spoolss_ScheduleJob
558 static WERROR dcesrv_spoolss_ScheduleJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
559 struct spoolss_ScheduleJob *r)
561 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
566 spoolss_GetPrinterData
568 static WERROR dcesrv_spoolss_GetPrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
569 struct spoolss_GetPrinterData *r)
571 struct ntptr_GenericHandle *handle;
572 struct dcesrv_handle *h;
573 WERROR status;
575 r->out.type = talloc_zero(mem_ctx, enum winreg_Type);
576 W_ERROR_HAVE_NO_MEMORY(r->out.type);
578 r->out.needed = talloc_zero(mem_ctx, uint32_t);
579 W_ERROR_HAVE_NO_MEMORY(r->out.needed);
581 r->out.data = talloc_zero_array(mem_ctx, uint8_t, r->in.offered);
582 W_ERROR_HAVE_NO_MEMORY(r->out.data);
584 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
585 handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
586 if (!handle)
587 return WERR_BADFID;
589 switch (handle->type) {
590 case NTPTR_HANDLE_SERVER:
591 status = ntptr_GetPrintServerData(handle, mem_ctx, r);
592 break;
593 default:
594 status = WERR_FOOBAR;
595 break;
598 W_ERROR_NOT_OK_RETURN(status);
600 *r->out.type = SPOOLSS_BUFFER_OK(*r->out.type, REG_NONE);
601 r->out.data = SPOOLSS_BUFFER_OK(r->out.data, r->out.data);
602 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_MORE_DATA);
607 spoolss_SetPrinterData
609 static WERROR dcesrv_spoolss_SetPrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
610 struct spoolss_SetPrinterData *r)
612 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
617 spoolss_WaitForPrinterChange
619 static WERROR dcesrv_spoolss_WaitForPrinterChange(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
620 struct spoolss_WaitForPrinterChange *r)
622 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
627 spoolss_ClosePrinter
629 static WERROR dcesrv_spoolss_ClosePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
630 struct spoolss_ClosePrinter *r)
632 struct dcesrv_handle *h;
634 *r->out.handle = *r->in.handle;
636 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
638 talloc_free(h);
640 ZERO_STRUCTP(r->out.handle);
642 return WERR_OK;
647 spoolss_AddForm
649 static WERROR dcesrv_spoolss_AddForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
650 struct spoolss_AddForm *r)
652 struct ntptr_GenericHandle *handle;
653 struct dcesrv_handle *h;
654 WERROR status;
656 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
657 handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
658 if (!handle)
659 return WERR_BADFID;
661 switch (handle->type) {
662 case NTPTR_HANDLE_SERVER:
663 status = ntptr_AddPrintServerForm(handle, mem_ctx, r);
664 W_ERROR_NOT_OK_RETURN(status);
665 break;
666 case NTPTR_HANDLE_PRINTER:
667 status = ntptr_AddPrinterForm(handle, mem_ctx, r);
668 W_ERROR_NOT_OK_RETURN(status);
669 break;
670 default:
671 return WERR_FOOBAR;
674 return WERR_OK;
679 spoolss_DeleteForm
681 static WERROR dcesrv_spoolss_DeleteForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
682 struct spoolss_DeleteForm *r)
684 struct ntptr_GenericHandle *handle;
685 struct dcesrv_handle *h;
686 WERROR status;
688 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
689 handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
690 if (!handle)
691 return WERR_BADFID;
693 switch (handle->type) {
694 case NTPTR_HANDLE_SERVER:
695 status = ntptr_DeletePrintServerForm(handle, mem_ctx, r);
696 W_ERROR_NOT_OK_RETURN(status);
697 break;
698 case NTPTR_HANDLE_PRINTER:
699 status = ntptr_DeletePrinterForm(handle, mem_ctx, r);
700 W_ERROR_NOT_OK_RETURN(status);
701 break;
702 default:
703 return WERR_FOOBAR;
706 return WERR_OK;
711 spoolss_GetForm
713 static WERROR dcesrv_spoolss_GetForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
714 struct spoolss_GetForm *r)
716 struct ntptr_GenericHandle *handle;
717 struct dcesrv_handle *h;
718 WERROR status;
720 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
721 handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
722 if (!handle)
723 return WERR_BADFID;
725 switch (handle->type) {
726 case NTPTR_HANDLE_SERVER:
728 * stupid, but w2k3 returns WERR_BADFID here?
730 return WERR_BADFID;
731 case NTPTR_HANDLE_PRINTER:
732 status = ntptr_GetPrinterForm(handle, mem_ctx, r);
733 W_ERROR_NOT_OK_RETURN(status);
734 break;
735 default:
736 return WERR_FOOBAR;
739 *r->out.needed = SPOOLSS_BUFFER_UNION(spoolss_FormInfo, r->out.info, r->in.level);
740 r->out.info = SPOOLSS_BUFFER_OK(r->out.info, NULL);
741 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
746 spoolss_SetForm
748 static WERROR dcesrv_spoolss_SetForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
749 struct spoolss_SetForm *r)
751 struct ntptr_GenericHandle *handle;
752 struct dcesrv_handle *h;
753 WERROR status;
755 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
756 handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
757 if (!handle)
758 return WERR_BADFID;
760 switch (handle->type) {
761 case NTPTR_HANDLE_SERVER:
762 status = ntptr_SetPrintServerForm(handle, mem_ctx, r);
763 W_ERROR_NOT_OK_RETURN(status);
764 break;
765 case NTPTR_HANDLE_PRINTER:
766 status = ntptr_SetPrinterForm(handle, mem_ctx, r);
767 W_ERROR_NOT_OK_RETURN(status);
768 break;
769 default:
770 return WERR_FOOBAR;
773 return WERR_OK;
778 spoolss_EnumForms
780 static WERROR dcesrv_spoolss_EnumForms(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
781 struct spoolss_EnumForms *r)
783 struct ntptr_GenericHandle *handle;
784 struct dcesrv_handle *h;
785 WERROR status;
787 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
788 handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
789 if (!handle)
790 return WERR_BADFID;
792 switch (handle->type) {
793 case NTPTR_HANDLE_SERVER:
794 status = ntptr_EnumPrintServerForms(handle, mem_ctx, r);
795 W_ERROR_NOT_OK_RETURN(status);
796 break;
797 case NTPTR_HANDLE_PRINTER:
798 status = ntptr_EnumPrinterForms(handle, mem_ctx, r);
799 W_ERROR_NOT_OK_RETURN(status);
800 break;
801 default:
802 return WERR_FOOBAR;
805 *r->out.needed = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumForms, *r->out.info, r->in.level, *r->out.count);
806 *r->out.info = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
807 *r->out.count = SPOOLSS_BUFFER_OK(*r->out.count, 0);
808 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
813 spoolss_EnumPorts
815 static WERROR dcesrv_spoolss_EnumPorts(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
816 struct spoolss_EnumPorts *r)
818 struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private_data, struct ntptr_context);
819 WERROR status;
821 status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.servername);
822 W_ERROR_NOT_OK_RETURN(status);
824 status = ntptr_EnumPorts(ntptr, mem_ctx, r);
825 W_ERROR_NOT_OK_RETURN(status);
827 *r->out.needed = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPorts, *r->out.info, r->in.level, *r->out.count);
828 *r->out.info = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
829 *r->out.count = SPOOLSS_BUFFER_OK(*r->out.count, 0);
830 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
835 spoolss_EnumMonitors
837 static WERROR dcesrv_spoolss_EnumMonitors(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
838 struct spoolss_EnumMonitors *r)
840 struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private_data, struct ntptr_context);
841 WERROR status;
843 status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.servername);
844 W_ERROR_NOT_OK_RETURN(status);
846 status = ntptr_EnumMonitors(ntptr, mem_ctx, r);
847 W_ERROR_NOT_OK_RETURN(status);
849 *r->out.needed = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumMonitors, *r->out.info, r->in.level, *r->out.count);
850 *r->out.info = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
851 *r->out.count = SPOOLSS_BUFFER_OK(*r->out.count, 0);
852 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
857 spoolss_AddPort
859 static WERROR dcesrv_spoolss_AddPort(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
860 struct spoolss_AddPort *r)
862 return WERR_NOT_SUPPORTED;
867 spoolss_ConfigurePort
869 static WERROR dcesrv_spoolss_ConfigurePort(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
870 struct spoolss_ConfigurePort *r)
872 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
877 spoolss_DeletePort
879 static WERROR dcesrv_spoolss_DeletePort(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
880 struct spoolss_DeletePort *r)
882 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
887 spoolss_CreatePrinterIC
889 static WERROR dcesrv_spoolss_CreatePrinterIC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
890 struct spoolss_CreatePrinterIC *r)
892 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
897 spoolss_PlayGDIScriptOnPrinterIC
899 static WERROR dcesrv_spoolss_PlayGDIScriptOnPrinterIC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
900 struct spoolss_PlayGDIScriptOnPrinterIC *r)
902 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
907 spoolss_DeletePrinterIC
909 static WERROR dcesrv_spoolss_DeletePrinterIC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
910 struct spoolss_DeletePrinterIC *r)
912 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
917 spoolss_AddPrinterConnection
919 static WERROR dcesrv_spoolss_AddPrinterConnection(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
920 struct spoolss_AddPrinterConnection *r)
922 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
927 spoolss_DeletePrinterConnection
929 static WERROR dcesrv_spoolss_DeletePrinterConnection(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
930 struct spoolss_DeletePrinterConnection *r)
932 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
937 spoolss_PrinterMessageBox
939 static WERROR dcesrv_spoolss_PrinterMessageBox(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
940 struct spoolss_PrinterMessageBox *r)
942 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
947 spoolss_AddMonitor
949 static WERROR dcesrv_spoolss_AddMonitor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
950 struct spoolss_AddMonitor *r)
952 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
957 spoolss_DeleteMonitor
959 static WERROR dcesrv_spoolss_DeleteMonitor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
960 struct spoolss_DeleteMonitor *r)
962 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
967 spoolss_DeletePrintProcessor
969 static WERROR dcesrv_spoolss_DeletePrintProcessor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
970 struct spoolss_DeletePrintProcessor *r)
972 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
977 spoolss_AddPrintProvidor
979 static WERROR dcesrv_spoolss_AddPrintProvidor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
980 struct spoolss_AddPrintProvidor *r)
982 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
987 spoolss_DeletePrintProvidor
989 static WERROR dcesrv_spoolss_DeletePrintProvidor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
990 struct spoolss_DeletePrintProvidor *r)
992 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
997 spoolss_EnumPrintProcDataTypes
999 static WERROR dcesrv_spoolss_EnumPrintProcDataTypes(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1000 struct spoolss_EnumPrintProcDataTypes *r)
1002 return WERR_OK;
1007 spoolss_ResetPrinter
1009 static WERROR dcesrv_spoolss_ResetPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1010 struct spoolss_ResetPrinter *r)
1012 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1017 spoolss_GetPrinterDriver2
1019 static WERROR dcesrv_spoolss_GetPrinterDriver2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1020 struct spoolss_GetPrinterDriver2 *r)
1022 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1027 spoolss_FindFirstPrinterChangeNotification
1029 static WERROR dcesrv_spoolss_FindFirstPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1030 struct spoolss_FindFirstPrinterChangeNotification *r)
1032 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1037 spoolss_FindNextPrinterChangeNotification
1039 static WERROR dcesrv_spoolss_FindNextPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1040 struct spoolss_FindNextPrinterChangeNotification *r)
1042 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1047 spoolss_FindClosePrinterNotify
1049 static WERROR dcesrv_spoolss_FindClosePrinterNotify(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1050 struct spoolss_FindClosePrinterNotify *r)
1052 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1057 spoolss_RouterFindFirstPrinterChangeNotificationOld
1059 static WERROR dcesrv_spoolss_RouterFindFirstPrinterChangeNotificationOld(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1060 struct spoolss_RouterFindFirstPrinterChangeNotificationOld *r)
1062 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1067 spoolss_ReplyOpenPrinter
1069 static WERROR dcesrv_spoolss_ReplyOpenPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1070 struct spoolss_ReplyOpenPrinter *r)
1072 struct dcesrv_handle *handle;
1074 handle = dcesrv_handle_new(dce_call->context, SPOOLSS_NOTIFY);
1075 W_ERROR_HAVE_NO_MEMORY(handle);
1077 /* For now, just return a handle */
1079 *r->out.handle = handle->wire_handle;
1081 return WERR_OK;
1086 spoolss_RouterReplyPrinter
1088 static WERROR dcesrv_spoolss_RouterReplyPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1089 struct spoolss_RouterReplyPrinter *r)
1091 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1096 spoolss_ReplyClosePrinter
1098 static WERROR dcesrv_spoolss_ReplyClosePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1099 struct spoolss_ReplyClosePrinter *r)
1101 struct dcesrv_handle *handle;
1103 DCESRV_PULL_HANDLE_WERR(handle, r->in.handle, SPOOLSS_NOTIFY);
1105 talloc_free(handle);
1107 ZERO_STRUCTP(r->out.handle);
1109 return WERR_OK;
1113 spoolss_AddPortEx
1115 static WERROR dcesrv_spoolss_AddPortEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1116 struct spoolss_AddPortEx *r)
1118 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1123 spoolss_RouterFindFirstPrinterChangeNotification
1125 static WERROR dcesrv_spoolss_RouterFindFirstPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1126 struct spoolss_RouterFindFirstPrinterChangeNotification *r)
1128 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1133 spoolss_SpoolerInit
1135 static WERROR dcesrv_spoolss_SpoolerInit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1136 struct spoolss_SpoolerInit *r)
1138 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1143 spoolss_ResetPrinterEx
1145 static WERROR dcesrv_spoolss_ResetPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1146 struct spoolss_ResetPrinterEx *r)
1148 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1153 spoolss_RemoteFindFirstPrinterChangeNotifyEx
1155 static WERROR dcesrv_spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1156 struct spoolss_RemoteFindFirstPrinterChangeNotifyEx *r)
1158 struct dcerpc_pipe *p;
1159 char *binding_string;
1160 struct dcerpc_binding *binding;
1161 NTSTATUS status;
1162 struct spoolss_ReplyOpenPrinter rop;
1163 struct cli_credentials *creds;
1164 struct policy_handle notify_handle;
1166 DEBUG(2, ("Received RFFPCNex from %s\n", r->in.local_machine));
1169 * TODO: for now just open a connection to the client and drop it again
1170 * to keep the w2k3 PrintServer
1171 * happy to allow to open the Add Printer GUI
1172 * and the torture suite passing
1175 if (strncmp(r->in.local_machine, "\\\\", 2)) {
1176 return WERR_INVALID_COMPUTERNAME;
1179 binding_string = talloc_asprintf(mem_ctx, "ncacn_np:%s",
1180 r->in.local_machine+2);
1181 if (binding_string == NULL) {
1182 return WERR_NOMEM;
1185 status = dcerpc_parse_binding(mem_ctx, binding_string, &binding);
1186 if (!NT_STATUS_IS_OK(status)) {
1187 return ntstatus_to_werror(status);
1190 creds = cli_credentials_init_anon(mem_ctx); /* FIXME: Use machine credentials instead ? */
1192 status = dcerpc_pipe_connect_b(mem_ctx, &p, binding, &ndr_table_spoolss,
1193 creds, dce_call->event_ctx,
1194 dce_call->conn->dce_ctx->lp_ctx);
1196 if (NT_STATUS_IS_ERR(status)) {
1197 DEBUG(0, ("unable to call back to %s\n", r->in.local_machine));
1198 return WERR_SERVER_UNAVAILABLE;
1201 ZERO_STRUCT(rop);
1202 rop.in.server_name = lpcfg_netbios_name(dce_call->conn->dce_ctx->lp_ctx);
1203 W_ERROR_HAVE_NO_MEMORY(rop.in.server_name);
1204 rop.in.printer_local = 0;
1205 rop.in.type = REG_NONE;
1206 rop.in.bufsize = 0;
1207 rop.in.buffer = NULL;
1208 rop.out.handle = &notify_handle;
1210 status = dcerpc_spoolss_ReplyOpenPrinter_r(p->binding_handle, mem_ctx, &rop);
1211 if (NT_STATUS_IS_ERR(status)) {
1212 DEBUG(0, ("unable to open remote printer %s\n",
1213 r->in.local_machine));
1214 return WERR_SERVER_UNAVAILABLE;
1217 talloc_free(p);
1219 return WERR_OK;
1224 spoolss_RouterReplyPrinterEx
1226 static WERROR dcesrv_spoolss_RouterReplyPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1227 struct spoolss_RouterReplyPrinterEx *r)
1229 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1234 spoolss_RouterRefreshPrinterChangeNotify
1236 static WERROR dcesrv_spoolss_RouterRefreshPrinterChangeNotify(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1237 struct spoolss_RouterRefreshPrinterChangeNotify *r)
1239 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1244 spoolss_44
1246 static WERROR dcesrv_spoolss_44(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1247 struct spoolss_44 *r)
1249 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1253 spoolss_OpenPrinterEx
1255 static WERROR dcesrv_spoolss_OpenPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1256 struct spoolss_OpenPrinterEx *r)
1258 struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private_data, struct ntptr_context);
1259 struct ntptr_GenericHandle *handle;
1260 struct dcesrv_handle *h;
1261 const char *server;
1262 const char *object;
1263 enum ntptr_HandleType type;
1264 WERROR status;
1266 ZERO_STRUCTP(r->out.handle);
1268 status = dcesrv_spoolss_parse_printer_name(mem_ctx, r->in.printername, &server, &object, &type);
1269 W_ERROR_NOT_OK_RETURN(status);
1271 status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, server);
1272 W_ERROR_NOT_OK_RETURN(status);
1274 switch (type) {
1275 case NTPTR_HANDLE_SERVER:
1276 status = ntptr_OpenPrintServer(ntptr, mem_ctx, r, server, &handle);
1277 W_ERROR_NOT_OK_RETURN(status);
1278 break;
1279 case NTPTR_HANDLE_PORT:
1280 status = ntptr_OpenPort(ntptr, mem_ctx, r, object, &handle);
1281 W_ERROR_NOT_OK_RETURN(status);
1282 break;
1283 case NTPTR_HANDLE_MONITOR:
1284 status = ntptr_OpenMonitor(ntptr, mem_ctx, r, object, &handle);
1285 W_ERROR_NOT_OK_RETURN(status);
1286 break;
1287 case NTPTR_HANDLE_PRINTER:
1288 status = ntptr_OpenPrinter(ntptr, mem_ctx, r, object, &handle);
1289 W_ERROR_NOT_OK_RETURN(status);
1290 break;
1291 default:
1292 return WERR_FOOBAR;
1295 h = dcesrv_handle_new(dce_call->context, handle->type);
1296 W_ERROR_HAVE_NO_MEMORY(h);
1298 h->data = talloc_steal(h, handle);
1300 *r->out.handle = h->wire_handle;
1302 return WERR_OK;
1306 spoolss_AddPrinterEx
1308 static WERROR dcesrv_spoolss_AddPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1309 struct spoolss_AddPrinterEx *r)
1311 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1316 spoolss_SetPort
1318 static WERROR dcesrv_spoolss_SetPort(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1319 struct spoolss_SetPort *r)
1321 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1326 spoolss_EnumPrinterData
1328 static WERROR dcesrv_spoolss_EnumPrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1329 struct spoolss_EnumPrinterData *r)
1331 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1336 spoolss_DeletePrinterData
1338 static WERROR dcesrv_spoolss_DeletePrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1339 struct spoolss_DeletePrinterData *r)
1341 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1346 spoolss_4a
1348 static WERROR dcesrv_spoolss_4a(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1349 struct spoolss_4a *r)
1351 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1356 spoolss_4b
1358 static WERROR dcesrv_spoolss_4b(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1359 struct spoolss_4b *r)
1361 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1366 spoolss_4c
1368 static WERROR dcesrv_spoolss_4c(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1369 struct spoolss_4c *r)
1371 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1376 spoolss_SetPrinterDataEx
1378 static WERROR dcesrv_spoolss_SetPrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1379 struct spoolss_SetPrinterDataEx *r)
1381 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1386 spoolss_GetPrinterDataEx
1388 static WERROR dcesrv_spoolss_GetPrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1389 struct spoolss_GetPrinterDataEx *r)
1391 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1396 spoolss_EnumPrinterDataEx
1398 static WERROR dcesrv_spoolss_EnumPrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1399 struct spoolss_EnumPrinterDataEx *r)
1401 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1406 spoolss_EnumPrinterKey
1408 static WERROR dcesrv_spoolss_EnumPrinterKey(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1409 struct spoolss_EnumPrinterKey *r)
1411 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1416 spoolss_DeletePrinterDataEx
1418 static WERROR dcesrv_spoolss_DeletePrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1419 struct spoolss_DeletePrinterDataEx *r)
1421 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1426 spoolss_DeletePrinterKey
1428 static WERROR dcesrv_spoolss_DeletePrinterKey(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1429 struct spoolss_DeletePrinterKey *r)
1431 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1436 spoolss_53
1438 static WERROR dcesrv_spoolss_53(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1439 struct spoolss_53 *r)
1441 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1446 spoolss_DeletePrinterDriverEx
1448 static WERROR dcesrv_spoolss_DeletePrinterDriverEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1449 struct spoolss_DeletePrinterDriverEx *r)
1451 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1456 spoolss_AddPerMachineConnection
1458 static WERROR dcesrv_spoolss_AddPerMachineConnection(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1459 struct spoolss_AddPerMachineConnection *r)
1461 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1466 spoolss_DeletePerMachineConnection
1468 static WERROR dcesrv_spoolss_DeletePerMachineConnection(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1469 struct spoolss_DeletePerMachineConnection *r)
1471 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1476 spoolss_EnumPerMachineConnections
1478 static WERROR dcesrv_spoolss_EnumPerMachineConnections(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1479 struct spoolss_EnumPerMachineConnections *r)
1481 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1486 spoolss_XcvData
1488 static WERROR dcesrv_spoolss_XcvData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1489 struct spoolss_XcvData *r)
1491 struct ntptr_GenericHandle *handle;
1492 struct dcesrv_handle *h;
1493 WERROR status;
1495 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
1496 handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
1498 switch (handle->type) {
1499 case NTPTR_HANDLE_SERVER:
1500 status = ntptr_XcvDataPrintServer(handle, mem_ctx, r);
1501 W_ERROR_NOT_OK_RETURN(status);
1502 break;
1503 case NTPTR_HANDLE_PRINTER:
1504 status = ntptr_XcvDataPrinter(handle, mem_ctx, r);
1505 W_ERROR_NOT_OK_RETURN(status);
1506 break;
1507 case NTPTR_HANDLE_PORT:
1508 status = ntptr_XcvDataPort(handle, mem_ctx, r);
1509 W_ERROR_NOT_OK_RETURN(status);
1510 break;
1511 case NTPTR_HANDLE_MONITOR:
1512 status = ntptr_XcvDataMonitor(handle, mem_ctx, r);
1513 W_ERROR_NOT_OK_RETURN(status);
1514 break;
1515 default:
1516 return WERR_FOOBAR;
1519 /* TODO: handle the buffer sizes here! */
1520 return WERR_OK;
1525 spoolss_AddPrinterDriverEx
1527 static WERROR dcesrv_spoolss_AddPrinterDriverEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1528 struct spoolss_AddPrinterDriverEx *r)
1530 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1535 spoolss_5a
1537 static WERROR dcesrv_spoolss_5a(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1538 struct spoolss_5a *r)
1540 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1545 spoolss_5b
1547 static WERROR dcesrv_spoolss_5b(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1548 struct spoolss_5b *r)
1550 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1555 spoolss_5c
1557 static WERROR dcesrv_spoolss_5c(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1558 struct spoolss_5c *r)
1560 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1565 spoolss_5d
1567 static WERROR dcesrv_spoolss_5d(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1568 struct spoolss_5d *r)
1570 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1575 spoolss_5e
1577 static WERROR dcesrv_spoolss_5e(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1578 struct spoolss_5e *r)
1580 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1585 spoolss_5f
1587 static WERROR dcesrv_spoolss_5f(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1588 struct spoolss_5f *r)
1590 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1594 spoolss_60
1596 static WERROR dcesrv_spoolss_60(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1597 struct spoolss_60 *r)
1599 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1604 spoolss_RpcSendRecvBidiData
1606 static WERROR dcesrv_spoolss_RpcSendRecvBidiData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1607 struct spoolss_RpcSendRecvBidiData *r)
1609 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1614 spoolss_62
1616 static WERROR dcesrv_spoolss_62(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1617 struct spoolss_62 *r)
1619 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1624 spoolss_63
1626 static WERROR dcesrv_spoolss_63(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1627 struct spoolss_63 *r)
1629 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1634 spoolss_64
1636 static WERROR dcesrv_spoolss_64(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1637 struct spoolss_64 *r)
1639 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1644 spoolss_65
1646 static WERROR dcesrv_spoolss_65(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1647 struct spoolss_65 *r)
1649 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1654 spoolss_GetCorePrinterDrivers
1656 static WERROR dcesrv_spoolss_GetCorePrinterDrivers(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1657 struct spoolss_GetCorePrinterDrivers *r)
1659 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1664 spoolss_67
1666 static WERROR dcesrv_spoolss_67(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1667 struct spoolss_67 *r)
1669 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1674 spoolss_GetPrinterDriverPackagePath
1676 static WERROR dcesrv_spoolss_GetPrinterDriverPackagePath(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1677 struct spoolss_GetPrinterDriverPackagePath *r)
1679 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1684 spoolss_69
1686 static WERROR dcesrv_spoolss_69(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1687 struct spoolss_69 *r)
1689 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1694 spoolss_6a
1696 static WERROR dcesrv_spoolss_6a(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1697 struct spoolss_6a *r)
1699 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1704 spoolss_6b
1706 static WERROR dcesrv_spoolss_6b(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1707 struct spoolss_6b *r)
1709 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1714 spoolss_6c
1716 static WERROR dcesrv_spoolss_6c(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1717 struct spoolss_6c *r)
1719 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1724 spoolss_6d
1726 static WERROR dcesrv_spoolss_6d(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1727 struct spoolss_6d *r)
1729 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1734 spoolss_RpcGetJobNamedPropertyValue
1736 static WERROR dcesrv_spoolss_RpcGetJobNamedPropertyValue(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1737 struct spoolss_RpcGetJobNamedPropertyValue *r)
1739 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1744 spoolss_RpcSetJobNamedProperty
1746 static WERROR dcesrv_spoolss_RpcSetJobNamedProperty(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1747 struct spoolss_RpcSetJobNamedProperty *r)
1749 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1754 spoolss_RpcDeleteJobNamedProperty
1756 static WERROR dcesrv_spoolss_RpcDeleteJobNamedProperty(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1757 struct spoolss_RpcDeleteJobNamedProperty *r)
1759 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1763 spoolss_RpcEnumJobNamedProperties
1765 static WERROR dcesrv_spoolss_RpcEnumJobNamedProperties(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1766 struct spoolss_RpcEnumJobNamedProperties *r)
1768 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1771 /* include the generated boilerplate */
1772 #include "librpc/gen_ndr/ndr_spoolss_s.c"