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.offered >= r->out.needed)?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;
49 spoolss_ctx = spoolssdb_connect();
50 W_ERROR_HAVE_NO_MEMORY(spoolss_ctx);
52 count = spoolssdb_search(spoolss_ctx, mem_ctx, NULL, &msgs, NULL,
53 "(&(objectclass=printer))");
54 spoolssdb_close(spoolss_ctx);
56 if (count == 0) return WERR_OK;
57 if (count < 0) return WERR_GENERAL_FAILURE;
59 info = talloc_array(mem_ctx, union spoolss_PrinterInfo, count);
60 W_ERROR_HAVE_NO_MEMORY(info);
64 for (i = 0; i < count; i++) {
65 info[i].info1.flags = samdb_result_uint(msgs[i], "flags", 0);
67 info[i].info1.name = samdb_result_string(msgs[i], "name", "");
68 W_ERROR_HAVE_NO_MEMORY(info[i].info1.name);
70 info[i].info1.description = samdb_result_string(msgs[i], "description", "");
71 W_ERROR_HAVE_NO_MEMORY(info[i].info1.description);
73 info[i].info1.comment = samdb_result_string(msgs[i], "comment", NULL);
75 r->out.needed = SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinters, r->in.level, count, info);
76 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
77 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
78 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
80 for (i = 0; i < count; i++) {
81 info[i].info2.servername = samdb_result_string(msgs[i], "servername", "");
82 W_ERROR_HAVE_NO_MEMORY(info[i].info2.servername);
84 info[i].info2.printername = samdb_result_string(msgs[i], "printername", "");
85 W_ERROR_HAVE_NO_MEMORY(info[i].info2.printername);
87 info[i].info2.sharename = samdb_result_string(msgs[i], "sharename", "");
88 W_ERROR_HAVE_NO_MEMORY(info[i].info2.sharename);
90 info[i].info2.portname = samdb_result_string(msgs[i], "portname", "");
91 W_ERROR_HAVE_NO_MEMORY(info[i].info2.portname);
93 info[i].info2.drivername = samdb_result_string(msgs[i], "drivername", "");
94 W_ERROR_HAVE_NO_MEMORY(info[i].info2.drivername);
96 info[i].info2.comment = samdb_result_string(msgs[i], "comment", NULL);
98 info[i].info2.location = samdb_result_string(msgs[i], "location", NULL);
100 info[i].info2.devmode = NULL;
102 info[i].info2.sepfile = samdb_result_string(msgs[i], "sepfile", NULL);
104 info[i].info2.printprocessor = samdb_result_string(msgs[i], "printprocessor", "");
105 W_ERROR_HAVE_NO_MEMORY(info[i].info2.printprocessor);
107 info[i].info2.datatype = samdb_result_string(msgs[i], "datatype", "");
108 W_ERROR_HAVE_NO_MEMORY(info[i].info2.datatype);
110 info[i].info2.parameters = samdb_result_string(msgs[i], "parameters", NULL);
112 info[i].info2.secdesc = NULL;
114 info[i].info2.attributes = samdb_result_uint(msgs[i], "attributes", 0);
115 info[i].info2.priority = samdb_result_uint(msgs[i], "priority", 0);
116 info[i].info2.defaultpriority = samdb_result_uint(msgs[i], "defaultpriority", 0);
117 info[i].info2.starttime = samdb_result_uint(msgs[i], "starttime", 0);
118 info[i].info2.untiltime = samdb_result_uint(msgs[i], "untiltime", 0);
119 info[i].info2.status = samdb_result_uint(msgs[i], "status", 0);
120 info[i].info2.cjobs = samdb_result_uint(msgs[i], "cjobs", 0);
121 info[i].info2.averageppm = samdb_result_uint(msgs[i], "averageppm", 0);
123 r->out.needed = SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinters, r->in.level, count, info);
124 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
125 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
126 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
128 for (i = 0; i < count; i++) {
129 info[i].info4.printername = samdb_result_string(msgs[i], "printername", "");
130 W_ERROR_HAVE_NO_MEMORY(info[i].info2.printername);
132 info[i].info4.servername = samdb_result_string(msgs[i], "servername", "");
133 W_ERROR_HAVE_NO_MEMORY(info[i].info2.servername);
135 info[i].info4.attributes = samdb_result_uint(msgs[i], "attributes", 0);
137 r->out.needed = SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinters, r->in.level, count, info);
138 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
139 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
140 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
142 for (i = 0; i < count; i++) {
143 info[i].info5.printername = samdb_result_string(msgs[i], "name", "");
144 W_ERROR_HAVE_NO_MEMORY(info[i].info5.printername);
146 info[i].info5.portname = samdb_result_string(msgs[i], "port", "");
147 W_ERROR_HAVE_NO_MEMORY(info[i].info5.portname);
149 info[i].info5.attributes = samdb_result_uint(msgs[i], "attributes", 0);
150 info[i].info5.device_not_selected_timeout = samdb_result_uint(msgs[i], "device_not_selected_timeout", 0);
151 info[i].info5.transmission_retry_timeout = samdb_result_uint(msgs[i], "transmission_retry_timeout", 0);
153 r->out.needed = SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinters, r->in.level, count, info);
154 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
155 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
156 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
159 return WERR_UNKNOWN_LEVEL;
162 static WERROR spoolss_OpenPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
163 struct spoolss_OpenPrinterEx *r);
167 static WERROR spoolss_OpenPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
168 struct spoolss_OpenPrinter *r)
171 struct spoolss_OpenPrinterEx *r2;
173 r2 = talloc(mem_ctx, struct spoolss_OpenPrinterEx);
174 W_ERROR_HAVE_NO_MEMORY(r2);
176 r2->in.printername = r->in.printername;
177 r2->in.datatype = r->in.datatype;
178 r2->in.devmode_ctr = r->in.devmode_ctr;
179 r2->in.access_mask = r->in.access_mask;
181 r2->in.userlevel.level1 = NULL;
183 r2->out.handle = r->out.handle;
185 /* TODO: we should take care about async replies here,
186 if spoolss_OpenPrinterEx() would be async!
188 status = spoolss_OpenPrinterEx(dce_call, mem_ctx, r2);
190 r->out.handle = r2->out.handle;
199 static WERROR spoolss_SetJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
200 struct spoolss_SetJob *r)
202 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
209 static WERROR spoolss_GetJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
210 struct spoolss_GetJob *r)
212 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
219 static WERROR spoolss_EnumJobs(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
220 struct spoolss_EnumJobs *r)
229 static WERROR spoolss_AddPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
230 struct spoolss_AddPrinter *r)
232 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
237 spoolss_DeletePrinter
239 static WERROR spoolss_DeletePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
240 struct spoolss_DeletePrinter *r)
242 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
249 static WERROR spoolss_SetPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
250 struct spoolss_SetPrinter *r)
252 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
259 static WERROR spoolss_GetPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
260 struct spoolss_GetPrinter *r)
262 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
267 spoolss_AddPrinterDriver
269 static WERROR spoolss_AddPrinterDriver(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
270 struct spoolss_AddPrinterDriver *r)
272 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
277 spoolss_EnumPrinterDrivers
279 static WERROR spoolss_EnumPrinterDrivers(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
280 struct spoolss_EnumPrinterDrivers *r)
282 union spoolss_DriverInfo *info;
288 if (count == 0) return WERR_OK;
289 if (count < 0) return WERR_GENERAL_FAILURE;
291 info = talloc_array(mem_ctx, union spoolss_DriverInfo, count);
292 W_ERROR_HAVE_NO_MEMORY(info);
294 switch (r->in.level) {
296 for (i=0; i < count; i++) {
298 r->out.needed = SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinterDrivers, r->in.level, count, info);
299 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
300 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
301 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
303 for (i=0; i < count; i++) {
305 r->out.needed = SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinterDrivers, r->in.level, count, info);
306 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
307 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
308 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
310 for (i=0; i < count; i++) {
312 r->out.needed = SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinterDrivers, r->in.level, count, info);
313 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
314 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
315 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
317 for (i=0; i < count; i++) {
319 r->out.needed = SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinterDrivers, r->in.level, count, info);
320 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
321 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
322 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
324 for (i=0; i < count; i++) {
326 r->out.needed = SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinterDrivers, r->in.level, count, info);
327 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
328 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
329 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
331 for (i=0; i < count; i++) {
333 r->out.needed = SPOOLSS_BUFFER_SIZE(spoolss_EnumPrinterDrivers, r->in.level, count, info);
334 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
335 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
336 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
339 return WERR_UNKNOWN_LEVEL;
344 spoolss_GetPrinterDriver
346 static WERROR spoolss_GetPrinterDriver(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
347 struct spoolss_GetPrinterDriver *r)
349 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
354 spoolss_GetPrinterDriverDirectory
356 static WERROR spoolss_GetPrinterDriverDirectory(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
357 struct spoolss_GetPrinterDriverDirectory *r)
359 union spoolss_DriverDirectoryInfo *info;
364 * NOTE: normally r->in.level is 1, but both w2k3 and nt4 sp6a
365 * are ignoring the r->in.level completely, so we do :-)
369 * TODO: check the server name is ours
370 * - if it's a invalid UNC then return WERR_INVALID_NAME
371 * - if it's the wrong host name return WERR_INVALID_PARAM
372 * - if it's "" then we need to return a local WINDOWS path
374 if (strcmp("", r->in.server) == 0) {
375 prefix = "C:\\DRIVERS";
377 prefix = talloc_asprintf(mem_ctx, "%s\\print$", r->in.server);
378 W_ERROR_HAVE_NO_MEMORY(prefix);
381 if (strcmp(SPOOLSS_ARCHITECTURE_NT_X86, r->in.environment) == 0) {
384 return WERR_INVALID_ENVIRONMENT;
387 info = talloc(mem_ctx, union spoolss_DriverDirectoryInfo);
388 W_ERROR_HAVE_NO_MEMORY(info);
390 info->info1.directory_name = talloc_asprintf(mem_ctx, "%s\\%s", prefix, postfix);
391 W_ERROR_HAVE_NO_MEMORY(info->info1.directory_name);
393 r->out.needed = ndr_size_spoolss_DriverDirectoryInfo(info, r->in.level, 0);
394 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
395 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
400 spoolss_DeletePrinterDriver
402 static WERROR spoolss_DeletePrinterDriver(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
403 struct spoolss_DeletePrinterDriver *r)
405 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
410 spoolss_AddPrintProcessor
412 static WERROR spoolss_AddPrintProcessor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
413 struct spoolss_AddPrintProcessor *r)
415 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
420 spoolss_EnumPrintProcessors
422 static WERROR spoolss_EnumPrintProcessors(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
423 struct spoolss_EnumPrintProcessors *r)
430 spoolss_GetPrintProcessorDirectory
432 static WERROR spoolss_GetPrintProcessorDirectory(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
433 struct spoolss_GetPrintProcessorDirectory *r)
435 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
440 spoolss_StartDocPrinter
442 static WERROR spoolss_StartDocPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
443 struct spoolss_StartDocPrinter *r)
445 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
450 spoolss_StartPagePrinter
452 static WERROR spoolss_StartPagePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
453 struct spoolss_StartPagePrinter *r)
455 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
462 static WERROR spoolss_WritePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
463 struct spoolss_WritePrinter *r)
465 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
470 spoolss_EndPagePrinter
472 static WERROR spoolss_EndPagePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
473 struct spoolss_EndPagePrinter *r)
475 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
482 static WERROR spoolss_AbortPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
483 struct spoolss_AbortPrinter *r)
485 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
492 static WERROR spoolss_ReadPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
493 struct spoolss_ReadPrinter *r)
495 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
500 spoolss_EndDocPrinter
502 static WERROR spoolss_EndDocPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
503 struct spoolss_EndDocPrinter *r)
505 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
512 static WERROR spoolss_AddJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
513 struct spoolss_AddJob *r)
515 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
522 static WERROR spoolss_ScheduleJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
523 struct spoolss_ScheduleJob *r)
525 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
530 spoolss_GetPrinterData
532 static WERROR spoolss_GetPrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
533 struct spoolss_GetPrinterData *r)
535 struct dcesrv_handle *h;
536 WERROR status = WERR_INVALID_PARAM;
537 enum spoolss_PrinterDataType type = SPOOLSS_PRINTER_DATA_TYPE_NULL;
538 union spoolss_PrinterData data;
540 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
542 if (h->wire_handle.handle_type == SPOOLSS_HANDLE_SERVER) {
543 /* TODO: do access check here */
545 if (strcmp("W3SvcInstalled", r->in.value_name) == 0) {
546 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
549 } else if (strcmp("BeepEnabled", r->in.value_name) == 0) {
550 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
553 } else if (strcmp("EventLog", r->in.value_name) == 0) {
554 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
557 } else if (strcmp("NetPopup", r->in.value_name) == 0) {
558 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
561 } else if (strcmp("NetPopupToComputer", r->in.value_name) == 0) {
562 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
565 } else if (strcmp("MajorVersion", r->in.value_name) == 0) {
566 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
569 } else if (strcmp("MinorVersion", r->in.value_name) == 0) {
570 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
573 } else if (strcmp("DefaultSpoolDirectory", r->in.value_name) == 0) {
574 type = SPOOLSS_PRINTER_DATA_TYPE_STRING;
575 data.string = "C:\\PRINTERS";
577 } else if (strcmp("Architecture", r->in.value_name) == 0) {
578 type = SPOOLSS_PRINTER_DATA_TYPE_STRING;
579 data.string = SPOOLSS_ARCHITECTURE_NT_X86;
581 } else if (strcmp("DsPresent", r->in.value_name) == 0) {
582 type = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
588 if (W_ERROR_IS_OK(status)) {
589 r->out.needed = ndr_size_spoolss_PrinterData(&data, type, 0);
590 r->out.type = SPOOLSS_BUFFER_OK(type, SPOOLSS_PRINTER_DATA_TYPE_NULL);
591 r->out.data = SPOOLSS_BUFFER_OK(data, data);
592 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_MORE_DATA);
600 spoolss_SetPrinterData
602 static WERROR spoolss_SetPrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
603 struct spoolss_SetPrinterData *r)
605 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
610 spoolss_WaitForPrinterChange
612 static WERROR spoolss_WaitForPrinterChange(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
613 struct spoolss_WaitForPrinterChange *r)
615 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
622 static WERROR spoolss_ClosePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
623 struct spoolss_ClosePrinter *r)
625 struct dcesrv_handle *h;
627 *r->out.handle = *r->in.handle;
629 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
633 ZERO_STRUCTP(r->out.handle);
642 static WERROR spoolss_AddForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
643 struct spoolss_AddForm *r)
645 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
652 static WERROR spoolss_DeleteForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
653 struct spoolss_DeleteForm *r)
655 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
662 static WERROR spoolss_GetForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
663 struct spoolss_GetForm *r)
665 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
672 static WERROR spoolss_SetForm(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
673 struct spoolss_SetForm *r)
675 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
682 static WERROR spoolss_EnumForms(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
683 struct spoolss_EnumForms *r)
685 union spoolss_FormInfo *info;
688 struct dcesrv_handle *h;
690 DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
694 if (count == 0) return WERR_OK;
695 if (count < 0) return WERR_GENERAL_FAILURE;
697 info = talloc_array(mem_ctx, union spoolss_FormInfo, count);
698 W_ERROR_HAVE_NO_MEMORY(info);
700 switch (r->in.level) {
702 for (i=0; i < count; i++) {
703 info[i].info1.flags = SPOOLSS_FORM_PRINTER;
705 info[i].info1.form_name = talloc_strdup(mem_ctx, "Letter");
706 W_ERROR_HAVE_NO_MEMORY(info[i].info1.form_name);
708 info[i].info1.size.width = 0x34b5c;
709 info[i].info1.size.height = 0x44368;
711 info[i].info1.area.left = 0;
712 info[i].info1.area.top = 0;
713 info[i].info1.area.right = 0x34b5c;
714 info[i].info1.area.bottom = 0x44368;
716 r->out.needed = SPOOLSS_BUFFER_SIZE(spoolss_EnumForms, r->in.level, count, info);
717 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
718 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
719 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
722 return WERR_UNKNOWN_LEVEL;
729 static WERROR spoolss_EnumPorts(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
730 struct spoolss_EnumPorts *r)
732 union spoolss_PortInfo *info;
738 if (count == 0) return WERR_OK;
739 if (count < 0) return WERR_GENERAL_FAILURE;
741 info = talloc_array(mem_ctx, union spoolss_PortInfo, count);
742 W_ERROR_HAVE_NO_MEMORY(info);
744 switch (r->in.level) {
746 for (i=0; i < count; i++) {
747 info[i].info1.port_name = talloc_strdup(mem_ctx, "Samba Printer Port");
748 W_ERROR_HAVE_NO_MEMORY(info[i].info1.port_name);
750 r->out.needed = SPOOLSS_BUFFER_SIZE(spoolss_EnumPorts, r->in.level, count, info);
751 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
752 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
753 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
755 for (i=0; i < count; i++) {
756 info[i].info2.port_name = talloc_strdup(mem_ctx, "Samba Printer Port");
757 W_ERROR_HAVE_NO_MEMORY(info[i].info2.port_name);
759 info[i].info2.monitor_name = talloc_strdup(mem_ctx, "Local Monitor");
760 W_ERROR_HAVE_NO_MEMORY(info[i].info2.monitor_name);
762 info[i].info2.description = talloc_strdup(mem_ctx, "Local Port");
763 W_ERROR_HAVE_NO_MEMORY(info[i].info2.description);
765 info[i].info2.port_type = SPOOLSS_PORT_TYPE_WRITE;
766 info[i].info2.reserved = 0;
768 r->out.needed = SPOOLSS_BUFFER_SIZE(spoolss_EnumPorts, r->in.level, count, info);
769 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
770 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
771 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
774 return WERR_UNKNOWN_LEVEL;
781 static WERROR spoolss_EnumMonitors(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
782 struct spoolss_EnumMonitors *r)
784 union spoolss_MonitorInfo *info;
790 if (count == 0) return WERR_OK;
791 if (count < 0) return WERR_GENERAL_FAILURE;
793 info = talloc_array(mem_ctx, union spoolss_MonitorInfo, count);
794 W_ERROR_HAVE_NO_MEMORY(info);
796 switch (r->in.level) {
798 for (i=0; i < count; i++) {
799 info[i].info1.monitor_name = talloc_strdup(mem_ctx, "Standard TCP/IP Port");
800 W_ERROR_HAVE_NO_MEMORY(info[i].info1.monitor_name);
802 r->out.needed = SPOOLSS_BUFFER_SIZE(spoolss_EnumMonitors, r->in.level, count, info);
803 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
804 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
805 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
807 for (i=0; i < count; i++) {
808 info[i].info2.monitor_name = talloc_strdup(mem_ctx, "Standard TCP/IP Port");
809 W_ERROR_HAVE_NO_MEMORY(info[i].info2.monitor_name);
811 info[i].info2.environment = talloc_strdup(mem_ctx, SPOOLSS_ARCHITECTURE_NT_X86);
812 W_ERROR_HAVE_NO_MEMORY(info[i].info2.environment);
814 info[i].info2.dll_name = talloc_strdup(mem_ctx, "tcpmon.dll");
815 W_ERROR_HAVE_NO_MEMORY(info[i].info2.dll_name);
817 r->out.needed = SPOOLSS_BUFFER_SIZE(spoolss_EnumMonitors, r->in.level, count, info);
818 r->out.info = SPOOLSS_BUFFER_OK(info, NULL);
819 r->out.count = SPOOLSS_BUFFER_OK(count, 0);
820 return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
823 return WERR_UNKNOWN_LEVEL;
830 static WERROR spoolss_AddPort(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
831 struct spoolss_AddPort *r)
833 return WERR_NOT_SUPPORTED;
838 spoolss_ConfigurePort
840 static WERROR spoolss_ConfigurePort(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
841 struct spoolss_ConfigurePort *r)
843 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
850 static WERROR spoolss_DeletePort(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
851 struct spoolss_DeletePort *r)
853 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
858 spoolss_CreatePrinterIC
860 static WERROR spoolss_CreatePrinterIC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
861 struct spoolss_CreatePrinterIC *r)
863 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
868 spoolss_PlayGDIScriptOnPrinterIC
870 static WERROR spoolss_PlayGDIScriptOnPrinterIC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
871 struct spoolss_PlayGDIScriptOnPrinterIC *r)
873 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
878 spoolss_DeletePrinterIC
880 static WERROR spoolss_DeletePrinterIC(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
881 struct spoolss_DeletePrinterIC *r)
883 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
888 spoolss_AddPrinterConnection
890 static WERROR spoolss_AddPrinterConnection(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
891 struct spoolss_AddPrinterConnection *r)
893 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
898 spoolss_DeletePrinterConnection
900 static WERROR spoolss_DeletePrinterConnection(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
901 struct spoolss_DeletePrinterConnection *r)
903 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
908 spoolss_PrinterMessageBox
910 static WERROR spoolss_PrinterMessageBox(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
911 struct spoolss_PrinterMessageBox *r)
913 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
920 static WERROR spoolss_AddMonitor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
921 struct spoolss_AddMonitor *r)
923 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
928 spoolss_DeleteMonitor
930 static WERROR spoolss_DeleteMonitor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
931 struct spoolss_DeleteMonitor *r)
933 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
938 spoolss_DeletePrintProcessor
940 static WERROR spoolss_DeletePrintProcessor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
941 struct spoolss_DeletePrintProcessor *r)
943 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
948 spoolss_AddPrintProvidor
950 static WERROR spoolss_AddPrintProvidor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
951 struct spoolss_AddPrintProvidor *r)
953 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
958 spoolss_DeletePrintProvidor
960 static WERROR spoolss_DeletePrintProvidor(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
961 struct spoolss_DeletePrintProvidor *r)
963 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
968 spoolss_EnumPrintProcDataTypes
970 static WERROR spoolss_EnumPrintProcDataTypes(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
971 struct spoolss_EnumPrintProcDataTypes *r)
973 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
980 static WERROR spoolss_ResetPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
981 struct spoolss_ResetPrinter *r)
983 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
988 spoolss_GetPrinterDriver2
990 static WERROR spoolss_GetPrinterDriver2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
991 struct spoolss_GetPrinterDriver2 *r)
993 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
998 spoolss_FindFirstPrinterChangeNotification
1000 static WERROR spoolss_FindFirstPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1001 struct spoolss_FindFirstPrinterChangeNotification *r)
1003 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1008 spoolss_FindNextPrinterChangeNotification
1010 static WERROR spoolss_FindNextPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1011 struct spoolss_FindNextPrinterChangeNotification *r)
1013 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1018 spoolss_FindClosePrinterNotify
1020 static WERROR spoolss_FindClosePrinterNotify(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1021 struct spoolss_FindClosePrinterNotify *r)
1023 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1028 spoolss_RouterFindFirstPrinterChangeNotificationOld
1030 static WERROR spoolss_RouterFindFirstPrinterChangeNotificationOld(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1031 struct spoolss_RouterFindFirstPrinterChangeNotificationOld *r)
1033 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1038 spoolss_ReplyOpenPrinter
1040 static WERROR spoolss_ReplyOpenPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1041 struct spoolss_ReplyOpenPrinter *r)
1043 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1048 spoolss_RouterReplyPrinter
1050 static WERROR spoolss_RouterReplyPrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1051 struct spoolss_RouterReplyPrinter *r)
1053 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1058 spoolss_ReplyClosePrinter
1060 static WERROR spoolss_ReplyClosePrinter(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1061 struct spoolss_ReplyClosePrinter *r)
1063 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1070 static WERROR spoolss_AddPortEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1071 struct spoolss_AddPortEx *r)
1073 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1078 spoolss_RouterFindFirstPrinterChangeNotification
1080 static WERROR spoolss_RouterFindFirstPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1081 struct spoolss_RouterFindFirstPrinterChangeNotification *r)
1083 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1090 static WERROR spoolss_SpoolerInit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1091 struct spoolss_SpoolerInit *r)
1093 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1098 spoolss_ResetPrinterEx
1100 static WERROR spoolss_ResetPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1101 struct spoolss_ResetPrinterEx *r)
1103 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1108 spoolss_RemoteFindFirstPrinterChangeNotifyEx
1110 static WERROR spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1111 struct spoolss_RemoteFindFirstPrinterChangeNotifyEx *r)
1113 return WERR_NOT_SUPPORTED;
1118 spoolss_RouterRefreshPrinterChangeNotification
1120 static WERROR spoolss_RouterRefreshPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1121 struct spoolss_RouterRefreshPrinterChangeNotification *r)
1123 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1128 spoolss_RemoteFindNextPrinterChangeNotifyEx
1130 static WERROR spoolss_RemoteFindNextPrinterChangeNotifyEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1131 struct spoolss_RemoteFindNextPrinterChangeNotifyEx *r)
1133 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1140 static WERROR spoolss_44(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1141 struct spoolss_44 *r)
1143 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1147 static WERROR spoolss_OpenPrinterEx_server(struct dcesrv_call_state *dce_call,
1148 TALLOC_CTX *mem_ctx,
1149 struct spoolss_OpenPrinterEx *r,
1150 const char *server_name)
1152 struct spoolss_handle_server *state;
1153 struct dcesrv_handle *handle;
1156 /* Check printername is our name or our ip address
1158 ret = strequal(server_name, lp_netbios_name());
1160 const char *ip = socket_get_my_addr(dce_call->conn->srv_conn->socket, mem_ctx);
1161 W_ERROR_HAVE_NO_MEMORY(ip);
1163 ret = strequal(server_name, ip);
1165 return WERR_INVALID_PRINTER_NAME;
1169 /* TODO: do access check here */
1171 handle = dcesrv_handle_new(dce_call->context, SPOOLSS_HANDLE_SERVER);
1172 W_ERROR_HAVE_NO_MEMORY(handle);
1174 state = talloc(handle, struct spoolss_handle_server);
1175 W_ERROR_HAVE_NO_MEMORY(state);
1177 handle->data = state;
1179 state->access_mask = r->in.access_mask;
1181 *r->out.handle = handle->wire_handle;
1186 static WERROR spoolss_OpenPrinterEx_port(struct dcesrv_call_state *dce_call,
1187 TALLOC_CTX *mem_ctx,
1188 struct spoolss_OpenPrinterEx *r,
1189 const char *server_name,
1190 const char *port_name)
1192 DEBUG(1, ("looking for port [%s] (server[%s])\n", port_name, server_name));
1194 return WERR_INVALID_PRINTER_NAME;
1197 static WERROR spoolss_OpenPrinterEx_monitor(struct dcesrv_call_state *dce_call,
1198 TALLOC_CTX *mem_ctx,
1199 struct spoolss_OpenPrinterEx *r,
1200 const char *server_name,
1201 const char *monitor_name)
1203 if (strequal("Standard TCP/IP Port", monitor_name)) {
1204 struct dcesrv_handle *handle;
1206 handle = dcesrv_handle_new(dce_call->context, SPOOLSS_HANDLE_MONITOR);
1207 W_ERROR_HAVE_NO_MEMORY(handle);
1209 handle->data = NULL;
1211 *r->out.handle = handle->wire_handle;
1216 DEBUG(1, ("looking for monitor [%s] (server[%s])\n", monitor_name, server_name));
1218 return WERR_INVALID_PRINTER_NAME;
1221 static WERROR spoolss_OpenPrinterEx_printer(struct dcesrv_call_state *dce_call,
1222 TALLOC_CTX *mem_ctx,
1223 struct spoolss_OpenPrinterEx *r,
1224 const char *server_name,
1225 const char *printer_name)
1227 DEBUG(3, ("looking for printer [%s] (server[%s])\n", printer_name, server_name));
1229 return WERR_INVALID_PRINTER_NAME;
1233 spoolss_OpenPrinterEx
1235 static WERROR spoolss_OpenPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1236 struct spoolss_OpenPrinterEx *r)
1239 char *server = NULL;
1240 const char *object = r->in.printername;
1241 ZERO_STRUCTP(r->out.handle);
1243 /* no printername is there it's like open server */
1244 if (!r->in.printername) {
1245 return spoolss_OpenPrinterEx_server(dce_call, mem_ctx, r, NULL);
1248 /* just "\\" is invalid */
1249 if (strequal(r->in.printername, "\\\\")) {
1250 return WERR_INVALID_PRINTER_NAME;
1253 if (strncmp(r->in.printername, "\\\\", 2) == 0) {
1254 server = talloc_strdup(mem_ctx, r->in.printername + 2);
1255 W_ERROR_HAVE_NO_MEMORY(server);
1257 /* here we know we have "\\" in front not followed
1258 * by '\0', now see if we have another "\" in the string
1260 p = strchr_m(server, '\\');
1262 /* there's no other "\", so it's ("\\%s",server)
1264 return spoolss_OpenPrinterEx_server(dce_call, mem_ctx, r, server);
1266 /* here we know that we have ("\\%s\",server),
1267 * if we have '\0' as next then it's an invalid name
1268 * otherwise the printer_name
1271 /* everything that follows is the printer name */
1275 /* just "" as server is invalid */
1276 if (strequal(server, "")) {
1277 DEBUG(2,("OpenPrinterEx invalid print server: [%s][%s][%s]\n", r->in.printername, server, object));
1278 return WERR_INVALID_PRINTER_NAME;
1282 /* just "" is invalid */
1283 if (strequal(object, "")) {
1284 DEBUG(2,("OpenPrinterEx invalid object: [%s][%s][%s]\n", r->in.printername, server, object));
1285 return WERR_INVALID_PRINTER_NAME;
1288 DEBUG(3,("OpenPrinterEx object: [%s][%s][%s]\n", r->in.printername, server, object));
1290 #define XCV_PORT ",XcvPort "
1291 #define XCV_MONITOR ",XcvMonitor "
1292 if (strncmp(object, XCV_PORT, strlen(XCV_PORT)) == 0) {
1293 object += strlen(XCV_PORT);
1295 /* just "" is invalid */
1296 if (strequal(object, "")) {
1297 DEBUG(2,("OpenPrinterEx invalid port: [%s][%s][%s]\n", r->in.printername, server, object));
1298 return WERR_INVALID_PRINTER_NAME;
1301 return spoolss_OpenPrinterEx_port(dce_call, mem_ctx, r, server, object);
1302 } else if (strncmp(object, XCV_MONITOR, strlen(XCV_MONITOR)) == 0) {
1303 object += strlen(XCV_MONITOR);
1305 /* just "" is invalid */
1306 if (strequal(object, "")) {
1307 DEBUG(2,("OpenPrinterEx invalid monitor: [%s][%s][%s]\n", r->in.printername, server, object));
1308 return WERR_INVALID_PRINTER_NAME;
1311 return spoolss_OpenPrinterEx_monitor(dce_call, mem_ctx, r, server, object);
1314 return spoolss_OpenPrinterEx_printer(dce_call, mem_ctx, r, server, object);
1318 spoolss_AddPrinterEx
1320 static WERROR spoolss_AddPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1321 struct spoolss_AddPrinterEx *r)
1323 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1330 static WERROR spoolss_47(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1331 struct spoolss_47 *r)
1333 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1338 spoolss_EnumPrinterData
1340 static WERROR spoolss_EnumPrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1341 struct spoolss_EnumPrinterData *r)
1343 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1348 spoolss_DeletePrinterData
1350 static WERROR spoolss_DeletePrinterData(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1351 struct spoolss_DeletePrinterData *r)
1353 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1360 static WERROR spoolss_4a(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1361 struct spoolss_4a *r)
1363 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1370 static WERROR spoolss_4b(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1371 struct spoolss_4b *r)
1373 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1380 static WERROR spoolss_4c(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1381 struct spoolss_4c *r)
1383 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1388 spoolss_SetPrinterDataEx
1390 static WERROR spoolss_SetPrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1391 struct spoolss_SetPrinterDataEx *r)
1393 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1398 spoolss_GetPrinterDataEx
1400 static WERROR spoolss_GetPrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1401 struct spoolss_GetPrinterDataEx *r)
1403 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1408 spoolss_EnumPrinterDataEx
1410 static WERROR spoolss_EnumPrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1411 struct spoolss_EnumPrinterDataEx *r)
1413 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1418 spoolss_EnumPrinterKey
1420 static WERROR spoolss_EnumPrinterKey(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1421 struct spoolss_EnumPrinterKey *r)
1423 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1428 spoolss_DeletePrinterDataEx
1430 static WERROR spoolss_DeletePrinterDataEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1431 struct spoolss_DeletePrinterDataEx *r)
1433 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1438 spoolss_DeletePrinterKey
1440 static WERROR spoolss_DeletePrinterKey(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1441 struct spoolss_DeletePrinterKey *r)
1443 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1450 static WERROR spoolss_53(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1451 struct spoolss_53 *r)
1453 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1458 spoolss_DeletePrinterDriverEx
1460 static WERROR spoolss_DeletePrinterDriverEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1461 struct spoolss_DeletePrinterDriverEx *r)
1463 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1470 static WERROR spoolss_55(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1471 struct spoolss_55 *r)
1473 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1480 static WERROR spoolss_56(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1481 struct spoolss_56 *r)
1483 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1490 static WERROR spoolss_57(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1491 struct spoolss_57 *r)
1493 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1500 static WERROR spoolss_58(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1501 struct spoolss_58 *r)
1503 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1508 spoolss_AddPrinterDriverEx
1510 static WERROR spoolss_AddPrinterDriverEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1511 struct spoolss_AddPrinterDriverEx *r)
1513 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1520 static WERROR spoolss_5a(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1521 struct spoolss_5a *r)
1523 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1530 static WERROR spoolss_5b(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1531 struct spoolss_5b *r)
1533 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1540 static WERROR spoolss_5c(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1541 struct spoolss_5c *r)
1543 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1550 static WERROR spoolss_5d(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1551 struct spoolss_5d *r)
1553 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1560 static WERROR spoolss_5e(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1561 struct spoolss_5e *r)
1563 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1570 static WERROR spoolss_5f(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1571 struct spoolss_5f *r)
1573 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1577 /* include the generated boilerplate */
1578 #include "librpc/gen_ndr/ndr_spoolss_s.c"