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 2 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, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 #include "rpc_server/dcerpc_server.h"
26 #include "librpc/gen_ndr/ndr_spoolss.h"
27 #include "rpc_server/common/common.h"
28 #include "rpc_server/spoolss/dcesrv_spoolss.h"
29 #include "lib/socket/socket.h"
30 #include "smbd/service_stream.h"
32 #define SPOOLSS_BUFFER_SIZE(fn,level,count,info) \
33 ndr_size_##fn##_info(dce_call, level, count, info)
35 #define SPOOLSS_BUFFER_OK(val_true,val_false) ((*r->in.buf_size >= *r->out.buf_size)?val_true:val_false)
40 static WERROR spoolss_EnumPrinters(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
41 struct spoolss_EnumPrinters *r)
44 struct ldb_message **msgs;
47 union spoolss_PrinterInfo *info;
51 spoolss_ctx = spoolssdb_connect();
52 W_ERROR_HAVE_NO_MEMORY(spoolss_ctx);
54 count = spoolssdb_search(spoolss_ctx, mem_ctx, NULL, &msgs, NULL,
55 "(&(objectclass=printer))");
56 spoolssdb_close(spoolss_ctx);
58 if (count == 0) return WERR_OK;
59 if (count < 0) return WERR_GENERAL_FAILURE;
61 info = talloc_array(mem_ctx, union spoolss_PrinterInfo, count);
62 W_ERROR_HAVE_NO_MEMORY(info);
66 for (i = 0; i < count; i++) {
67 info[i].info1.flags = samdb_result_uint(msgs[i], "flags", 0);
69 info[i].info1.name = samdb_result_string(msgs[i], "name", "");
70 W_ERROR_HAVE_NO_MEMORY(info[i].info1.name);
72 info[i].info1.description = samdb_result_string(msgs[i], "description", "");
73 W_ERROR_HAVE_NO_MEMORY(info[i].info1.description);
75 info[i].info1.comment = samdb_result_string(msgs[i], "comment", NULL);
77 *r->out.buf_size= SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinters, r->in.level, count, info);
78 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
79 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
80 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
82 for (i = 0; i < count; i++) {
83 info[i].info2.servername = samdb_result_string(msgs[i], "servername", "");
84 W_ERROR_HAVE_NO_MEMORY(info[i].info2.servername);
86 info[i].info2.printername = samdb_result_string(msgs[i], "printername", "");
87 W_ERROR_HAVE_NO_MEMORY(info[i].info2.printername);
89 info[i].info2.sharename = samdb_result_string(msgs[i], "sharename", "");
90 W_ERROR_HAVE_NO_MEMORY(info[i].info2.sharename);
92 info[i].info2.portname = samdb_result_string(msgs[i], "portname", "");
93 W_ERROR_HAVE_NO_MEMORY(info[i].info2.portname);
95 info[i].info2.drivername = samdb_result_string(msgs[i], "drivername", "");
96 W_ERROR_HAVE_NO_MEMORY(info[i].info2.drivername);
98 info[i].info2.comment = samdb_result_string(msgs[i], "comment", NULL);
100 info[i].info2.location = samdb_result_string(msgs[i], "location", NULL);
102 info[i].info2.devmode = NULL;
104 info[i].info2.sepfile = samdb_result_string(msgs[i], "sepfile", NULL);
106 info[i].info2.printprocessor = samdb_result_string(msgs[i], "printprocessor", "");
107 W_ERROR_HAVE_NO_MEMORY(info[i].info2.printprocessor);
109 info[i].info2.datatype = samdb_result_string(msgs[i], "datatype", "");
110 W_ERROR_HAVE_NO_MEMORY(info[i].info2.datatype);
112 info[i].info2.parameters = samdb_result_string(msgs[i], "parameters", NULL);
114 info[i].info2.secdesc = NULL;
116 info[i].info2.attributes = samdb_result_uint(msgs[i], "attributes", 0);
117 info[i].info2.priority = samdb_result_uint(msgs[i], "priority", 0);
118 info[i].info2.defaultpriority = samdb_result_uint(msgs[i], "defaultpriority", 0);
119 info[i].info2.starttime = samdb_result_uint(msgs[i], "starttime", 0);
120 info[i].info2.untiltime = samdb_result_uint(msgs[i], "untiltime", 0);
121 info[i].info2.status = samdb_result_uint(msgs[i], "status", 0);
122 info[i].info2.cjobs = samdb_result_uint(msgs[i], "cjobs", 0);
123 info[i].info2.averageppm = samdb_result_uint(msgs[i], "averageppm", 0);
125 *r->out.buf_size= SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinters, r->in.level, count, info);
126 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
127 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
128 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
130 for (i = 0; i < count; i++) {
131 info[i].info4.printername = samdb_result_string(msgs[i], "printername", "");
132 W_ERROR_HAVE_NO_MEMORY(info[i].info2.printername);
134 info[i].info4.servername = samdb_result_string(msgs[i], "servername", "");
135 W_ERROR_HAVE_NO_MEMORY(info[i].info2.servername);
137 info[i].info4.attributes = samdb_result_uint(msgs[i], "attributes", 0);
139 *r->out.buf_size= SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinters, r->in.level, count, info);
140 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
141 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
142 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
144 for (i = 0; i < count; i++) {
145 info[i].info5.printername = samdb_result_string(msgs[i], "name", "");
146 W_ERROR_HAVE_NO_MEMORY(info[i].info5.printername);
148 info[i].info5.portname = samdb_result_string(msgs[i], "port", "");
149 W_ERROR_HAVE_NO_MEMORY(info[i].info5.portname);
151 info[i].info5.attributes = samdb_result_uint(msgs[i], "attributes", 0);
152 info[i].info5.device_not_selected_timeout = samdb_result_uint(msgs[i], "device_not_selected_timeout", 0);
153 info[i].info5.transmission_retry_timeout = samdb_result_uint(msgs[i], "transmission_retry_timeout", 0);
155 *r->out.buf_size= SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinters, r->in.level, count, info);
156 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
157 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
158 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
161 return WERR_UNKNOWN_LEVEL;
164 static WERROR spoolss_OpenPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
165 struct spoolss_OpenPrinterEx *r);
169 static WERROR spoolss_OpenPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
170 struct spoolss_OpenPrinter *r)
173 struct spoolss_OpenPrinterEx *r2;
175 r2 = talloc(mem_ctx, struct spoolss_OpenPrinterEx);
176 W_ERROR_HAVE_NO_MEMORY(r2);
178 r2->in.printername = r->in.printername;
179 r2->in.datatype = r->in.datatype;
180 r2->in.devmode_ctr = r->in.devmode_ctr;
181 r2->in.access_mask = r->in.access_mask;
183 r2->in.userlevel.level1 = NULL;
185 r2->out.handle = r->out.handle;
187 /* TODO: we should take care about async replies here,
188 if spoolss_OpenPrinterEx() would be async!
190 status = spoolss_OpenPrinterEx(dce_call, mem_ctx, r2);
192 r->out.handle = r2->out.handle;
201 static WERROR spoolss_SetJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
202 struct spoolss_SetJob *r)
204 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
211 static WERROR spoolss_GetJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
212 struct spoolss_GetJob *r)
214 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
221 static WERROR spoolss_EnumJobs(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
222 struct spoolss_EnumJobs *r)
224 *r->out.buf_size = 0;
233 static WERROR spoolss_AddPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
234 struct spoolss_AddPrinter *r)
236 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
241 spoolss_DeletePrinter
243 static WERROR spoolss_DeletePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
244 struct spoolss_DeletePrinter *r)
246 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
253 static WERROR spoolss_SetPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
254 struct spoolss_SetPrinter *r)
256 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
263 static WERROR spoolss_GetPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
264 struct spoolss_GetPrinter *r)
266 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
271 spoolss_AddPrinterDriver
273 static WERROR spoolss_AddPrinterDriver(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
274 struct spoolss_AddPrinterDriver *r)
276 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
281 spoolss_EnumPrinterDrivers
283 static WERROR spoolss_EnumPrinterDrivers(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
284 struct spoolss_EnumPrinterDrivers *r)
286 union spoolss_DriverInfo *info;
290 *r->out.buf_size = 0;
294 if (count == 0) return WERR_OK;
295 if (count < 0) return WERR_GENERAL_FAILURE;
297 info = talloc_array(mem_ctx, union spoolss_DriverInfo, count);
298 W_ERROR_HAVE_NO_MEMORY(info);
300 switch (r->in.level) {
302 for (i=0; i < count; i++) {
304 *r->out.buf_size= SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinterDrivers, r->in.level, count, info);
305 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
306 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
307 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
309 for (i=0; i < count; i++) {
311 *r->out.buf_size= SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinterDrivers, r->in.level, count, info);
312 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
313 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
314 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
316 for (i=0; i < count; i++) {
318 *r->out.buf_size= SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinterDrivers, r->in.level, count, info);
319 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
320 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
321 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
323 for (i=0; i < count; i++) {
325 *r->out.buf_size= SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinterDrivers, r->in.level, count, info);
326 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
327 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
328 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
330 for (i=0; i < count; i++) {
332 *r->out.buf_size= SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinterDrivers, r->in.level, count, info);
333 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
334 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
335 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
337 for (i=0; i < count; i++) {
339 *r->out.buf_size= SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinterDrivers, r->in.level, count, info);
340 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
341 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
342 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
345 return WERR_UNKNOWN_LEVEL;
350 spoolss_GetPrinterDriver
352 static WERROR spoolss_GetPrinterDriver(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
353 struct spoolss_GetPrinterDriver *r)
355 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
360 spoolss_GetPrinterDriverDirectory
362 static WERROR spoolss_GetPrinterDriverDirectory(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
363 struct spoolss_GetPrinterDriverDirectory *r)
365 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
370 spoolss_DeletePrinterDriver
372 static WERROR spoolss_DeletePrinterDriver(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
373 struct spoolss_DeletePrinterDriver *r)
375 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
380 spoolss_AddPrintProcessor
382 static WERROR spoolss_AddPrintProcessor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
383 struct spoolss_AddPrintProcessor *r)
385 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
390 spoolss_EnumPrintProcessors
392 static WERROR spoolss_EnumPrintProcessors(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
393 struct spoolss_EnumPrintProcessors *r)
395 *r->out.buf_size = 0;
402 spoolss_GetPrintProcessorDirectory
404 static WERROR spoolss_GetPrintProcessorDirectory(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
405 struct spoolss_GetPrintProcessorDirectory *r)
407 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
412 spoolss_StartDocPrinter
414 static WERROR spoolss_StartDocPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
415 struct spoolss_StartDocPrinter *r)
417 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
422 spoolss_StartPagePrinter
424 static WERROR spoolss_StartPagePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
425 struct spoolss_StartPagePrinter *r)
427 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
434 static WERROR spoolss_WritePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
435 struct spoolss_WritePrinter *r)
437 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
442 spoolss_EndPagePrinter
444 static WERROR spoolss_EndPagePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
445 struct spoolss_EndPagePrinter *r)
447 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
454 static WERROR spoolss_AbortPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
455 struct spoolss_AbortPrinter *r)
457 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
464 static WERROR spoolss_ReadPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
465 struct spoolss_ReadPrinter *r)
467 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
472 spoolss_EndDocPrinter
474 static WERROR spoolss_EndDocPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
475 struct spoolss_EndDocPrinter *r)
477 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
484 static WERROR spoolss_AddJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
485 struct spoolss_AddJob *r)
487 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
494 static WERROR spoolss_ScheduleJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
495 struct spoolss_ScheduleJob *r)
497 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
502 spoolss_GetPrinterData
504 static WERROR spoolss_GetPrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
505 struct spoolss_GetPrinterData *r)
507 struct dcesrv_handle *h;
508 WERROR status = WERR_INVALID_PARAM;
509 enum spoolss_PrinterDataType type = SPOOLSS_PRINTER_DATA_TYPE_NULL;
510 union spoolss_PrinterData data;
512 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
514 if (h->wire_handle.handle_type == SPOOLSS_HANDLE_SERVER) {
515 /* TODO: do access check here */
517 if (strcmp("W3SvcInstalled", r->in.value_name) == 0) {
518 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
521 } else if (strcmp("BeepEnabled", r->in.value_name) == 0) {
522 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
525 } else if (strcmp("EventLog", r->in.value_name) == 0) {
526 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
529 } else if (strcmp("NetPopup", r->in.value_name) == 0) {
530 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
533 } else if (strcmp("NetPopupToComputer", r->in.value_name) == 0) {
534 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
537 } else if (strcmp("MajorVersion", r->in.value_name) == 0) {
538 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
541 } else if (strcmp("MinorVersion", r->in.value_name) == 0) {
542 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
545 } else if (strcmp("DefaultSpoolDirectory", r->in.value_name) == 0) {
546 type = SPOOLSS_PRINTER_DATA_TYPE_STRING;
547 data.string = "C:\\PRINTERS";
549 } else if (strcmp("Architecture", r->in.value_name) == 0) {
550 type = SPOOLSS_PRINTER_DATA_TYPE_STRING;
551 data.string = SPOOLSS_ARCHITECTURE_NT_X86;
553 } else if (strcmp("DsPresent", r->in.value_name) == 0) {
554 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
560 if (W_ERROR_IS_OK(status)) {
561 *r->out.buf_size = ndr_size_spoolss_PrinterData(&data, type, 0);
562 r->out.type = SPOOLSS_BUFFER_OK(type, SPOOLSS_PRINTER_DATA_TYPE_NULL);
563 r->out.data = SPOOLSS_BUFFER_OK(data, data);
564 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_MORE_DATA);
572 spoolss_SetPrinterData
574 static WERROR spoolss_SetPrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
575 struct spoolss_SetPrinterData *r)
577 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
582 spoolss_WaitForPrinterChange
584 static WERROR spoolss_WaitForPrinterChange(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
585 struct spoolss_WaitForPrinterChange *r)
587 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
594 static WERROR spoolss_ClosePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
595 struct spoolss_ClosePrinter *r)
597 struct dcesrv_handle *h;
599 *r->out.handle = *r->in.handle;
601 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
605 ZERO_STRUCTP(r->out.handle);
614 static WERROR spoolss_AddForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
615 struct spoolss_AddForm *r)
617 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
624 static WERROR spoolss_DeleteForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
625 struct spoolss_DeleteForm *r)
627 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
634 static WERROR spoolss_GetForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
635 struct spoolss_GetForm *r)
637 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
644 static WERROR spoolss_SetForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
645 struct spoolss_SetForm *r)
647 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
654 static WERROR spoolss_EnumForms(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
655 struct spoolss_EnumForms *r)
657 union spoolss_FormInfo *info;
660 struct dcesrv_handle *h;
662 *r->out.buf_size = 0;
664 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
668 if (count == 0) return WERR_OK;
669 if (count < 0) return WERR_GENERAL_FAILURE;
671 info = talloc_array(mem_ctx, union spoolss_FormInfo, count);
672 W_ERROR_HAVE_NO_MEMORY(info);
674 switch (r->in.level) {
676 for (i=0; i < count; i++) {
677 info[i].info1.flags = SPOOLSS_FORM_PRINTER;
679 info[i].info1.form_name = talloc_strdup(mem_ctx, "Samba Printer Form");
680 W_ERROR_HAVE_NO_MEMORY(info[i].info1.form_name);
682 info[i].info1.size.width = 30;
683 info[i].info1.size.height = 40;
685 info[i].info1.area.left = 0;
686 info[i].info1.area.top = 0;
687 info[i].info1.area.right = 30;
688 info[i].info1.area.bottom = 40;
690 *r->out.buf_size= SPOOLSS_BUFFER_SIZE(spoolss_EnumForms, r->in.level, count, info);
691 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
692 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
693 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
696 return WERR_UNKNOWN_LEVEL;
703 static WERROR spoolss_EnumPorts(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
704 struct spoolss_EnumPorts *r)
706 union spoolss_PortInfo *info;
710 *r->out.buf_size = 0;
714 if (count == 0) return WERR_OK;
715 if (count < 0) return WERR_GENERAL_FAILURE;
717 info = talloc_array(mem_ctx, union spoolss_PortInfo, count);
718 W_ERROR_HAVE_NO_MEMORY(info);
720 switch (r->in.level) {
722 for (i=0; i < count; i++) {
723 info[i].info1.port_name = talloc_strdup(mem_ctx, "Samba Printer Port");
724 W_ERROR_HAVE_NO_MEMORY(info[i].info1.port_name);
726 *r->out.buf_size= SPOOLSS_BUFFER_SIZE(spoolss_EnumPorts, r->in.level, count, info);
727 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
728 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
729 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
731 for (i=0; i < count; i++) {
732 info[i].info2.port_name = talloc_strdup(mem_ctx, "Samba Printer Port");
733 W_ERROR_HAVE_NO_MEMORY(info[i].info2.port_name);
735 info[i].info2.monitor_name = talloc_strdup(mem_ctx, "Local Monitor");
736 W_ERROR_HAVE_NO_MEMORY(info[i].info2.monitor_name);
738 info[i].info2.description = talloc_strdup(mem_ctx, "Local Port");
739 W_ERROR_HAVE_NO_MEMORY(info[i].info2.description);
741 info[i].info2.port_type = SPOOLSS_PORT_TYPE_WRITE;
742 info[i].info2.reserved = 0;
744 *r->out.buf_size= SPOOLSS_BUFFER_SIZE(spoolss_EnumPorts, r->in.level, count, info);
745 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
746 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
747 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
750 return WERR_UNKNOWN_LEVEL;
757 static WERROR spoolss_EnumMonitors(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
758 struct spoolss_EnumMonitors *r)
760 *r->out.buf_size = 0;
769 static WERROR spoolss_AddPort(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
770 struct spoolss_AddPort *r)
772 return WERR_NOT_SUPPORTED;
777 spoolss_ConfigurePort
779 static WERROR spoolss_ConfigurePort(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
780 struct spoolss_ConfigurePort *r)
782 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
789 static WERROR spoolss_DeletePort(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
790 struct spoolss_DeletePort *r)
792 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
797 spoolss_CreatePrinterIC
799 static WERROR spoolss_CreatePrinterIC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
800 struct spoolss_CreatePrinterIC *r)
802 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
807 spoolss_PlayGDIScriptOnPrinterIC
809 static WERROR spoolss_PlayGDIScriptOnPrinterIC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
810 struct spoolss_PlayGDIScriptOnPrinterIC *r)
812 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
817 spoolss_DeletePrinterIC
819 static WERROR spoolss_DeletePrinterIC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
820 struct spoolss_DeletePrinterIC *r)
822 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
827 spoolss_AddPrinterConnection
829 static WERROR spoolss_AddPrinterConnection(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
830 struct spoolss_AddPrinterConnection *r)
832 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
837 spoolss_DeletePrinterConnection
839 static WERROR spoolss_DeletePrinterConnection(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
840 struct spoolss_DeletePrinterConnection *r)
842 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
847 spoolss_PrinterMessageBox
849 static WERROR spoolss_PrinterMessageBox(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
850 struct spoolss_PrinterMessageBox *r)
852 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
859 static WERROR spoolss_AddMonitor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
860 struct spoolss_AddMonitor *r)
862 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
867 spoolss_DeleteMonitor
869 static WERROR spoolss_DeleteMonitor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
870 struct spoolss_DeleteMonitor *r)
872 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
877 spoolss_DeletePrintProcessor
879 static WERROR spoolss_DeletePrintProcessor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
880 struct spoolss_DeletePrintProcessor *r)
882 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
887 spoolss_AddPrintProvidor
889 static WERROR spoolss_AddPrintProvidor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
890 struct spoolss_AddPrintProvidor *r)
892 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
897 spoolss_DeletePrintProvidor
899 static WERROR spoolss_DeletePrintProvidor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
900 struct spoolss_DeletePrintProvidor *r)
902 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
907 spoolss_EnumPrintProcDataTypes
909 static WERROR spoolss_EnumPrintProcDataTypes(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
910 struct spoolss_EnumPrintProcDataTypes *r)
912 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
919 static WERROR spoolss_ResetPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
920 struct spoolss_ResetPrinter *r)
922 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
927 spoolss_GetPrinterDriver2
929 static WERROR spoolss_GetPrinterDriver2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
930 struct spoolss_GetPrinterDriver2 *r)
932 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
937 spoolss_FindFirstPrinterChangeNotification
939 static WERROR spoolss_FindFirstPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
940 struct spoolss_FindFirstPrinterChangeNotification *r)
942 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
947 spoolss_FindNextPrinterChangeNotification
949 static WERROR spoolss_FindNextPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
950 struct spoolss_FindNextPrinterChangeNotification *r)
952 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
957 spoolss_FindClosePrinterNotify
959 static WERROR spoolss_FindClosePrinterNotify(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
960 struct spoolss_FindClosePrinterNotify *r)
962 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
967 spoolss_RouterFindFirstPrinterChangeNotificationOld
969 static WERROR spoolss_RouterFindFirstPrinterChangeNotificationOld(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
970 struct spoolss_RouterFindFirstPrinterChangeNotificationOld *r)
972 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
977 spoolss_ReplyOpenPrinter
979 static WERROR spoolss_ReplyOpenPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
980 struct spoolss_ReplyOpenPrinter *r)
982 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
987 spoolss_RouterReplyPrinter
989 static WERROR spoolss_RouterReplyPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
990 struct spoolss_RouterReplyPrinter *r)
992 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
997 spoolss_ReplyClosePrinter
999 static WERROR spoolss_ReplyClosePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1000 struct spoolss_ReplyClosePrinter *r)
1002 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1009 static WERROR spoolss_AddPortEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1010 struct spoolss_AddPortEx *r)
1012 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1017 spoolss_RouterFindFirstPrinterChangeNotification
1019 static WERROR spoolss_RouterFindFirstPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1020 struct spoolss_RouterFindFirstPrinterChangeNotification *r)
1022 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1029 static WERROR spoolss_SpoolerInit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1030 struct spoolss_SpoolerInit *r)
1032 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1037 spoolss_ResetPrinterEx
1039 static WERROR spoolss_ResetPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1040 struct spoolss_ResetPrinterEx *r)
1042 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1047 spoolss_RemoteFindFirstPrinterChangeNotifyEx
1049 static WERROR spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1050 struct spoolss_RemoteFindFirstPrinterChangeNotifyEx *r)
1052 return WERR_NOT_SUPPORTED;
1057 spoolss_RouterRefreshPrinterChangeNotification
1059 static WERROR spoolss_RouterRefreshPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1060 struct spoolss_RouterRefreshPrinterChangeNotification *r)
1062 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1067 spoolss_RemoteFindNextPrinterChangeNotifyEx
1069 static WERROR spoolss_RemoteFindNextPrinterChangeNotifyEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1070 struct spoolss_RemoteFindNextPrinterChangeNotifyEx *r)
1072 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1079 static WERROR spoolss_44(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1080 struct spoolss_44 *r)
1082 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1086 static WERROR spoolss_OpenPrinterEx_server(struct dcesrv_call_state *dce_call,
1087 TALLOC_CTX *mem_ctx,
1088 struct spoolss_OpenPrinterEx *r,
1089 const char *server_name)
1091 struct spoolss_handle_server *state;
1092 struct dcesrv_handle *handle;
1095 /* Check printername is our name or our ip address
1097 ret = strequal(server_name, lp_netbios_name());
1099 const char *ip = socket_get_my_addr(dce_call->conn->srv_conn->socket, mem_ctx);
1100 W_ERROR_HAVE_NO_MEMORY(ip);
1102 ret = strequal(server_name, ip);
1104 return WERR_INVALID_PRINTER_NAME;
1108 /* TODO: do access check here */
1110 handle = dcesrv_handle_new(dce_call->context, SPOOLSS_HANDLE_SERVER);
1111 W_ERROR_HAVE_NO_MEMORY(handle);
1113 state = talloc(handle, struct spoolss_handle_server);
1114 W_ERROR_HAVE_NO_MEMORY(state);
1116 handle->data = state;
1118 state->access_mask = r->in.access_mask;
1120 *r->out.handle = handle->wire_handle;
1125 static WERROR spoolss_OpenPrinterEx_printer(struct dcesrv_call_state *dce_call,
1126 TALLOC_CTX *mem_ctx,
1127 struct spoolss_OpenPrinterEx *r,
1128 const char *server_name,
1129 const char *printer_name)
1131 DEBUG(1, ("looking for printer [%s] (server[%s])\n", printer_name, server_name));
1133 return WERR_INVALID_PRINTER_NAME;
1137 spoolss_OpenPrinterEx
1139 static WERROR spoolss_OpenPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1140 struct spoolss_OpenPrinterEx *r)
1143 char *server = NULL;
1144 const char *printer = r->in.printername;
1145 ZERO_STRUCTP(r->out.handle);
1147 /* no printername is there it's like open server */
1148 if (!r->in.printername) {
1149 return spoolss_OpenPrinterEx_server(dce_call, mem_ctx, r, NULL);
1152 /* just "\\" is invalid */
1153 if (strequal(r->in.printername, "\\\\")) {
1154 return WERR_INVALID_PRINTER_NAME;
1157 if (strncmp(r->in.printername, "\\\\", 2) == 0) {
1158 server = talloc_strdup(mem_ctx, r->in.printername + 2);
1159 W_ERROR_HAVE_NO_MEMORY(server);
1161 /* here we know we have "\\" in front not followed
1162 * by '\0', now see if we have another "\" in the string
1164 p = strchr_m(server, '\\');
1166 /* there's no other "\", so it's ("\\%s",server)
1168 return spoolss_OpenPrinterEx_server(dce_call, mem_ctx, r, server);
1170 /* here we know that we have ("\\%s\",server),
1171 * if we have '\0' as next then it's an invalid name
1172 * otherwise the printer_name
1175 /* everything that follows is the printer name */
1179 /* just "" as server is invalid */
1180 if (strequal(server, "")) {
1181 DEBUG(2,("ivalid server: [%s][%s][%s]\n", r->in.printername, server, printer));
1182 return WERR_INVALID_PRINTER_NAME;
1186 /* just "" is invalid */
1187 if (strequal(printer, "")) {
1188 DEBUG(2,("invalid printer: [%s][%s][%s]\n", r->in.printername, server, printer));
1189 return WERR_INVALID_PRINTER_NAME;
1192 DEBUG(3,("printer: [%s][%s][%s]\n", r->in.printername, server, printer));
1193 return spoolss_OpenPrinterEx_printer(dce_call, mem_ctx, r, server, printer);
1198 spoolss_AddPrinterEx
1200 static WERROR spoolss_AddPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1201 struct spoolss_AddPrinterEx *r)
1203 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1210 static WERROR spoolss_47(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1211 struct spoolss_47 *r)
1213 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1218 spoolss_EnumPrinterData
1220 static WERROR spoolss_EnumPrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1221 struct spoolss_EnumPrinterData *r)
1223 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1228 spoolss_DeletePrinterData
1230 static WERROR spoolss_DeletePrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1231 struct spoolss_DeletePrinterData *r)
1233 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1240 static WERROR spoolss_4a(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1241 struct spoolss_4a *r)
1243 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1250 static WERROR spoolss_4b(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1251 struct spoolss_4b *r)
1253 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1260 static WERROR spoolss_4c(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1261 struct spoolss_4c *r)
1263 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1268 spoolss_SetPrinterDataEx
1270 static WERROR spoolss_SetPrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1271 struct spoolss_SetPrinterDataEx *r)
1273 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1278 spoolss_GetPrinterDataEx
1280 static WERROR spoolss_GetPrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1281 struct spoolss_GetPrinterDataEx *r)
1283 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1288 spoolss_EnumPrinterDataEx
1290 static WERROR spoolss_EnumPrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1291 struct spoolss_EnumPrinterDataEx *r)
1293 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1298 spoolss_EnumPrinterKey
1300 static WERROR spoolss_EnumPrinterKey(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1301 struct spoolss_EnumPrinterKey *r)
1303 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1308 spoolss_DeletePrinterDataEx
1310 static WERROR spoolss_DeletePrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1311 struct spoolss_DeletePrinterDataEx *r)
1313 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1318 spoolss_DeletePrinterKey
1320 static WERROR spoolss_DeletePrinterKey(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1321 struct spoolss_DeletePrinterKey *r)
1323 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1330 static WERROR spoolss_53(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1331 struct spoolss_53 *r)
1333 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1338 spoolss_DeletePrinterDriverEx
1340 static WERROR spoolss_DeletePrinterDriverEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1341 struct spoolss_DeletePrinterDriverEx *r)
1343 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1350 static WERROR spoolss_55(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1351 struct spoolss_55 *r)
1353 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1360 static WERROR spoolss_56(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1361 struct spoolss_56 *r)
1363 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1370 static WERROR spoolss_57(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1371 struct spoolss_57 *r)
1373 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1380 static WERROR spoolss_58(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1381 struct spoolss_58 *r)
1383 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1388 spoolss_AddPrinterDriverEx
1390 static WERROR spoolss_AddPrinterDriverEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1391 struct spoolss_AddPrinterDriverEx *r)
1393 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1400 static WERROR spoolss_5a(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1401 struct spoolss_5a *r)
1403 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1410 static WERROR spoolss_5b(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1411 struct spoolss_5b *r)
1413 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1420 static WERROR spoolss_5c(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1421 struct spoolss_5c *r)
1423 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1430 static WERROR spoolss_5d(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1431 struct spoolss_5d *r)
1433 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1440 static WERROR spoolss_5e(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1441 struct spoolss_5e *r)
1443 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1450 static WERROR spoolss_5f(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1451 struct spoolss_5f *r)
1453 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1457 /* include the generated boilerplate */
1458 #include "librpc/gen_ndr/ndr_spoolss_s.c"