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"
32 #include "param/param.h"
38 #define SPOOLSS_BUFFER_UNION(fn,ic,info,level) \
39 ((info)?ndr_size_##fn(info, level, ic, 0):0)
41 #define SPOOLSS_BUFFER_UNION_ARRAY(fn,ic,info,level,count) \
42 ((info)?ndr_size_##fn##_info(dce_call, ic, level, count, info):0)
44 #define SPOOLSS_BUFFER_OK(val_true,val_false) ((r->in.offered >= *r->out.needed)?val_true:val_false)
46 static WERROR
dcesrv_spoolss_parse_printer_name(TALLOC_CTX
*mem_ctx
, const char *name
,
47 const char **_server_name
,
48 const char **_object_name
,
49 enum ntptr_HandleType
*_object_type
)
53 char *server_unc
= NULL
;
54 const char *object
= name
;
56 /* no printername is there it's like open server */
60 *_object_type
= NTPTR_HANDLE_SERVER
;
64 /* just "\\" is invalid */
65 if (strequal("\\\\", name
)) {
66 return WERR_INVALID_PRINTER_NAME
;
69 if (strncmp("\\\\", name
, 2) == 0) {
70 server_unc
= talloc_strdup(mem_ctx
, name
);
71 W_ERROR_HAVE_NO_MEMORY(server_unc
);
72 server
= server_unc
+ 2;
74 /* here we know we have "\\" in front not followed
75 * by '\0', now see if we have another "\" in the string
77 p
= strchr_m(server
, '\\');
79 /* there's no other "\", so it's ("\\%s",server)
81 *_server_name
= server_unc
;
83 *_object_type
= NTPTR_HANDLE_SERVER
;
86 /* here we know that we have ("\\%s\",server),
87 * if we have '\0' as next then it's an invalid name
88 * otherwise the printer_name
91 /* everything that follows is the printer name */
95 /* just "" as server is invalid */
96 if (strequal(server
, "")) {
97 return WERR_INVALID_PRINTER_NAME
;
101 /* just "" is invalid */
102 if (strequal(object
, "")) {
103 return WERR_INVALID_PRINTER_NAME
;
106 #define XCV_PORT ",XcvPort "
107 #define XCV_MONITOR ",XcvMonitor "
108 if (strncmp(object
, XCV_PORT
, strlen(XCV_PORT
)) == 0) {
109 object
+= strlen(XCV_PORT
);
111 /* just "" is invalid */
112 if (strequal(object
, "")) {
113 return WERR_INVALID_PRINTER_NAME
;
116 *_server_name
= server_unc
;
117 *_object_name
= object
;
118 *_object_type
= NTPTR_HANDLE_PORT
;
120 } else if (strncmp(object
, XCV_MONITOR
, strlen(XCV_MONITOR
)) == 0) {
121 object
+= strlen(XCV_MONITOR
);
123 /* just "" is invalid */
124 if (strequal(object
, "")) {
125 return WERR_INVALID_PRINTER_NAME
;
128 *_server_name
= server_unc
;
129 *_object_name
= object
;
130 *_object_type
= NTPTR_HANDLE_MONITOR
;
134 *_server_name
= server_unc
;
135 *_object_name
= object
;
136 *_object_type
= NTPTR_HANDLE_PRINTER
;
141 * Check server_name is:
142 * - "" , functions that don't allow "",
143 * should check that on their own, before calling this function
144 * - our name (only netbios yet, TODO: need to test dns name!)
145 * - our ip address of the current use socket
146 * otherwise return WERR_INVALID_PRINTER_NAME
148 static WERROR
dcesrv_spoolss_check_server_name(struct dcesrv_call_state
*dce_call
,
150 const char *server_name
)
153 struct socket_address
*myaddr
;
154 const char **aliases
;
158 if (!server_name
) return WERR_OK
;
161 ret
= strequal("",server_name
);
162 if (ret
) return WERR_OK
;
164 /* just "\\" is invalid */
165 if (strequal("\\\\", server_name
)) {
166 return WERR_INVALID_PRINTER_NAME
;
169 /* then we need "\\" */
170 if (strncmp("\\\\", server_name
, 2) != 0) {
171 return WERR_INVALID_PRINTER_NAME
;
176 /* NETBIOS NAME is ok */
177 ret
= strequal(lp_netbios_name(dce_call
->conn
->dce_ctx
->lp_ctx
), server_name
);
178 if (ret
) return WERR_OK
;
180 aliases
= lp_netbios_aliases(dce_call
->conn
->dce_ctx
->lp_ctx
);
182 for (i
=0; aliases
&& aliases
[i
]; i
++) {
183 if (strequal(aliases
[i
], server_name
)) {
189 * TODO: we need to check if aliases are also ok
191 if (lp_realm(dce_call
->conn
->dce_ctx
->lp_ctx
)) {
194 str
= talloc_asprintf(mem_ctx
, "%s.%s",
195 lp_netbios_name(dce_call
->conn
->dce_ctx
->lp_ctx
),
196 lp_realm(dce_call
->conn
->dce_ctx
->lp_ctx
));
197 W_ERROR_HAVE_NO_MEMORY(str
);
199 ret
= strequal(str
, server_name
);
201 if (ret
) return WERR_OK
;
204 myaddr
= dcesrv_connection_get_my_addr(dce_call
->conn
, mem_ctx
);
205 W_ERROR_HAVE_NO_MEMORY(myaddr
);
207 ret
= strequal(myaddr
->addr
, server_name
);
209 if (ret
) return WERR_OK
;
211 return WERR_INVALID_PRINTER_NAME
;
214 static NTSTATUS
dcerpc_spoolss_bind(struct dcesrv_call_state
*dce_call
, const struct dcesrv_interface
*iface
)
217 struct ntptr_context
*ntptr
;
219 status
= ntptr_init_context(dce_call
->context
, dce_call
->conn
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
,
220 lp_ntptr_providor(dce_call
->conn
->dce_ctx
->lp_ctx
), &ntptr
);
221 NT_STATUS_NOT_OK_RETURN(status
);
223 dce_call
->context
->private_data
= ntptr
;
228 #define DCESRV_INTERFACE_SPOOLSS_BIND dcerpc_spoolss_bind
233 static WERROR
dcesrv_spoolss_EnumPrinters(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
234 struct spoolss_EnumPrinters
*r
)
236 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
238 struct smb_iconv_convenience
*ic
= lp_iconv_convenience(ntptr
->lp_ctx
);
240 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, r
->in
.server
);
241 W_ERROR_NOT_OK_RETURN(status
);
243 status
= ntptr_EnumPrinters(ntptr
, mem_ctx
, r
);
244 W_ERROR_NOT_OK_RETURN(status
);
246 *r
->out
.needed
= SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPrinters
, ic
, *r
->out
.info
, r
->in
.level
, *r
->out
.count
);
247 *r
->out
.info
= SPOOLSS_BUFFER_OK(*r
->out
.info
, NULL
);
248 *r
->out
.count
= SPOOLSS_BUFFER_OK(*r
->out
.count
, 0);
249 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
252 static WERROR
dcesrv_spoolss_OpenPrinterEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
253 struct spoolss_OpenPrinterEx
*r
);
257 static WERROR
dcesrv_spoolss_OpenPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
258 struct spoolss_OpenPrinter
*r
)
261 struct spoolss_OpenPrinterEx
*r2
;
263 r2
= talloc(mem_ctx
, struct spoolss_OpenPrinterEx
);
264 W_ERROR_HAVE_NO_MEMORY(r2
);
266 r2
->in
.printername
= r
->in
.printername
;
267 r2
->in
.datatype
= r
->in
.datatype
;
268 r2
->in
.devmode_ctr
= r
->in
.devmode_ctr
;
269 r2
->in
.access_mask
= r
->in
.access_mask
;
271 r2
->in
.userlevel
.level1
= NULL
;
273 r2
->out
.handle
= r
->out
.handle
;
275 /* TODO: we should take care about async replies here,
276 if spoolss_OpenPrinterEx() would be async!
278 status
= dcesrv_spoolss_OpenPrinterEx(dce_call
, mem_ctx
, r2
);
280 r
->out
.handle
= r2
->out
.handle
;
289 static WERROR
dcesrv_spoolss_SetJob(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
290 struct spoolss_SetJob
*r
)
292 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
299 static WERROR
dcesrv_spoolss_GetJob(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
300 struct spoolss_GetJob
*r
)
302 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
309 static WERROR
dcesrv_spoolss_EnumJobs(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
310 struct spoolss_EnumJobs
*r
)
319 static WERROR
dcesrv_spoolss_AddPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
320 struct spoolss_AddPrinter
*r
)
322 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
327 spoolss_DeletePrinter
329 static WERROR
dcesrv_spoolss_DeletePrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
330 struct spoolss_DeletePrinter
*r
)
332 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
339 static WERROR
dcesrv_spoolss_SetPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
340 struct spoolss_SetPrinter
*r
)
342 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
349 static WERROR
dcesrv_spoolss_GetPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
350 struct spoolss_GetPrinter
*r
)
352 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
357 spoolss_AddPrinterDriver
359 static WERROR
dcesrv_spoolss_AddPrinterDriver(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
360 struct spoolss_AddPrinterDriver
*r
)
362 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
367 spoolss_EnumPrinterDrivers
369 static WERROR
dcesrv_spoolss_EnumPrinterDrivers(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
370 struct spoolss_EnumPrinterDrivers
*r
)
372 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
374 struct smb_iconv_convenience
*ic
= lp_iconv_convenience(ntptr
->lp_ctx
);
376 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, r
->in
.server
);
377 W_ERROR_NOT_OK_RETURN(status
);
379 status
= ntptr_EnumPrinterDrivers(ntptr
, mem_ctx
, r
);
380 W_ERROR_NOT_OK_RETURN(status
);
382 *r
->out
.needed
= SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPrinterDrivers
, ic
, *r
->out
.info
, r
->in
.level
, *r
->out
.count
);
383 *r
->out
.info
= SPOOLSS_BUFFER_OK(*r
->out
.info
, NULL
);
384 *r
->out
.count
= SPOOLSS_BUFFER_OK(*r
->out
.count
, 0);
385 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
390 spoolss_GetPrinterDriver
392 static WERROR
dcesrv_spoolss_GetPrinterDriver(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
393 struct spoolss_GetPrinterDriver
*r
)
395 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
400 spoolss_GetPrinterDriverDirectory
402 static WERROR
dcesrv_spoolss_GetPrinterDriverDirectory(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
403 struct spoolss_GetPrinterDriverDirectory
*r
)
405 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
407 struct smb_iconv_convenience
*ic
= lp_iconv_convenience(ntptr
->lp_ctx
);
409 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, r
->in
.server
);
410 W_ERROR_NOT_OK_RETURN(status
);
412 status
= ntptr_GetPrinterDriverDirectory(ntptr
, mem_ctx
, r
);
413 W_ERROR_NOT_OK_RETURN(status
);
415 *r
->out
.needed
= SPOOLSS_BUFFER_UNION(spoolss_DriverDirectoryInfo
, ic
, r
->out
.info
, r
->in
.level
);
416 r
->out
.info
= SPOOLSS_BUFFER_OK(r
->out
.info
, NULL
);
417 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
422 spoolss_DeletePrinterDriver
424 static WERROR
dcesrv_spoolss_DeletePrinterDriver(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
425 struct spoolss_DeletePrinterDriver
*r
)
427 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
432 spoolss_AddPrintProcessor
434 static WERROR
dcesrv_spoolss_AddPrintProcessor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
435 struct spoolss_AddPrintProcessor
*r
)
437 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
442 spoolss_EnumPrintProcessors
444 static WERROR
dcesrv_spoolss_EnumPrintProcessors(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
445 struct spoolss_EnumPrintProcessors
*r
)
452 spoolss_GetPrintProcessorDirectory
454 static WERROR
dcesrv_spoolss_GetPrintProcessorDirectory(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
455 struct spoolss_GetPrintProcessorDirectory
*r
)
457 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
459 struct smb_iconv_convenience
*ic
= lp_iconv_convenience(ntptr
->lp_ctx
);
461 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, r
->in
.server
);
462 W_ERROR_NOT_OK_RETURN(status
);
464 status
= ntptr_GetPrintProcessorDirectory(ntptr
, mem_ctx
, r
);
465 W_ERROR_NOT_OK_RETURN(status
);
467 *r
->out
.needed
= SPOOLSS_BUFFER_UNION(spoolss_PrintProcessorDirectoryInfo
, ic
, r
->out
.info
, r
->in
.level
);
468 r
->out
.info
= SPOOLSS_BUFFER_OK(r
->out
.info
, NULL
);
469 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
474 spoolss_StartDocPrinter
476 static WERROR
dcesrv_spoolss_StartDocPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
477 struct spoolss_StartDocPrinter
*r
)
479 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
484 spoolss_StartPagePrinter
486 static WERROR
dcesrv_spoolss_StartPagePrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
487 struct spoolss_StartPagePrinter
*r
)
489 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
496 static WERROR
dcesrv_spoolss_WritePrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
497 struct spoolss_WritePrinter
*r
)
499 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
504 spoolss_EndPagePrinter
506 static WERROR
dcesrv_spoolss_EndPagePrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
507 struct spoolss_EndPagePrinter
*r
)
509 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
516 static WERROR
dcesrv_spoolss_AbortPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
517 struct spoolss_AbortPrinter
*r
)
519 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
526 static WERROR
dcesrv_spoolss_ReadPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
527 struct spoolss_ReadPrinter
*r
)
529 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
534 spoolss_EndDocPrinter
536 static WERROR
dcesrv_spoolss_EndDocPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
537 struct spoolss_EndDocPrinter
*r
)
539 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
546 static WERROR
dcesrv_spoolss_AddJob(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
547 struct spoolss_AddJob
*r
)
549 if (r
->in
.level
!= 1) {
550 return WERR_UNKNOWN_LEVEL
;
553 return WERR_INVALID_PARAM
;
560 static WERROR
dcesrv_spoolss_ScheduleJob(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
561 struct spoolss_ScheduleJob
*r
)
563 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
568 spoolss_GetPrinterData
570 static WERROR
dcesrv_spoolss_GetPrinterData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
571 struct spoolss_GetPrinterData
*r
)
573 struct ntptr_GenericHandle
*handle
;
574 struct dcesrv_handle
*h
;
576 struct smb_iconv_convenience
*ic
= lp_iconv_convenience(dce_call
->conn
->dce_ctx
->lp_ctx
);
578 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
579 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
583 r
->out
.type
= talloc_zero(mem_ctx
, enum winreg_Type
);
584 W_ERROR_HAVE_NO_MEMORY(r
->out
.type
);
586 r
->out
.needed
= talloc_zero(mem_ctx
, uint32_t);
587 W_ERROR_HAVE_NO_MEMORY(r
->out
.needed
);
589 r
->out
.data
= talloc_zero(mem_ctx
, union spoolss_PrinterData
);
590 W_ERROR_HAVE_NO_MEMORY(r
->out
.data
);
592 switch (handle
->type
) {
593 case NTPTR_HANDLE_SERVER
:
594 status
= ntptr_GetPrintServerData(handle
, mem_ctx
, r
);
597 status
= WERR_FOOBAR
;
601 W_ERROR_NOT_OK_RETURN(status
);
603 *r
->out
.needed
= ndr_size_spoolss_PrinterData(r
->out
.data
, *r
->out
.type
, ic
, 0);
604 *r
->out
.type
= SPOOLSS_BUFFER_OK(*r
->out
.type
, REG_NONE
);
605 r
->out
.data
= SPOOLSS_BUFFER_OK(r
->out
.data
, r
->out
.data
);
606 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_MORE_DATA
);
611 spoolss_SetPrinterData
613 static WERROR
dcesrv_spoolss_SetPrinterData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
614 struct spoolss_SetPrinterData
*r
)
616 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
621 spoolss_WaitForPrinterChange
623 static WERROR
dcesrv_spoolss_WaitForPrinterChange(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
624 struct spoolss_WaitForPrinterChange
*r
)
626 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
633 static WERROR
dcesrv_spoolss_ClosePrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
634 struct spoolss_ClosePrinter
*r
)
636 struct dcesrv_handle
*h
;
638 *r
->out
.handle
= *r
->in
.handle
;
640 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
644 ZERO_STRUCTP(r
->out
.handle
);
653 static WERROR
dcesrv_spoolss_AddForm(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
654 struct spoolss_AddForm
*r
)
656 struct ntptr_GenericHandle
*handle
;
657 struct dcesrv_handle
*h
;
660 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
661 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
665 switch (handle
->type
) {
666 case NTPTR_HANDLE_SERVER
:
667 status
= ntptr_AddPrintServerForm(handle
, mem_ctx
, r
);
668 W_ERROR_NOT_OK_RETURN(status
);
670 case NTPTR_HANDLE_PRINTER
:
671 status
= ntptr_AddPrinterForm(handle
, mem_ctx
, r
);
672 W_ERROR_NOT_OK_RETURN(status
);
685 static WERROR
dcesrv_spoolss_DeleteForm(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
686 struct spoolss_DeleteForm
*r
)
688 struct ntptr_GenericHandle
*handle
;
689 struct dcesrv_handle
*h
;
692 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
693 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
697 switch (handle
->type
) {
698 case NTPTR_HANDLE_SERVER
:
699 status
= ntptr_DeletePrintServerForm(handle
, mem_ctx
, r
);
700 W_ERROR_NOT_OK_RETURN(status
);
702 case NTPTR_HANDLE_PRINTER
:
703 status
= ntptr_DeletePrinterForm(handle
, mem_ctx
, r
);
704 W_ERROR_NOT_OK_RETURN(status
);
717 static WERROR
dcesrv_spoolss_GetForm(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
718 struct spoolss_GetForm
*r
)
720 struct ntptr_GenericHandle
*handle
;
721 struct dcesrv_handle
*h
;
723 struct smb_iconv_convenience
*ic
= lp_iconv_convenience(dce_call
->conn
->dce_ctx
->lp_ctx
);
725 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
726 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
730 switch (handle
->type
) {
731 case NTPTR_HANDLE_SERVER
:
733 * stupid, but w2k3 returns WERR_BADFID here?
736 case NTPTR_HANDLE_PRINTER
:
737 status
= ntptr_GetPrinterForm(handle
, mem_ctx
, r
);
738 W_ERROR_NOT_OK_RETURN(status
);
744 *r
->out
.needed
= SPOOLSS_BUFFER_UNION(spoolss_FormInfo
, ic
, r
->out
.info
, r
->in
.level
);
745 r
->out
.info
= SPOOLSS_BUFFER_OK(r
->out
.info
, NULL
);
746 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
753 static WERROR
dcesrv_spoolss_SetForm(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
754 struct spoolss_SetForm
*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_SetPrintServerForm(handle
, mem_ctx
, r
);
768 W_ERROR_NOT_OK_RETURN(status
);
770 case NTPTR_HANDLE_PRINTER
:
771 status
= ntptr_SetPrinterForm(handle
, mem_ctx
, r
);
772 W_ERROR_NOT_OK_RETURN(status
);
785 static WERROR
dcesrv_spoolss_EnumForms(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
786 struct spoolss_EnumForms
*r
)
788 struct ntptr_GenericHandle
*handle
;
789 struct dcesrv_handle
*h
;
791 struct smb_iconv_convenience
*ic
= lp_iconv_convenience(dce_call
->conn
->dce_ctx
->lp_ctx
);
793 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
794 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
798 switch (handle
->type
) {
799 case NTPTR_HANDLE_SERVER
:
800 status
= ntptr_EnumPrintServerForms(handle
, mem_ctx
, r
);
801 W_ERROR_NOT_OK_RETURN(status
);
803 case NTPTR_HANDLE_PRINTER
:
804 status
= ntptr_EnumPrinterForms(handle
, mem_ctx
, r
);
805 W_ERROR_NOT_OK_RETURN(status
);
811 *r
->out
.needed
= SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumForms
, ic
, *r
->out
.info
, r
->in
.level
, *r
->out
.count
);
812 *r
->out
.info
= SPOOLSS_BUFFER_OK(*r
->out
.info
, NULL
);
813 *r
->out
.count
= SPOOLSS_BUFFER_OK(*r
->out
.count
, 0);
814 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
821 static WERROR
dcesrv_spoolss_EnumPorts(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
822 struct spoolss_EnumPorts
*r
)
824 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
826 struct smb_iconv_convenience
*ic
= lp_iconv_convenience(ntptr
->lp_ctx
);
828 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, r
->in
.servername
);
829 W_ERROR_NOT_OK_RETURN(status
);
831 status
= ntptr_EnumPorts(ntptr
, mem_ctx
, r
);
832 W_ERROR_NOT_OK_RETURN(status
);
834 *r
->out
.needed
= SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPorts
, ic
, *r
->out
.info
, r
->in
.level
, *r
->out
.count
);
835 *r
->out
.info
= SPOOLSS_BUFFER_OK(*r
->out
.info
, NULL
);
836 *r
->out
.count
= SPOOLSS_BUFFER_OK(*r
->out
.count
, 0);
837 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
844 static WERROR
dcesrv_spoolss_EnumMonitors(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
845 struct spoolss_EnumMonitors
*r
)
847 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
849 struct smb_iconv_convenience
*ic
= lp_iconv_convenience(ntptr
->lp_ctx
);
851 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, r
->in
.servername
);
852 W_ERROR_NOT_OK_RETURN(status
);
854 status
= ntptr_EnumMonitors(ntptr
, mem_ctx
, r
);
855 W_ERROR_NOT_OK_RETURN(status
);
857 *r
->out
.needed
= SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumMonitors
, ic
, *r
->out
.info
, r
->in
.level
, *r
->out
.count
);
858 *r
->out
.info
= SPOOLSS_BUFFER_OK(*r
->out
.info
, NULL
);
859 *r
->out
.count
= SPOOLSS_BUFFER_OK(*r
->out
.count
, 0);
860 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
867 static WERROR
dcesrv_spoolss_AddPort(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
868 struct spoolss_AddPort
*r
)
870 return WERR_NOT_SUPPORTED
;
875 spoolss_ConfigurePort
877 static WERROR
dcesrv_spoolss_ConfigurePort(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
878 struct spoolss_ConfigurePort
*r
)
880 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
887 static WERROR
dcesrv_spoolss_DeletePort(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
888 struct spoolss_DeletePort
*r
)
890 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
895 spoolss_CreatePrinterIC
897 static WERROR
dcesrv_spoolss_CreatePrinterIC(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
898 struct spoolss_CreatePrinterIC
*r
)
900 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
905 spoolss_PlayGDIScriptOnPrinterIC
907 static WERROR
dcesrv_spoolss_PlayGDIScriptOnPrinterIC(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
908 struct spoolss_PlayGDIScriptOnPrinterIC
*r
)
910 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
915 spoolss_DeletePrinterIC
917 static WERROR
dcesrv_spoolss_DeletePrinterIC(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
918 struct spoolss_DeletePrinterIC
*r
)
920 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
925 spoolss_AddPrinterConnection
927 static WERROR
dcesrv_spoolss_AddPrinterConnection(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
928 struct spoolss_AddPrinterConnection
*r
)
930 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
935 spoolss_DeletePrinterConnection
937 static WERROR
dcesrv_spoolss_DeletePrinterConnection(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
938 struct spoolss_DeletePrinterConnection
*r
)
940 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
945 spoolss_PrinterMessageBox
947 static WERROR
dcesrv_spoolss_PrinterMessageBox(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
948 struct spoolss_PrinterMessageBox
*r
)
950 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
957 static WERROR
dcesrv_spoolss_AddMonitor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
958 struct spoolss_AddMonitor
*r
)
960 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
965 spoolss_DeleteMonitor
967 static WERROR
dcesrv_spoolss_DeleteMonitor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
968 struct spoolss_DeleteMonitor
*r
)
970 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
975 spoolss_DeletePrintProcessor
977 static WERROR
dcesrv_spoolss_DeletePrintProcessor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
978 struct spoolss_DeletePrintProcessor
*r
)
980 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
985 spoolss_AddPrintProvidor
987 static WERROR
dcesrv_spoolss_AddPrintProvidor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
988 struct spoolss_AddPrintProvidor
*r
)
990 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
995 spoolss_DeletePrintProvidor
997 static WERROR
dcesrv_spoolss_DeletePrintProvidor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
998 struct spoolss_DeletePrintProvidor
*r
)
1000 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1005 spoolss_EnumPrintProcDataTypes
1007 static WERROR
dcesrv_spoolss_EnumPrintProcDataTypes(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1008 struct spoolss_EnumPrintProcDataTypes
*r
)
1015 spoolss_ResetPrinter
1017 static WERROR
dcesrv_spoolss_ResetPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1018 struct spoolss_ResetPrinter
*r
)
1020 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1025 spoolss_GetPrinterDriver2
1027 static WERROR
dcesrv_spoolss_GetPrinterDriver2(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1028 struct spoolss_GetPrinterDriver2
*r
)
1030 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1035 spoolss_FindFirstPrinterChangeNotification
1037 static WERROR
dcesrv_spoolss_FindFirstPrinterChangeNotification(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1038 struct spoolss_FindFirstPrinterChangeNotification
*r
)
1040 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1045 spoolss_FindNextPrinterChangeNotification
1047 static WERROR
dcesrv_spoolss_FindNextPrinterChangeNotification(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1048 struct spoolss_FindNextPrinterChangeNotification
*r
)
1050 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1055 spoolss_FindClosePrinterNotify
1057 static WERROR
dcesrv_spoolss_FindClosePrinterNotify(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1058 struct spoolss_FindClosePrinterNotify
*r
)
1060 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1065 spoolss_RouterFindFirstPrinterChangeNotificationOld
1067 static WERROR
dcesrv_spoolss_RouterFindFirstPrinterChangeNotificationOld(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1068 struct spoolss_RouterFindFirstPrinterChangeNotificationOld
*r
)
1070 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1075 spoolss_ReplyOpenPrinter
1077 static WERROR
dcesrv_spoolss_ReplyOpenPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1078 struct spoolss_ReplyOpenPrinter
*r
)
1080 struct dcesrv_handle
*handle
;
1082 handle
= dcesrv_handle_new(dce_call
->context
, SPOOLSS_NOTIFY
);
1083 W_ERROR_HAVE_NO_MEMORY(handle
);
1085 /* For now, just return a handle */
1087 *r
->out
.handle
= handle
->wire_handle
;
1094 spoolss_RouterReplyPrinter
1096 static WERROR
dcesrv_spoolss_RouterReplyPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1097 struct spoolss_RouterReplyPrinter
*r
)
1099 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1104 spoolss_ReplyClosePrinter
1106 static WERROR
dcesrv_spoolss_ReplyClosePrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1107 struct spoolss_ReplyClosePrinter
*r
)
1109 struct dcesrv_handle
*handle
;
1111 DCESRV_PULL_HANDLE_WERR(handle
, r
->in
.handle
, SPOOLSS_NOTIFY
);
1113 talloc_free(handle
);
1115 ZERO_STRUCTP(r
->out
.handle
);
1123 static WERROR
dcesrv_spoolss_AddPortEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1124 struct spoolss_AddPortEx
*r
)
1126 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1131 spoolss_RouterFindFirstPrinterChangeNotification
1133 static WERROR
dcesrv_spoolss_RouterFindFirstPrinterChangeNotification(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1134 struct spoolss_RouterFindFirstPrinterChangeNotification
*r
)
1136 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1143 static WERROR
dcesrv_spoolss_SpoolerInit(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1144 struct spoolss_SpoolerInit
*r
)
1146 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1151 spoolss_ResetPrinterEx
1153 static WERROR
dcesrv_spoolss_ResetPrinterEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1154 struct spoolss_ResetPrinterEx
*r
)
1156 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1161 spoolss_RemoteFindFirstPrinterChangeNotifyEx
1163 static WERROR
dcesrv_spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1164 struct spoolss_RemoteFindFirstPrinterChangeNotifyEx
*r
)
1166 struct dcerpc_pipe
*p
;
1167 struct dcerpc_binding
*binding
;
1169 struct spoolss_ReplyOpenPrinter rop
;
1170 struct cli_credentials
*creds
;
1171 struct policy_handle notify_handle
;
1173 DEBUG(2, ("Received RFFPCNex from %s\n", r
->in
.local_machine
));
1176 * TODO: for now just open a connection to the client and drop it again
1177 * to keep the w2k3 PrintServer
1178 * happy to allow to open the Add Printer GUI
1179 * and the torture suite passing
1182 binding
= talloc_zero(mem_ctx
, struct dcerpc_binding
);
1184 binding
->transport
= NCACN_NP
;
1185 if (strncmp(r
->in
.local_machine
, "\\\\", 2))
1186 return WERR_INVALID_COMPUTERNAME
;
1187 binding
->host
= r
->in
.local_machine
+2;
1189 creds
= cli_credentials_init_anon(mem_ctx
); /* FIXME: Use machine credentials instead ? */
1191 status
= dcerpc_pipe_connect_b(mem_ctx
, &p
, binding
, &ndr_table_spoolss
,
1192 creds
, dce_call
->event_ctx
,
1193 dce_call
->conn
->dce_ctx
->lp_ctx
);
1195 if (NT_STATUS_IS_ERR(status
)) {
1196 DEBUG(0, ("unable to call back to %s\n", r
->in
.local_machine
));
1197 return WERR_SERVER_UNAVAILABLE
;
1201 rop
.in
.server_name
= lp_netbios_name(dce_call
->conn
->dce_ctx
->lp_ctx
);
1202 W_ERROR_HAVE_NO_MEMORY(rop
.in
.server_name
);
1203 rop
.in
.printer_local
= 0;
1204 rop
.in
.type
= REG_NONE
;
1206 rop
.in
.buffer
= NULL
;
1207 rop
.out
.handle
= ¬ify_handle
;
1209 status
= dcerpc_spoolss_ReplyOpenPrinter(p
, mem_ctx
, &rop
);
1210 if (NT_STATUS_IS_ERR(status
)) {
1211 DEBUG(0, ("unable to open remote printer %s\n",
1212 r
->in
.local_machine
));
1213 return WERR_SERVER_UNAVAILABLE
;
1223 spoolss_RouterReplyPrinterEx
1225 static WERROR
dcesrv_spoolss_RouterReplyPrinterEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1226 struct spoolss_RouterReplyPrinterEx
*r
)
1228 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1233 spoolss_RouterRefreshPrinterChangeNotify
1235 static WERROR
dcesrv_spoolss_RouterRefreshPrinterChangeNotify(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1236 struct spoolss_RouterRefreshPrinterChangeNotify
*r
)
1238 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1245 static WERROR
dcesrv_spoolss_44(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1246 struct spoolss_44
*r
)
1248 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1252 spoolss_OpenPrinterEx
1254 static WERROR
dcesrv_spoolss_OpenPrinterEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1255 struct spoolss_OpenPrinterEx
*r
)
1257 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
1258 struct ntptr_GenericHandle
*handle
;
1259 struct dcesrv_handle
*h
;
1262 enum ntptr_HandleType type
;
1265 ZERO_STRUCTP(r
->out
.handle
);
1267 status
= dcesrv_spoolss_parse_printer_name(mem_ctx
, r
->in
.printername
, &server
, &object
, &type
);
1268 W_ERROR_NOT_OK_RETURN(status
);
1270 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, server
);
1271 W_ERROR_NOT_OK_RETURN(status
);
1274 case NTPTR_HANDLE_SERVER
:
1275 status
= ntptr_OpenPrintServer(ntptr
, mem_ctx
, r
, server
, &handle
);
1276 W_ERROR_NOT_OK_RETURN(status
);
1278 case NTPTR_HANDLE_PORT
:
1279 status
= ntptr_OpenPort(ntptr
, mem_ctx
, r
, object
, &handle
);
1280 W_ERROR_NOT_OK_RETURN(status
);
1282 case NTPTR_HANDLE_MONITOR
:
1283 status
= ntptr_OpenMonitor(ntptr
, mem_ctx
, r
, object
, &handle
);
1284 W_ERROR_NOT_OK_RETURN(status
);
1286 case NTPTR_HANDLE_PRINTER
:
1287 status
= ntptr_OpenPrinter(ntptr
, mem_ctx
, r
, object
, &handle
);
1288 W_ERROR_NOT_OK_RETURN(status
);
1294 h
= dcesrv_handle_new(dce_call
->context
, handle
->type
);
1295 W_ERROR_HAVE_NO_MEMORY(h
);
1297 h
->data
= talloc_steal(h
, handle
);
1299 *r
->out
.handle
= h
->wire_handle
;
1305 spoolss_AddPrinterEx
1307 static WERROR
dcesrv_spoolss_AddPrinterEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1308 struct spoolss_AddPrinterEx
*r
)
1310 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1317 static WERROR
dcesrv_spoolss_47(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1318 struct spoolss_47
*r
)
1320 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1325 spoolss_EnumPrinterData
1327 static WERROR
dcesrv_spoolss_EnumPrinterData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1328 struct spoolss_EnumPrinterData
*r
)
1330 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1335 spoolss_DeletePrinterData
1337 static WERROR
dcesrv_spoolss_DeletePrinterData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1338 struct spoolss_DeletePrinterData
*r
)
1340 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1347 static WERROR
dcesrv_spoolss_4a(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1348 struct spoolss_4a
*r
)
1350 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1357 static WERROR
dcesrv_spoolss_4b(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1358 struct spoolss_4b
*r
)
1360 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1367 static WERROR
dcesrv_spoolss_4c(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1368 struct spoolss_4c
*r
)
1370 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1375 spoolss_SetPrinterDataEx
1377 static WERROR
dcesrv_spoolss_SetPrinterDataEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1378 struct spoolss_SetPrinterDataEx
*r
)
1380 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1385 spoolss_GetPrinterDataEx
1387 static WERROR
dcesrv_spoolss_GetPrinterDataEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1388 struct spoolss_GetPrinterDataEx
*r
)
1390 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1395 spoolss_EnumPrinterDataEx
1397 static WERROR
dcesrv_spoolss_EnumPrinterDataEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1398 struct spoolss_EnumPrinterDataEx
*r
)
1400 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1405 spoolss_EnumPrinterKey
1407 static WERROR
dcesrv_spoolss_EnumPrinterKey(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1408 struct spoolss_EnumPrinterKey
*r
)
1410 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1415 spoolss_DeletePrinterDataEx
1417 static WERROR
dcesrv_spoolss_DeletePrinterDataEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1418 struct spoolss_DeletePrinterDataEx
*r
)
1420 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1425 spoolss_DeletePrinterKey
1427 static WERROR
dcesrv_spoolss_DeletePrinterKey(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1428 struct spoolss_DeletePrinterKey
*r
)
1430 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1437 static WERROR
dcesrv_spoolss_53(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1438 struct spoolss_53
*r
)
1440 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1445 spoolss_DeletePrinterDriverEx
1447 static WERROR
dcesrv_spoolss_DeletePrinterDriverEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1448 struct spoolss_DeletePrinterDriverEx
*r
)
1450 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1457 static WERROR
dcesrv_spoolss_55(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1458 struct spoolss_55
*r
)
1460 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1467 static WERROR
dcesrv_spoolss_56(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1468 struct spoolss_56
*r
)
1470 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1477 static WERROR
dcesrv_spoolss_57(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1478 struct spoolss_57
*r
)
1480 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1487 static WERROR
dcesrv_spoolss_XcvData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1488 struct spoolss_XcvData
*r
)
1490 struct ntptr_GenericHandle
*handle
;
1491 struct dcesrv_handle
*h
;
1494 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
1495 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
1497 switch (handle
->type
) {
1498 case NTPTR_HANDLE_SERVER
:
1499 status
= ntptr_XcvDataPrintServer(handle
, mem_ctx
, r
);
1500 W_ERROR_NOT_OK_RETURN(status
);
1502 case NTPTR_HANDLE_PRINTER
:
1503 status
= ntptr_XcvDataPrinter(handle
, mem_ctx
, r
);
1504 W_ERROR_NOT_OK_RETURN(status
);
1506 case NTPTR_HANDLE_PORT
:
1507 status
= ntptr_XcvDataPort(handle
, mem_ctx
, r
);
1508 W_ERROR_NOT_OK_RETURN(status
);
1510 case NTPTR_HANDLE_MONITOR
:
1511 status
= ntptr_XcvDataMonitor(handle
, mem_ctx
, r
);
1512 W_ERROR_NOT_OK_RETURN(status
);
1518 /* TODO: handle the buffer sizes here! */
1524 spoolss_AddPrinterDriverEx
1526 static WERROR
dcesrv_spoolss_AddPrinterDriverEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1527 struct spoolss_AddPrinterDriverEx
*r
)
1529 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1536 static WERROR
dcesrv_spoolss_5a(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1537 struct spoolss_5a
*r
)
1539 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1546 static WERROR
dcesrv_spoolss_5b(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1547 struct spoolss_5b
*r
)
1549 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1556 static WERROR
dcesrv_spoolss_5c(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1557 struct spoolss_5c
*r
)
1559 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1566 static WERROR
dcesrv_spoolss_5d(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1567 struct spoolss_5d
*r
)
1569 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1576 static WERROR
dcesrv_spoolss_5e(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1577 struct spoolss_5e
*r
)
1579 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1586 static WERROR
dcesrv_spoolss_5f(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1587 struct spoolss_5f
*r
)
1589 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1593 /* include the generated boilerplate */
1594 #include "librpc/gen_ndr/ndr_spoolss_s.c"