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/>.
24 #include "rpc_server/dcerpc_server.h"
25 #include "librpc/gen_ndr/ndr_spoolss.h"
26 #include "rpc_server/common/common.h"
27 #include "ntptr/ntptr.h"
28 #include "lib/socket/socket.h"
29 #include "smbd/service_stream.h"
30 #include "librpc/gen_ndr/ndr_spoolss_c.h"
31 #include "auth/credentials/credentials.h"
37 #define SPOOLSS_BUFFER_UNION(fn,info,level) \
38 ((info)?ndr_size_##fn(info, level, 0):0)
40 #define SPOOLSS_BUFFER_UNION_ARRAY(fn,info,level,count) \
41 ((info)?ndr_size_##fn##_info(dce_call, level, count, info):0)
43 #define SPOOLSS_BUFFER_OK(val_true,val_false) ((r->in.offered >= r->out.needed)?val_true:val_false)
45 static WERROR dcesrv_spoolss_parse_printer_name(TALLOC_CTX *mem_ctx, const char *name,
46 const char **_server_name,
47 const char **_object_name,
48 enum ntptr_HandleType *_object_type)
52 char *server_unc = NULL;
53 const char *object = name;
55 /* no printername is there it's like open server */
59 *_object_type = NTPTR_HANDLE_SERVER;
63 /* just "\\" is invalid */
64 if (strequal("\\\\", name)) {
65 return WERR_INVALID_PRINTER_NAME;
68 if (strncmp("\\\\", name, 2) == 0) {
69 server_unc = talloc_strdup(mem_ctx, name);
70 W_ERROR_HAVE_NO_MEMORY(server_unc);
71 server = server_unc + 2;
73 /* here we know we have "\\" in front not followed
74 * by '\0', now see if we have another "\" in the string
76 p = strchr_m(server, '\\');
78 /* there's no other "\", so it's ("\\%s",server)
80 *_server_name = server_unc;
82 *_object_type = NTPTR_HANDLE_SERVER;
85 /* here we know that we have ("\\%s\",server),
86 * if we have '\0' as next then it's an invalid name
87 * otherwise the printer_name
90 /* everything that follows is the printer name */
94 /* just "" as server is invalid */
95 if (strequal(server, "")) {
96 return WERR_INVALID_PRINTER_NAME;
100 /* just "" is invalid */
101 if (strequal(object, "")) {
102 return WERR_INVALID_PRINTER_NAME;
105 #define XCV_PORT ",XcvPort "
106 #define XCV_MONITOR ",XcvMonitor "
107 if (strncmp(object, XCV_PORT, strlen(XCV_PORT)) == 0) {
108 object += strlen(XCV_PORT);
110 /* just "" is invalid */
111 if (strequal(object, "")) {
112 return WERR_INVALID_PRINTER_NAME;
115 *_server_name = server_unc;
116 *_object_name = object;
117 *_object_type = NTPTR_HANDLE_PORT;
119 } else if (strncmp(object, XCV_MONITOR, strlen(XCV_MONITOR)) == 0) {
120 object += strlen(XCV_MONITOR);
122 /* just "" is invalid */
123 if (strequal(object, "")) {
124 return WERR_INVALID_PRINTER_NAME;
127 *_server_name = server_unc;
128 *_object_name = object;
129 *_object_type = NTPTR_HANDLE_MONITOR;
133 *_server_name = server_unc;
134 *_object_name = object;
135 *_object_type = NTPTR_HANDLE_PRINTER;
140 * Check server_name is:
141 * - "" , functions that don't allow "",
142 * should check that on their own, before calling this function
143 * - our name (only netbios yet, TODO: need to test dns name!)
144 * - our ip address of the current use socket
145 * otherwise return WERR_INVALID_PRINTER_NAME
147 static WERROR dcesrv_spoolss_check_server_name(struct dcesrv_call_state *dce_call,
149 const char *server_name)
152 struct socket_address *myaddr;
153 const char **aliases;
157 if (!server_name) return WERR_OK;
160 ret = strequal("",server_name);
161 if (ret) return WERR_OK;
163 /* just "\\" is invalid */
164 if (strequal("\\\\", server_name)) {
165 return WERR_INVALID_PRINTER_NAME;
168 /* then we need "\\" */
169 if (strncmp("\\\\", server_name, 2) != 0) {
170 return WERR_INVALID_PRINTER_NAME;
175 /* NETBIOS NAME is ok */
176 ret = strequal(lp_netbios_name(), server_name);
177 if (ret) return WERR_OK;
179 aliases = lp_netbios_aliases();
181 for (i=0; aliases && aliases[i]; i++) {
182 if (strequal(aliases[i], server_name)) {
188 * TODO: we need to check if aliases are also ok
193 str = talloc_asprintf(mem_ctx, "%s.%s",
196 W_ERROR_HAVE_NO_MEMORY(str);
198 ret = strequal(str, server_name);
200 if (ret) return WERR_OK;
203 myaddr = dcesrv_connection_get_my_addr(dce_call->conn, mem_ctx);
204 W_ERROR_HAVE_NO_MEMORY(myaddr);
206 ret = strequal(myaddr->addr, server_name);
208 if (ret) return WERR_OK;
210 return WERR_INVALID_PRINTER_NAME;
213 static NTSTATUS dcerpc_spoolss_bind(struct dcesrv_call_state *dce_call, const struct dcesrv_interface *iface)
216 struct ntptr_context *ntptr;
218 status = ntptr_init_context(dce_call->context, lp_ntptr_providor(), &ntptr);
219 NT_STATUS_NOT_OK_RETURN(status);
221 dce_call->context->private = ntptr;
226 #define DCESRV_INTERFACE_SPOOLSS_BIND dcerpc_spoolss_bind
231 static WERROR dcesrv_spoolss_EnumPrinters(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
232 struct spoolss_EnumPrinters *r)
234 struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private, struct ntptr_context);
237 status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.server);
238 W_ERROR_NOT_OK_RETURN(status);
240 status = ntptr_EnumPrinters(ntptr, mem_ctx, r);
241 W_ERROR_NOT_OK_RETURN(status);
243 r->out.needed = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPrinters, r->out.info, r->in.level, r->out.count);
244 r->out.info = SPOOLSS_BUFFER_OK(r->out.info, NULL);
245 r->out.count = SPOOLSS_BUFFER_OK(r->out.count, 0);
246 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
249 static WERROR dcesrv_spoolss_OpenPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
250 struct spoolss_OpenPrinterEx *r);
254 static WERROR dcesrv_spoolss_OpenPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
255 struct spoolss_OpenPrinter *r)
258 struct spoolss_OpenPrinterEx *r2;
260 r2 = talloc(mem_ctx, struct spoolss_OpenPrinterEx);
261 W_ERROR_HAVE_NO_MEMORY(r2);
263 r2->in.printername = r->in.printername;
264 r2->in.datatype = r->in.datatype;
265 r2->in.devmode_ctr = r->in.devmode_ctr;
266 r2->in.access_mask = r->in.access_mask;
268 r2->in.userlevel.level1 = NULL;
270 r2->out.handle = r->out.handle;
272 /* TODO: we should take care about async replies here,
273 if spoolss_OpenPrinterEx() would be async!
275 status = dcesrv_spoolss_OpenPrinterEx(dce_call, mem_ctx, r2);
277 r->out.handle = r2->out.handle;
286 static WERROR dcesrv_spoolss_SetJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
287 struct spoolss_SetJob *r)
289 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
296 static WERROR dcesrv_spoolss_GetJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
297 struct spoolss_GetJob *r)
299 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
306 static WERROR dcesrv_spoolss_EnumJobs(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
307 struct spoolss_EnumJobs *r)
316 static WERROR dcesrv_spoolss_AddPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
317 struct spoolss_AddPrinter *r)
319 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
324 spoolss_DeletePrinter
326 static WERROR dcesrv_spoolss_DeletePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
327 struct spoolss_DeletePrinter *r)
329 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
336 static WERROR dcesrv_spoolss_SetPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
337 struct spoolss_SetPrinter *r)
339 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
346 static WERROR dcesrv_spoolss_GetPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
347 struct spoolss_GetPrinter *r)
349 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
354 spoolss_AddPrinterDriver
356 static WERROR dcesrv_spoolss_AddPrinterDriver(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
357 struct spoolss_AddPrinterDriver *r)
359 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
364 spoolss_EnumPrinterDrivers
366 static WERROR dcesrv_spoolss_EnumPrinterDrivers(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
367 struct spoolss_EnumPrinterDrivers *r)
369 struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private, struct ntptr_context);
372 status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.server);
373 W_ERROR_NOT_OK_RETURN(status);
375 status = ntptr_EnumPrinterDrivers(ntptr, mem_ctx, r);
376 W_ERROR_NOT_OK_RETURN(status);
378 r->out.needed = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPrinterDrivers, r->out.info, r->in.level, r->out.count);
379 r->out.info = SPOOLSS_BUFFER_OK(r->out.info, NULL);
380 r->out.count = SPOOLSS_BUFFER_OK(r->out.count, 0);
381 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
386 spoolss_GetPrinterDriver
388 static WERROR dcesrv_spoolss_GetPrinterDriver(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
389 struct spoolss_GetPrinterDriver *r)
391 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
396 spoolss_GetPrinterDriverDirectory
398 static WERROR dcesrv_spoolss_GetPrinterDriverDirectory(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
399 struct spoolss_GetPrinterDriverDirectory *r)
401 struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private, struct ntptr_context);
404 status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.server);
405 W_ERROR_NOT_OK_RETURN(status);
407 status = ntptr_GetPrinterDriverDirectory(ntptr, mem_ctx, r);
408 W_ERROR_NOT_OK_RETURN(status);
410 r->out.needed = SPOOLSS_BUFFER_UNION(spoolss_DriverDirectoryInfo, r->out.info, r->in.level);
411 r->out.info = SPOOLSS_BUFFER_OK(r->out.info, NULL);
412 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
417 spoolss_DeletePrinterDriver
419 static WERROR dcesrv_spoolss_DeletePrinterDriver(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
420 struct spoolss_DeletePrinterDriver *r)
422 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
427 spoolss_AddPrintProcessor
429 static WERROR dcesrv_spoolss_AddPrintProcessor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
430 struct spoolss_AddPrintProcessor *r)
432 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
437 spoolss_EnumPrintProcessors
439 static WERROR dcesrv_spoolss_EnumPrintProcessors(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
440 struct spoolss_EnumPrintProcessors *r)
447 spoolss_GetPrintProcessorDirectory
449 static WERROR dcesrv_spoolss_GetPrintProcessorDirectory(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
450 struct spoolss_GetPrintProcessorDirectory *r)
452 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
457 spoolss_StartDocPrinter
459 static WERROR dcesrv_spoolss_StartDocPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
460 struct spoolss_StartDocPrinter *r)
462 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
467 spoolss_StartPagePrinter
469 static WERROR dcesrv_spoolss_StartPagePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
470 struct spoolss_StartPagePrinter *r)
472 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
479 static WERROR dcesrv_spoolss_WritePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
480 struct spoolss_WritePrinter *r)
482 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
487 spoolss_EndPagePrinter
489 static WERROR dcesrv_spoolss_EndPagePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
490 struct spoolss_EndPagePrinter *r)
492 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
499 static WERROR dcesrv_spoolss_AbortPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
500 struct spoolss_AbortPrinter *r)
502 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
509 static WERROR dcesrv_spoolss_ReadPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
510 struct spoolss_ReadPrinter *r)
512 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
517 spoolss_EndDocPrinter
519 static WERROR dcesrv_spoolss_EndDocPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
520 struct spoolss_EndDocPrinter *r)
522 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
529 static WERROR dcesrv_spoolss_AddJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
530 struct spoolss_AddJob *r)
532 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
539 static WERROR dcesrv_spoolss_ScheduleJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
540 struct spoolss_ScheduleJob *r)
542 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
547 spoolss_GetPrinterData
549 static WERROR dcesrv_spoolss_GetPrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
550 struct spoolss_GetPrinterData *r)
552 struct ntptr_GenericHandle *handle;
553 struct dcesrv_handle *h;
556 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
557 handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
561 switch (handle->type) {
562 case NTPTR_HANDLE_SERVER:
563 status = ntptr_GetPrintServerData(handle, mem_ctx, r);
566 status = WERR_FOOBAR;
570 W_ERROR_NOT_OK_RETURN(status);
572 r->out.needed = ndr_size_spoolss_PrinterData(&r->out.data, r->out.type, 0);
573 r->out.type = SPOOLSS_BUFFER_OK(r->out.type, SPOOLSS_PRINTER_DATA_TYPE_NULL);
574 r->out.data = SPOOLSS_BUFFER_OK(r->out.data, r->out.data);
575 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_MORE_DATA);
580 spoolss_SetPrinterData
582 static WERROR dcesrv_spoolss_SetPrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
583 struct spoolss_SetPrinterData *r)
585 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
590 spoolss_WaitForPrinterChange
592 static WERROR dcesrv_spoolss_WaitForPrinterChange(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
593 struct spoolss_WaitForPrinterChange *r)
595 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
602 static WERROR dcesrv_spoolss_ClosePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
603 struct spoolss_ClosePrinter *r)
605 struct dcesrv_handle *h;
607 *r->out.handle = *r->in.handle;
609 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
613 ZERO_STRUCTP(r->out.handle);
622 static WERROR dcesrv_spoolss_AddForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
623 struct spoolss_AddForm *r)
625 struct ntptr_GenericHandle *handle;
626 struct dcesrv_handle *h;
629 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
630 handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
634 switch (handle->type) {
635 case NTPTR_HANDLE_SERVER:
636 status = ntptr_AddPrintServerForm(handle, mem_ctx, r);
637 W_ERROR_NOT_OK_RETURN(status);
639 case NTPTR_HANDLE_PRINTER:
640 status = ntptr_AddPrinterForm(handle, mem_ctx, r);
641 W_ERROR_NOT_OK_RETURN(status);
654 static WERROR dcesrv_spoolss_DeleteForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
655 struct spoolss_DeleteForm *r)
657 struct ntptr_GenericHandle *handle;
658 struct dcesrv_handle *h;
661 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
662 handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
666 switch (handle->type) {
667 case NTPTR_HANDLE_SERVER:
668 status = ntptr_DeletePrintServerForm(handle, mem_ctx, r);
669 W_ERROR_NOT_OK_RETURN(status);
671 case NTPTR_HANDLE_PRINTER:
672 status = ntptr_DeletePrinterForm(handle, mem_ctx, r);
673 W_ERROR_NOT_OK_RETURN(status);
686 static WERROR dcesrv_spoolss_GetForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
687 struct spoolss_GetForm *r)
689 struct ntptr_GenericHandle *handle;
690 struct dcesrv_handle *h;
693 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
694 handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
698 switch (handle->type) {
699 case NTPTR_HANDLE_SERVER:
701 * stupid, but w2k3 returns WERR_BADFID here?
704 case NTPTR_HANDLE_PRINTER:
705 status = ntptr_GetPrinterForm(handle, mem_ctx, r);
706 W_ERROR_NOT_OK_RETURN(status);
712 r->out.needed = SPOOLSS_BUFFER_UNION(spoolss_FormInfo, r->out.info, r->in.level);
713 r->out.info = SPOOLSS_BUFFER_OK(r->out.info, NULL);
714 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
721 static WERROR dcesrv_spoolss_SetForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
722 struct spoolss_SetForm *r)
724 struct ntptr_GenericHandle *handle;
725 struct dcesrv_handle *h;
728 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
729 handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
733 switch (handle->type) {
734 case NTPTR_HANDLE_SERVER:
735 status = ntptr_SetPrintServerForm(handle, mem_ctx, r);
736 W_ERROR_NOT_OK_RETURN(status);
738 case NTPTR_HANDLE_PRINTER:
739 status = ntptr_SetPrinterForm(handle, mem_ctx, r);
740 W_ERROR_NOT_OK_RETURN(status);
753 static WERROR dcesrv_spoolss_EnumForms(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
754 struct spoolss_EnumForms *r)
756 struct ntptr_GenericHandle *handle;
757 struct dcesrv_handle *h;
760 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
761 handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
765 switch (handle->type) {
766 case NTPTR_HANDLE_SERVER:
767 status = ntptr_EnumPrintServerForms(handle, mem_ctx, r);
768 W_ERROR_NOT_OK_RETURN(status);
770 case NTPTR_HANDLE_PRINTER:
771 status = ntptr_EnumPrinterForms(handle, mem_ctx, r);
772 W_ERROR_NOT_OK_RETURN(status);
778 r->out.needed = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumForms, r->out.info, r->in.level, r->out.count);
779 r->out.info = SPOOLSS_BUFFER_OK(r->out.info, NULL);
780 r->out.count = SPOOLSS_BUFFER_OK(r->out.count, 0);
781 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
788 static WERROR dcesrv_spoolss_EnumPorts(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
789 struct spoolss_EnumPorts *r)
791 struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private, struct ntptr_context);
794 status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.servername);
795 W_ERROR_NOT_OK_RETURN(status);
797 status = ntptr_EnumPorts(ntptr, mem_ctx, r);
798 W_ERROR_NOT_OK_RETURN(status);
800 r->out.needed = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPorts, r->out.info, r->in.level, r->out.count);
801 r->out.info = SPOOLSS_BUFFER_OK(r->out.info, NULL);
802 r->out.count = SPOOLSS_BUFFER_OK(r->out.count, 0);
803 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
810 static WERROR dcesrv_spoolss_EnumMonitors(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
811 struct spoolss_EnumMonitors *r)
813 struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private, struct ntptr_context);
816 status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.servername);
817 W_ERROR_NOT_OK_RETURN(status);
819 status = ntptr_EnumMonitors(ntptr, mem_ctx, r);
820 W_ERROR_NOT_OK_RETURN(status);
822 r->out.needed = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumMonitors, r->out.info, r->in.level, r->out.count);
823 r->out.info = SPOOLSS_BUFFER_OK(r->out.info, NULL);
824 r->out.count = SPOOLSS_BUFFER_OK(r->out.count, 0);
825 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
832 static WERROR dcesrv_spoolss_AddPort(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
833 struct spoolss_AddPort *r)
835 return WERR_NOT_SUPPORTED;
840 spoolss_ConfigurePort
842 static WERROR dcesrv_spoolss_ConfigurePort(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
843 struct spoolss_ConfigurePort *r)
845 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
852 static WERROR dcesrv_spoolss_DeletePort(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
853 struct spoolss_DeletePort *r)
855 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
860 spoolss_CreatePrinterIC
862 static WERROR dcesrv_spoolss_CreatePrinterIC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
863 struct spoolss_CreatePrinterIC *r)
865 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
870 spoolss_PlayGDIScriptOnPrinterIC
872 static WERROR dcesrv_spoolss_PlayGDIScriptOnPrinterIC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
873 struct spoolss_PlayGDIScriptOnPrinterIC *r)
875 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
880 spoolss_DeletePrinterIC
882 static WERROR dcesrv_spoolss_DeletePrinterIC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
883 struct spoolss_DeletePrinterIC *r)
885 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
890 spoolss_AddPrinterConnection
892 static WERROR dcesrv_spoolss_AddPrinterConnection(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
893 struct spoolss_AddPrinterConnection *r)
895 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
900 spoolss_DeletePrinterConnection
902 static WERROR dcesrv_spoolss_DeletePrinterConnection(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
903 struct spoolss_DeletePrinterConnection *r)
905 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
910 spoolss_PrinterMessageBox
912 static WERROR dcesrv_spoolss_PrinterMessageBox(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
913 struct spoolss_PrinterMessageBox *r)
915 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
922 static WERROR dcesrv_spoolss_AddMonitor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
923 struct spoolss_AddMonitor *r)
925 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
930 spoolss_DeleteMonitor
932 static WERROR dcesrv_spoolss_DeleteMonitor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
933 struct spoolss_DeleteMonitor *r)
935 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
940 spoolss_DeletePrintProcessor
942 static WERROR dcesrv_spoolss_DeletePrintProcessor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
943 struct spoolss_DeletePrintProcessor *r)
945 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
950 spoolss_AddPrintProvidor
952 static WERROR dcesrv_spoolss_AddPrintProvidor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
953 struct spoolss_AddPrintProvidor *r)
955 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
960 spoolss_DeletePrintProvidor
962 static WERROR dcesrv_spoolss_DeletePrintProvidor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
963 struct spoolss_DeletePrintProvidor *r)
965 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
970 spoolss_EnumPrintProcDataTypes
972 static WERROR dcesrv_spoolss_EnumPrintProcDataTypes(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
973 struct spoolss_EnumPrintProcDataTypes *r)
975 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
982 static WERROR dcesrv_spoolss_ResetPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
983 struct spoolss_ResetPrinter *r)
985 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
990 spoolss_GetPrinterDriver2
992 static WERROR dcesrv_spoolss_GetPrinterDriver2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
993 struct spoolss_GetPrinterDriver2 *r)
995 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1000 spoolss_FindFirstPrinterChangeNotification
1002 static WERROR dcesrv_spoolss_FindFirstPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1003 struct spoolss_FindFirstPrinterChangeNotification *r)
1005 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1010 spoolss_FindNextPrinterChangeNotification
1012 static WERROR dcesrv_spoolss_FindNextPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1013 struct spoolss_FindNextPrinterChangeNotification *r)
1015 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1020 spoolss_FindClosePrinterNotify
1022 static WERROR dcesrv_spoolss_FindClosePrinterNotify(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1023 struct spoolss_FindClosePrinterNotify *r)
1025 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1030 spoolss_RouterFindFirstPrinterChangeNotificationOld
1032 static WERROR dcesrv_spoolss_RouterFindFirstPrinterChangeNotificationOld(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1033 struct spoolss_RouterFindFirstPrinterChangeNotificationOld *r)
1035 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1040 spoolss_ReplyOpenPrinter
1042 static WERROR dcesrv_spoolss_ReplyOpenPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1043 struct spoolss_ReplyOpenPrinter *r)
1045 struct dcesrv_handle *handle;
1047 handle = dcesrv_handle_new(dce_call->context, SPOOLSS_NOTIFY);
1048 W_ERROR_HAVE_NO_MEMORY(handle);
1050 /* For now, just return a handle */
1052 *r->out.handle = handle->wire_handle;
1059 spoolss_RouterReplyPrinter
1061 static WERROR dcesrv_spoolss_RouterReplyPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1062 struct spoolss_RouterReplyPrinter *r)
1064 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1069 spoolss_ReplyClosePrinter
1071 static WERROR dcesrv_spoolss_ReplyClosePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1072 struct spoolss_ReplyClosePrinter *r)
1074 struct dcesrv_handle *handle;
1076 DCESRV_PULL_HANDLE_WERR(handle, r->in.handle, SPOOLSS_NOTIFY);
1078 talloc_free(handle);
1080 ZERO_STRUCTP(r->out.handle);
1088 static WERROR dcesrv_spoolss_AddPortEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1089 struct spoolss_AddPortEx *r)
1091 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1096 spoolss_RouterFindFirstPrinterChangeNotification
1098 static WERROR dcesrv_spoolss_RouterFindFirstPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1099 struct spoolss_RouterFindFirstPrinterChangeNotification *r)
1101 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1108 static WERROR dcesrv_spoolss_SpoolerInit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1109 struct spoolss_SpoolerInit *r)
1111 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1116 spoolss_ResetPrinterEx
1118 static WERROR dcesrv_spoolss_ResetPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1119 struct spoolss_ResetPrinterEx *r)
1121 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1126 spoolss_RemoteFindFirstPrinterChangeNotifyEx
1128 static WERROR dcesrv_spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1129 struct spoolss_RemoteFindFirstPrinterChangeNotifyEx *r)
1131 struct dcerpc_pipe *p;
1132 struct dcerpc_binding *binding;
1134 struct spoolss_ReplyOpenPrinter rop;
1135 struct cli_credentials *creds;
1136 struct policy_handle notify_handle;
1138 DEBUG(2, ("Received RFFPCNex from %s\n", r->in.str));
1141 * TODO: for now just open a connection to the client and drop it again
1142 * to keep the w2k3 PrintServer
1143 * happy to allow to open the Add Printer GUI
1144 * and the torture suite passing
1147 binding = talloc_zero(mem_ctx, struct dcerpc_binding);
1149 binding->transport = NCACN_NP;
1150 if (strncmp(r->in.str, "\\\\", 2))
1151 return WERR_INVALID_COMPUTERNAME;
1152 binding->host = r->in.str+2;
1154 creds = cli_credentials_init_anon(mem_ctx); /* FIXME: Use machine credentials instead ? */
1156 status = dcerpc_pipe_connect_b(mem_ctx, &p, binding, &ndr_table_spoolss,
1159 if (NT_STATUS_IS_ERR(status)) {
1160 DEBUG(0, ("unable to call back to %s\n", r->in.str));
1161 return WERR_SERVER_UNAVAILABLE;
1165 rop.in.server_name = lp_netbios_name();
1166 W_ERROR_HAVE_NO_MEMORY(rop.in.server_name);
1167 rop.in.printer_local = 0;
1168 rop.in.type = REG_NONE;
1169 rop.in.unknown1 = 0;
1170 rop.in.unknown2 = 0;
1171 rop.out.handle = ¬ify_handle;
1173 status = dcerpc_spoolss_ReplyOpenPrinter(p, mem_ctx, &rop);
1174 if (NT_STATUS_IS_ERR(status)) {
1175 DEBUG(0, ("unable to open remote printer %s\n", r->in.str));
1176 return WERR_SERVER_UNAVAILABLE;
1186 spoolss_RouterRefreshPrinterChangeNotification
1188 static WERROR dcesrv_spoolss_RouterRefreshPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1189 struct spoolss_RouterRefreshPrinterChangeNotification *r)
1191 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1196 spoolss_RemoteFindNextPrinterChangeNotifyEx
1198 static WERROR dcesrv_spoolss_RemoteFindNextPrinterChangeNotifyEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1199 struct spoolss_RemoteFindNextPrinterChangeNotifyEx *r)
1201 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1208 static WERROR dcesrv_spoolss_44(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1209 struct spoolss_44 *r)
1211 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1215 spoolss_OpenPrinterEx
1217 static WERROR dcesrv_spoolss_OpenPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1218 struct spoolss_OpenPrinterEx *r)
1220 struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private, struct ntptr_context);
1221 struct ntptr_GenericHandle *handle;
1222 struct dcesrv_handle *h;
1225 enum ntptr_HandleType type;
1228 ZERO_STRUCTP(r->out.handle);
1230 status = dcesrv_spoolss_parse_printer_name(mem_ctx, r->in.printername, &server, &object, &type);
1231 W_ERROR_NOT_OK_RETURN(status);
1233 status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, server);
1234 W_ERROR_NOT_OK_RETURN(status);
1237 case NTPTR_HANDLE_SERVER:
1238 status = ntptr_OpenPrintServer(ntptr, mem_ctx, r, server, &handle);
1239 W_ERROR_NOT_OK_RETURN(status);
1241 case NTPTR_HANDLE_PORT:
1242 status = ntptr_OpenPort(ntptr, mem_ctx, r, object, &handle);
1243 W_ERROR_NOT_OK_RETURN(status);
1245 case NTPTR_HANDLE_MONITOR:
1246 status = ntptr_OpenMonitor(ntptr, mem_ctx, r, object, &handle);
1247 W_ERROR_NOT_OK_RETURN(status);
1249 case NTPTR_HANDLE_PRINTER:
1250 status = ntptr_OpenPrinter(ntptr, mem_ctx, r, object, &handle);
1251 W_ERROR_NOT_OK_RETURN(status);
1257 h = dcesrv_handle_new(dce_call->context, handle->type);
1258 W_ERROR_HAVE_NO_MEMORY(h);
1260 h->data = talloc_steal(h, handle);
1262 *r->out.handle = h->wire_handle;
1268 spoolss_AddPrinterEx
1270 static WERROR dcesrv_spoolss_AddPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1271 struct spoolss_AddPrinterEx *r)
1273 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1280 static WERROR dcesrv_spoolss_47(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1281 struct spoolss_47 *r)
1283 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1288 spoolss_EnumPrinterData
1290 static WERROR dcesrv_spoolss_EnumPrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1291 struct spoolss_EnumPrinterData *r)
1293 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1298 spoolss_DeletePrinterData
1300 static WERROR dcesrv_spoolss_DeletePrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1301 struct spoolss_DeletePrinterData *r)
1303 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1310 static WERROR dcesrv_spoolss_4a(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1311 struct spoolss_4a *r)
1313 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1320 static WERROR dcesrv_spoolss_4b(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1321 struct spoolss_4b *r)
1323 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1330 static WERROR dcesrv_spoolss_4c(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1331 struct spoolss_4c *r)
1333 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1338 spoolss_SetPrinterDataEx
1340 static WERROR dcesrv_spoolss_SetPrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1341 struct spoolss_SetPrinterDataEx *r)
1343 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1348 spoolss_GetPrinterDataEx
1350 static WERROR dcesrv_spoolss_GetPrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1351 struct spoolss_GetPrinterDataEx *r)
1353 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1358 spoolss_EnumPrinterDataEx
1360 static WERROR dcesrv_spoolss_EnumPrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1361 struct spoolss_EnumPrinterDataEx *r)
1363 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1368 spoolss_EnumPrinterKey
1370 static WERROR dcesrv_spoolss_EnumPrinterKey(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1371 struct spoolss_EnumPrinterKey *r)
1373 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1378 spoolss_DeletePrinterDataEx
1380 static WERROR dcesrv_spoolss_DeletePrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1381 struct spoolss_DeletePrinterDataEx *r)
1383 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1388 spoolss_DeletePrinterKey
1390 static WERROR dcesrv_spoolss_DeletePrinterKey(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1391 struct spoolss_DeletePrinterKey *r)
1393 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1400 static WERROR dcesrv_spoolss_53(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1401 struct spoolss_53 *r)
1403 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1408 spoolss_DeletePrinterDriverEx
1410 static WERROR dcesrv_spoolss_DeletePrinterDriverEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1411 struct spoolss_DeletePrinterDriverEx *r)
1413 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1420 static WERROR dcesrv_spoolss_55(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1421 struct spoolss_55 *r)
1423 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1430 static WERROR dcesrv_spoolss_56(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1431 struct spoolss_56 *r)
1433 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1440 static WERROR dcesrv_spoolss_57(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1441 struct spoolss_57 *r)
1443 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1450 static WERROR dcesrv_spoolss_XcvData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1451 struct spoolss_XcvData *r)
1453 struct ntptr_GenericHandle *handle;
1454 struct dcesrv_handle *h;
1457 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
1458 handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
1460 switch (handle->type) {
1461 case NTPTR_HANDLE_SERVER:
1462 status = ntptr_XcvDataPrintServer(handle, mem_ctx, r);
1463 W_ERROR_NOT_OK_RETURN(status);
1465 case NTPTR_HANDLE_PRINTER:
1466 status = ntptr_XcvDataPrinter(handle, mem_ctx, r);
1467 W_ERROR_NOT_OK_RETURN(status);
1469 case NTPTR_HANDLE_PORT:
1470 status = ntptr_XcvDataPort(handle, mem_ctx, r);
1471 W_ERROR_NOT_OK_RETURN(status);
1473 case NTPTR_HANDLE_MONITOR:
1474 status = ntptr_XcvDataMonitor(handle, mem_ctx, r);
1475 W_ERROR_NOT_OK_RETURN(status);
1481 /* TODO: handle the buffer sizes here! */
1487 spoolss_AddPrinterDriverEx
1489 static WERROR dcesrv_spoolss_AddPrinterDriverEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1490 struct spoolss_AddPrinterDriverEx *r)
1492 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1499 static WERROR dcesrv_spoolss_5a(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1500 struct spoolss_5a *r)
1502 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1509 static WERROR dcesrv_spoolss_5b(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1510 struct spoolss_5b *r)
1512 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1519 static WERROR dcesrv_spoolss_5c(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1520 struct spoolss_5c *r)
1522 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1529 static WERROR dcesrv_spoolss_5d(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1530 struct spoolss_5d *r)
1532 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1539 static WERROR dcesrv_spoolss_5e(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1540 struct spoolss_5e *r)
1542 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1549 static WERROR dcesrv_spoolss_5f(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1550 struct spoolss_5f *r)
1552 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1556 /* include the generated boilerplate */
1557 #include "librpc/gen_ndr/ndr_spoolss_s.c"