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 "ntptr/ntptr.h"
27 #include "lib/socket/socket.h"
28 #include "librpc/gen_ndr/ndr_spoolss_c.h"
29 #include "auth/credentials/credentials.h"
30 #include "param/param.h"
36 #define SPOOLSS_BUFFER_UNION(fn,ic,info,level) \
37 ((info)?ndr_size_##fn(info, level, ic, 0):0)
39 #define SPOOLSS_BUFFER_UNION_ARRAY(fn,ic,info,level,count) \
40 ((info)?ndr_size_##fn##_info(dce_call, ic, level, count, info):0)
42 #define SPOOLSS_BUFFER_OK(val_true,val_false) ((r->in.offered >= *r->out.needed)?val_true:val_false)
44 static WERROR
dcesrv_spoolss_parse_printer_name(TALLOC_CTX
*mem_ctx
, const char *name
,
45 const char **_server_name
,
46 const char **_object_name
,
47 enum ntptr_HandleType
*_object_type
)
51 char *server_unc
= NULL
;
52 const char *object
= name
;
54 /* no printername is there it's like open server */
58 *_object_type
= NTPTR_HANDLE_SERVER
;
62 /* just "\\" is invalid */
63 if (strequal("\\\\", name
)) {
64 return WERR_INVALID_PRINTER_NAME
;
67 if (strncmp("\\\\", name
, 2) == 0) {
68 server_unc
= talloc_strdup(mem_ctx
, name
);
69 W_ERROR_HAVE_NO_MEMORY(server_unc
);
70 server
= server_unc
+ 2;
72 /* here we know we have "\\" in front not followed
73 * by '\0', now see if we have another "\" in the string
75 p
= strchr_m(server
, '\\');
77 /* there's no other "\", so it's ("\\%s",server)
79 *_server_name
= server_unc
;
81 *_object_type
= NTPTR_HANDLE_SERVER
;
84 /* here we know that we have ("\\%s\",server),
85 * if we have '\0' as next then it's an invalid name
86 * otherwise the printer_name
89 /* everything that follows is the printer name */
93 /* just "" as server is invalid */
94 if (strequal(server
, "")) {
95 return WERR_INVALID_PRINTER_NAME
;
99 /* just "" is invalid */
100 if (strequal(object
, "")) {
101 return WERR_INVALID_PRINTER_NAME
;
104 #define XCV_PORT ",XcvPort "
105 #define XCV_MONITOR ",XcvMonitor "
106 if (strncmp(object
, XCV_PORT
, strlen(XCV_PORT
)) == 0) {
107 object
+= strlen(XCV_PORT
);
109 /* just "" is invalid */
110 if (strequal(object
, "")) {
111 return WERR_INVALID_PRINTER_NAME
;
114 *_server_name
= server_unc
;
115 *_object_name
= object
;
116 *_object_type
= NTPTR_HANDLE_PORT
;
118 } else if (strncmp(object
, XCV_MONITOR
, strlen(XCV_MONITOR
)) == 0) {
119 object
+= strlen(XCV_MONITOR
);
121 /* just "" is invalid */
122 if (strequal(object
, "")) {
123 return WERR_INVALID_PRINTER_NAME
;
126 *_server_name
= server_unc
;
127 *_object_name
= object
;
128 *_object_type
= NTPTR_HANDLE_MONITOR
;
132 *_server_name
= server_unc
;
133 *_object_name
= object
;
134 *_object_type
= NTPTR_HANDLE_PRINTER
;
139 * Check server_name is:
140 * - "" , functions that don't allow "",
141 * should check that on their own, before calling this function
142 * - our name (only netbios yet, TODO: need to test dns name!)
143 * - our ip address of the current use socket
144 * otherwise return WERR_INVALID_PRINTER_NAME
146 static WERROR
dcesrv_spoolss_check_server_name(struct dcesrv_call_state
*dce_call
,
148 const char *server_name
)
151 struct socket_address
*myaddr
;
152 const char **aliases
;
153 const char *dnsdomain
;
157 if (!server_name
) return WERR_OK
;
160 ret
= strequal("",server_name
);
161 if (ret
) return WERR_OK
;
163 /* just "\\" is invalid */
164 if (strequal("\\\\", server_name
)) {
165 return WERR_INVALID_PRINTER_NAME
;
168 /* then we need "\\" */
169 if (strncmp("\\\\", server_name
, 2) != 0) {
170 return WERR_INVALID_PRINTER_NAME
;
175 /* NETBIOS NAME is ok */
176 ret
= strequal(lp_netbios_name(dce_call
->conn
->dce_ctx
->lp_ctx
), server_name
);
177 if (ret
) return WERR_OK
;
179 aliases
= lp_netbios_aliases(dce_call
->conn
->dce_ctx
->lp_ctx
);
181 for (i
=0; aliases
&& aliases
[i
]; i
++) {
182 if (strequal(aliases
[i
], server_name
)) {
188 * TODO: we need to check if aliases are also ok
190 dnsdomain
= lp_dnsdomain(dce_call
->conn
->dce_ctx
->lp_ctx
);
191 if (dnsdomain
!= NULL
) {
194 str
= talloc_asprintf(mem_ctx
, "%s.%s",
195 lp_netbios_name(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
;
577 r
->out
.type
= talloc_zero(mem_ctx
, enum winreg_Type
);
578 W_ERROR_HAVE_NO_MEMORY(r
->out
.type
);
580 r
->out
.needed
= talloc_zero(mem_ctx
, uint32_t);
581 W_ERROR_HAVE_NO_MEMORY(r
->out
.needed
);
583 r
->out
.data
= talloc_zero_array(mem_ctx
, uint8_t, r
->in
.offered
);
584 W_ERROR_HAVE_NO_MEMORY(r
->out
.data
);
586 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
587 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
591 switch (handle
->type
) {
592 case NTPTR_HANDLE_SERVER
:
593 status
= ntptr_GetPrintServerData(handle
, mem_ctx
, r
);
596 status
= WERR_FOOBAR
;
600 W_ERROR_NOT_OK_RETURN(status
);
602 *r
->out
.type
= SPOOLSS_BUFFER_OK(*r
->out
.type
, REG_NONE
);
603 r
->out
.data
= SPOOLSS_BUFFER_OK(r
->out
.data
, r
->out
.data
);
604 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_MORE_DATA
);
609 spoolss_SetPrinterData
611 static WERROR
dcesrv_spoolss_SetPrinterData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
612 struct spoolss_SetPrinterData
*r
)
614 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
619 spoolss_WaitForPrinterChange
621 static WERROR
dcesrv_spoolss_WaitForPrinterChange(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
622 struct spoolss_WaitForPrinterChange
*r
)
624 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
631 static WERROR
dcesrv_spoolss_ClosePrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
632 struct spoolss_ClosePrinter
*r
)
634 struct dcesrv_handle
*h
;
636 *r
->out
.handle
= *r
->in
.handle
;
638 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
642 ZERO_STRUCTP(r
->out
.handle
);
651 static WERROR
dcesrv_spoolss_AddForm(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
652 struct spoolss_AddForm
*r
)
654 struct ntptr_GenericHandle
*handle
;
655 struct dcesrv_handle
*h
;
658 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
659 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
663 switch (handle
->type
) {
664 case NTPTR_HANDLE_SERVER
:
665 status
= ntptr_AddPrintServerForm(handle
, mem_ctx
, r
);
666 W_ERROR_NOT_OK_RETURN(status
);
668 case NTPTR_HANDLE_PRINTER
:
669 status
= ntptr_AddPrinterForm(handle
, mem_ctx
, r
);
670 W_ERROR_NOT_OK_RETURN(status
);
683 static WERROR
dcesrv_spoolss_DeleteForm(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
684 struct spoolss_DeleteForm
*r
)
686 struct ntptr_GenericHandle
*handle
;
687 struct dcesrv_handle
*h
;
690 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
691 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
695 switch (handle
->type
) {
696 case NTPTR_HANDLE_SERVER
:
697 status
= ntptr_DeletePrintServerForm(handle
, mem_ctx
, r
);
698 W_ERROR_NOT_OK_RETURN(status
);
700 case NTPTR_HANDLE_PRINTER
:
701 status
= ntptr_DeletePrinterForm(handle
, mem_ctx
, r
);
702 W_ERROR_NOT_OK_RETURN(status
);
715 static WERROR
dcesrv_spoolss_GetForm(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
716 struct spoolss_GetForm
*r
)
718 struct ntptr_GenericHandle
*handle
;
719 struct dcesrv_handle
*h
;
721 struct smb_iconv_convenience
*ic
= lp_iconv_convenience(dce_call
->conn
->dce_ctx
->lp_ctx
);
723 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
724 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
728 switch (handle
->type
) {
729 case NTPTR_HANDLE_SERVER
:
731 * stupid, but w2k3 returns WERR_BADFID here?
734 case NTPTR_HANDLE_PRINTER
:
735 status
= ntptr_GetPrinterForm(handle
, mem_ctx
, r
);
736 W_ERROR_NOT_OK_RETURN(status
);
742 *r
->out
.needed
= SPOOLSS_BUFFER_UNION(spoolss_FormInfo
, ic
, r
->out
.info
, r
->in
.level
);
743 r
->out
.info
= SPOOLSS_BUFFER_OK(r
->out
.info
, NULL
);
744 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
751 static WERROR
dcesrv_spoolss_SetForm(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
752 struct spoolss_SetForm
*r
)
754 struct ntptr_GenericHandle
*handle
;
755 struct dcesrv_handle
*h
;
758 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
759 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
763 switch (handle
->type
) {
764 case NTPTR_HANDLE_SERVER
:
765 status
= ntptr_SetPrintServerForm(handle
, mem_ctx
, r
);
766 W_ERROR_NOT_OK_RETURN(status
);
768 case NTPTR_HANDLE_PRINTER
:
769 status
= ntptr_SetPrinterForm(handle
, mem_ctx
, r
);
770 W_ERROR_NOT_OK_RETURN(status
);
783 static WERROR
dcesrv_spoolss_EnumForms(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
784 struct spoolss_EnumForms
*r
)
786 struct ntptr_GenericHandle
*handle
;
787 struct dcesrv_handle
*h
;
789 struct smb_iconv_convenience
*ic
= lp_iconv_convenience(dce_call
->conn
->dce_ctx
->lp_ctx
);
791 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
792 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
796 switch (handle
->type
) {
797 case NTPTR_HANDLE_SERVER
:
798 status
= ntptr_EnumPrintServerForms(handle
, mem_ctx
, r
);
799 W_ERROR_NOT_OK_RETURN(status
);
801 case NTPTR_HANDLE_PRINTER
:
802 status
= ntptr_EnumPrinterForms(handle
, mem_ctx
, r
);
803 W_ERROR_NOT_OK_RETURN(status
);
809 *r
->out
.needed
= SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumForms
, ic
, *r
->out
.info
, r
->in
.level
, *r
->out
.count
);
810 *r
->out
.info
= SPOOLSS_BUFFER_OK(*r
->out
.info
, NULL
);
811 *r
->out
.count
= SPOOLSS_BUFFER_OK(*r
->out
.count
, 0);
812 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
819 static WERROR
dcesrv_spoolss_EnumPorts(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
820 struct spoolss_EnumPorts
*r
)
822 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
824 struct smb_iconv_convenience
*ic
= lp_iconv_convenience(ntptr
->lp_ctx
);
826 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, r
->in
.servername
);
827 W_ERROR_NOT_OK_RETURN(status
);
829 status
= ntptr_EnumPorts(ntptr
, mem_ctx
, r
);
830 W_ERROR_NOT_OK_RETURN(status
);
832 *r
->out
.needed
= SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPorts
, ic
, *r
->out
.info
, r
->in
.level
, *r
->out
.count
);
833 *r
->out
.info
= SPOOLSS_BUFFER_OK(*r
->out
.info
, NULL
);
834 *r
->out
.count
= SPOOLSS_BUFFER_OK(*r
->out
.count
, 0);
835 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
842 static WERROR
dcesrv_spoolss_EnumMonitors(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
843 struct spoolss_EnumMonitors
*r
)
845 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
847 struct smb_iconv_convenience
*ic
= lp_iconv_convenience(ntptr
->lp_ctx
);
849 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, r
->in
.servername
);
850 W_ERROR_NOT_OK_RETURN(status
);
852 status
= ntptr_EnumMonitors(ntptr
, mem_ctx
, r
);
853 W_ERROR_NOT_OK_RETURN(status
);
855 *r
->out
.needed
= SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumMonitors
, ic
, *r
->out
.info
, r
->in
.level
, *r
->out
.count
);
856 *r
->out
.info
= SPOOLSS_BUFFER_OK(*r
->out
.info
, NULL
);
857 *r
->out
.count
= SPOOLSS_BUFFER_OK(*r
->out
.count
, 0);
858 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
865 static WERROR
dcesrv_spoolss_AddPort(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
866 struct spoolss_AddPort
*r
)
868 return WERR_NOT_SUPPORTED
;
873 spoolss_ConfigurePort
875 static WERROR
dcesrv_spoolss_ConfigurePort(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
876 struct spoolss_ConfigurePort
*r
)
878 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
885 static WERROR
dcesrv_spoolss_DeletePort(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
886 struct spoolss_DeletePort
*r
)
888 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
893 spoolss_CreatePrinterIC
895 static WERROR
dcesrv_spoolss_CreatePrinterIC(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
896 struct spoolss_CreatePrinterIC
*r
)
898 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
903 spoolss_PlayGDIScriptOnPrinterIC
905 static WERROR
dcesrv_spoolss_PlayGDIScriptOnPrinterIC(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
906 struct spoolss_PlayGDIScriptOnPrinterIC
*r
)
908 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
913 spoolss_DeletePrinterIC
915 static WERROR
dcesrv_spoolss_DeletePrinterIC(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
916 struct spoolss_DeletePrinterIC
*r
)
918 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
923 spoolss_AddPrinterConnection
925 static WERROR
dcesrv_spoolss_AddPrinterConnection(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
926 struct spoolss_AddPrinterConnection
*r
)
928 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
933 spoolss_DeletePrinterConnection
935 static WERROR
dcesrv_spoolss_DeletePrinterConnection(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
936 struct spoolss_DeletePrinterConnection
*r
)
938 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
943 spoolss_PrinterMessageBox
945 static WERROR
dcesrv_spoolss_PrinterMessageBox(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
946 struct spoolss_PrinterMessageBox
*r
)
948 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
955 static WERROR
dcesrv_spoolss_AddMonitor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
956 struct spoolss_AddMonitor
*r
)
958 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
963 spoolss_DeleteMonitor
965 static WERROR
dcesrv_spoolss_DeleteMonitor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
966 struct spoolss_DeleteMonitor
*r
)
968 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
973 spoolss_DeletePrintProcessor
975 static WERROR
dcesrv_spoolss_DeletePrintProcessor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
976 struct spoolss_DeletePrintProcessor
*r
)
978 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
983 spoolss_AddPrintProvidor
985 static WERROR
dcesrv_spoolss_AddPrintProvidor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
986 struct spoolss_AddPrintProvidor
*r
)
988 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
993 spoolss_DeletePrintProvidor
995 static WERROR
dcesrv_spoolss_DeletePrintProvidor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
996 struct spoolss_DeletePrintProvidor
*r
)
998 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1003 spoolss_EnumPrintProcDataTypes
1005 static WERROR
dcesrv_spoolss_EnumPrintProcDataTypes(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1006 struct spoolss_EnumPrintProcDataTypes
*r
)
1013 spoolss_ResetPrinter
1015 static WERROR
dcesrv_spoolss_ResetPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1016 struct spoolss_ResetPrinter
*r
)
1018 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1023 spoolss_GetPrinterDriver2
1025 static WERROR
dcesrv_spoolss_GetPrinterDriver2(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1026 struct spoolss_GetPrinterDriver2
*r
)
1028 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1033 spoolss_FindFirstPrinterChangeNotification
1035 static WERROR
dcesrv_spoolss_FindFirstPrinterChangeNotification(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1036 struct spoolss_FindFirstPrinterChangeNotification
*r
)
1038 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1043 spoolss_FindNextPrinterChangeNotification
1045 static WERROR
dcesrv_spoolss_FindNextPrinterChangeNotification(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1046 struct spoolss_FindNextPrinterChangeNotification
*r
)
1048 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1053 spoolss_FindClosePrinterNotify
1055 static WERROR
dcesrv_spoolss_FindClosePrinterNotify(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1056 struct spoolss_FindClosePrinterNotify
*r
)
1058 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1063 spoolss_RouterFindFirstPrinterChangeNotificationOld
1065 static WERROR
dcesrv_spoolss_RouterFindFirstPrinterChangeNotificationOld(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1066 struct spoolss_RouterFindFirstPrinterChangeNotificationOld
*r
)
1068 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1073 spoolss_ReplyOpenPrinter
1075 static WERROR
dcesrv_spoolss_ReplyOpenPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1076 struct spoolss_ReplyOpenPrinter
*r
)
1078 struct dcesrv_handle
*handle
;
1080 handle
= dcesrv_handle_new(dce_call
->context
, SPOOLSS_NOTIFY
);
1081 W_ERROR_HAVE_NO_MEMORY(handle
);
1083 /* For now, just return a handle */
1085 *r
->out
.handle
= handle
->wire_handle
;
1092 spoolss_RouterReplyPrinter
1094 static WERROR
dcesrv_spoolss_RouterReplyPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1095 struct spoolss_RouterReplyPrinter
*r
)
1097 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1102 spoolss_ReplyClosePrinter
1104 static WERROR
dcesrv_spoolss_ReplyClosePrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1105 struct spoolss_ReplyClosePrinter
*r
)
1107 struct dcesrv_handle
*handle
;
1109 DCESRV_PULL_HANDLE_WERR(handle
, r
->in
.handle
, SPOOLSS_NOTIFY
);
1111 talloc_free(handle
);
1113 ZERO_STRUCTP(r
->out
.handle
);
1121 static WERROR
dcesrv_spoolss_AddPortEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1122 struct spoolss_AddPortEx
*r
)
1124 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1129 spoolss_RouterFindFirstPrinterChangeNotification
1131 static WERROR
dcesrv_spoolss_RouterFindFirstPrinterChangeNotification(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1132 struct spoolss_RouterFindFirstPrinterChangeNotification
*r
)
1134 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1141 static WERROR
dcesrv_spoolss_SpoolerInit(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1142 struct spoolss_SpoolerInit
*r
)
1144 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1149 spoolss_ResetPrinterEx
1151 static WERROR
dcesrv_spoolss_ResetPrinterEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1152 struct spoolss_ResetPrinterEx
*r
)
1154 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1159 spoolss_RemoteFindFirstPrinterChangeNotifyEx
1161 static WERROR
dcesrv_spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1162 struct spoolss_RemoteFindFirstPrinterChangeNotifyEx
*r
)
1164 struct dcerpc_pipe
*p
;
1165 struct dcerpc_binding
*binding
;
1167 struct spoolss_ReplyOpenPrinter rop
;
1168 struct cli_credentials
*creds
;
1169 struct policy_handle notify_handle
;
1171 DEBUG(2, ("Received RFFPCNex from %s\n", r
->in
.local_machine
));
1174 * TODO: for now just open a connection to the client and drop it again
1175 * to keep the w2k3 PrintServer
1176 * happy to allow to open the Add Printer GUI
1177 * and the torture suite passing
1180 binding
= talloc_zero(mem_ctx
, struct dcerpc_binding
);
1182 binding
->transport
= NCACN_NP
;
1183 if (strncmp(r
->in
.local_machine
, "\\\\", 2))
1184 return WERR_INVALID_COMPUTERNAME
;
1185 binding
->host
= r
->in
.local_machine
+2;
1187 creds
= cli_credentials_init_anon(mem_ctx
); /* FIXME: Use machine credentials instead ? */
1189 status
= dcerpc_pipe_connect_b(mem_ctx
, &p
, binding
, &ndr_table_spoolss
,
1190 creds
, dce_call
->event_ctx
,
1191 dce_call
->conn
->dce_ctx
->lp_ctx
);
1193 if (NT_STATUS_IS_ERR(status
)) {
1194 DEBUG(0, ("unable to call back to %s\n", r
->in
.local_machine
));
1195 return WERR_SERVER_UNAVAILABLE
;
1199 rop
.in
.server_name
= lp_netbios_name(dce_call
->conn
->dce_ctx
->lp_ctx
);
1200 W_ERROR_HAVE_NO_MEMORY(rop
.in
.server_name
);
1201 rop
.in
.printer_local
= 0;
1202 rop
.in
.type
= REG_NONE
;
1204 rop
.in
.buffer
= NULL
;
1205 rop
.out
.handle
= ¬ify_handle
;
1207 status
= dcerpc_spoolss_ReplyOpenPrinter_r(p
->binding_handle
, mem_ctx
, &rop
);
1208 if (NT_STATUS_IS_ERR(status
)) {
1209 DEBUG(0, ("unable to open remote printer %s\n",
1210 r
->in
.local_machine
));
1211 return WERR_SERVER_UNAVAILABLE
;
1221 spoolss_RouterReplyPrinterEx
1223 static WERROR
dcesrv_spoolss_RouterReplyPrinterEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1224 struct spoolss_RouterReplyPrinterEx
*r
)
1226 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1231 spoolss_RouterRefreshPrinterChangeNotify
1233 static WERROR
dcesrv_spoolss_RouterRefreshPrinterChangeNotify(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1234 struct spoolss_RouterRefreshPrinterChangeNotify
*r
)
1236 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1243 static WERROR
dcesrv_spoolss_44(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1244 struct spoolss_44
*r
)
1246 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1250 spoolss_OpenPrinterEx
1252 static WERROR
dcesrv_spoolss_OpenPrinterEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1253 struct spoolss_OpenPrinterEx
*r
)
1255 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
1256 struct ntptr_GenericHandle
*handle
;
1257 struct dcesrv_handle
*h
;
1260 enum ntptr_HandleType type
;
1263 ZERO_STRUCTP(r
->out
.handle
);
1265 status
= dcesrv_spoolss_parse_printer_name(mem_ctx
, r
->in
.printername
, &server
, &object
, &type
);
1266 W_ERROR_NOT_OK_RETURN(status
);
1268 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, server
);
1269 W_ERROR_NOT_OK_RETURN(status
);
1272 case NTPTR_HANDLE_SERVER
:
1273 status
= ntptr_OpenPrintServer(ntptr
, mem_ctx
, r
, server
, &handle
);
1274 W_ERROR_NOT_OK_RETURN(status
);
1276 case NTPTR_HANDLE_PORT
:
1277 status
= ntptr_OpenPort(ntptr
, mem_ctx
, r
, object
, &handle
);
1278 W_ERROR_NOT_OK_RETURN(status
);
1280 case NTPTR_HANDLE_MONITOR
:
1281 status
= ntptr_OpenMonitor(ntptr
, mem_ctx
, r
, object
, &handle
);
1282 W_ERROR_NOT_OK_RETURN(status
);
1284 case NTPTR_HANDLE_PRINTER
:
1285 status
= ntptr_OpenPrinter(ntptr
, mem_ctx
, r
, object
, &handle
);
1286 W_ERROR_NOT_OK_RETURN(status
);
1292 h
= dcesrv_handle_new(dce_call
->context
, handle
->type
);
1293 W_ERROR_HAVE_NO_MEMORY(h
);
1295 h
->data
= talloc_steal(h
, handle
);
1297 *r
->out
.handle
= h
->wire_handle
;
1303 spoolss_AddPrinterEx
1305 static WERROR
dcesrv_spoolss_AddPrinterEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1306 struct spoolss_AddPrinterEx
*r
)
1308 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1315 static WERROR
dcesrv_spoolss_47(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1316 struct spoolss_47
*r
)
1318 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1323 spoolss_EnumPrinterData
1325 static WERROR
dcesrv_spoolss_EnumPrinterData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1326 struct spoolss_EnumPrinterData
*r
)
1328 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1333 spoolss_DeletePrinterData
1335 static WERROR
dcesrv_spoolss_DeletePrinterData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1336 struct spoolss_DeletePrinterData
*r
)
1338 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1345 static WERROR
dcesrv_spoolss_4a(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1346 struct spoolss_4a
*r
)
1348 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1355 static WERROR
dcesrv_spoolss_4b(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1356 struct spoolss_4b
*r
)
1358 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1365 static WERROR
dcesrv_spoolss_4c(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1366 struct spoolss_4c
*r
)
1368 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1373 spoolss_SetPrinterDataEx
1375 static WERROR
dcesrv_spoolss_SetPrinterDataEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1376 struct spoolss_SetPrinterDataEx
*r
)
1378 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1383 spoolss_GetPrinterDataEx
1385 static WERROR
dcesrv_spoolss_GetPrinterDataEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1386 struct spoolss_GetPrinterDataEx
*r
)
1388 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1393 spoolss_EnumPrinterDataEx
1395 static WERROR
dcesrv_spoolss_EnumPrinterDataEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1396 struct spoolss_EnumPrinterDataEx
*r
)
1398 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1403 spoolss_EnumPrinterKey
1405 static WERROR
dcesrv_spoolss_EnumPrinterKey(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1406 struct spoolss_EnumPrinterKey
*r
)
1408 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1413 spoolss_DeletePrinterDataEx
1415 static WERROR
dcesrv_spoolss_DeletePrinterDataEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1416 struct spoolss_DeletePrinterDataEx
*r
)
1418 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1423 spoolss_DeletePrinterKey
1425 static WERROR
dcesrv_spoolss_DeletePrinterKey(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1426 struct spoolss_DeletePrinterKey
*r
)
1428 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1435 static WERROR
dcesrv_spoolss_53(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1436 struct spoolss_53
*r
)
1438 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1443 spoolss_DeletePrinterDriverEx
1445 static WERROR
dcesrv_spoolss_DeletePrinterDriverEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1446 struct spoolss_DeletePrinterDriverEx
*r
)
1448 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1455 static WERROR
dcesrv_spoolss_55(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1456 struct spoolss_55
*r
)
1458 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1465 static WERROR
dcesrv_spoolss_56(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1466 struct spoolss_56
*r
)
1468 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1475 static WERROR
dcesrv_spoolss_57(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1476 struct spoolss_57
*r
)
1478 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1485 static WERROR
dcesrv_spoolss_XcvData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1486 struct spoolss_XcvData
*r
)
1488 struct ntptr_GenericHandle
*handle
;
1489 struct dcesrv_handle
*h
;
1492 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
1493 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
1495 switch (handle
->type
) {
1496 case NTPTR_HANDLE_SERVER
:
1497 status
= ntptr_XcvDataPrintServer(handle
, mem_ctx
, r
);
1498 W_ERROR_NOT_OK_RETURN(status
);
1500 case NTPTR_HANDLE_PRINTER
:
1501 status
= ntptr_XcvDataPrinter(handle
, mem_ctx
, r
);
1502 W_ERROR_NOT_OK_RETURN(status
);
1504 case NTPTR_HANDLE_PORT
:
1505 status
= ntptr_XcvDataPort(handle
, mem_ctx
, r
);
1506 W_ERROR_NOT_OK_RETURN(status
);
1508 case NTPTR_HANDLE_MONITOR
:
1509 status
= ntptr_XcvDataMonitor(handle
, mem_ctx
, r
);
1510 W_ERROR_NOT_OK_RETURN(status
);
1516 /* TODO: handle the buffer sizes here! */
1522 spoolss_AddPrinterDriverEx
1524 static WERROR
dcesrv_spoolss_AddPrinterDriverEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1525 struct spoolss_AddPrinterDriverEx
*r
)
1527 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1534 static WERROR
dcesrv_spoolss_5a(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1535 struct spoolss_5a
*r
)
1537 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1544 static WERROR
dcesrv_spoolss_5b(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1545 struct spoolss_5b
*r
)
1547 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1554 static WERROR
dcesrv_spoolss_5c(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1555 struct spoolss_5c
*r
)
1557 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1564 static WERROR
dcesrv_spoolss_5d(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1565 struct spoolss_5d
*r
)
1567 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1574 static WERROR
dcesrv_spoolss_5e(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1575 struct spoolss_5e
*r
)
1577 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1584 static WERROR
dcesrv_spoolss_5f(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1585 struct spoolss_5f
*r
)
1587 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1593 static WERROR
dcesrv_spoolss_60(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1594 struct spoolss_60
*r
)
1596 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1603 static WERROR
dcesrv_spoolss_61(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1604 struct spoolss_61
*r
)
1606 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1613 static WERROR
dcesrv_spoolss_62(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1614 struct spoolss_62
*r
)
1616 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1623 static WERROR
dcesrv_spoolss_63(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1624 struct spoolss_63
*r
)
1626 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1633 static WERROR
dcesrv_spoolss_64(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1634 struct spoolss_64
*r
)
1636 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1643 static WERROR
dcesrv_spoolss_65(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1644 struct spoolss_65
*r
)
1646 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1651 spoolss_GetCorePrinterDrivers
1653 static WERROR
dcesrv_spoolss_GetCorePrinterDrivers(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1654 struct spoolss_GetCorePrinterDrivers
*r
)
1656 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1663 static WERROR
dcesrv_spoolss_67(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1664 struct spoolss_67
*r
)
1666 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1671 spoolss_GetPrinterDriverPackagePath
1673 static WERROR
dcesrv_spoolss_GetPrinterDriverPackagePath(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1674 struct spoolss_GetPrinterDriverPackagePath
*r
)
1676 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1683 static WERROR
dcesrv_spoolss_69(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1684 struct spoolss_69
*r
)
1686 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1693 static WERROR
dcesrv_spoolss_6a(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1694 struct spoolss_6a
*r
)
1696 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1703 static WERROR
dcesrv_spoolss_6b(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1704 struct spoolss_6b
*r
)
1706 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1713 static WERROR
dcesrv_spoolss_6c(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1714 struct spoolss_6c
*r
)
1716 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1723 static WERROR
dcesrv_spoolss_6d(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1724 struct spoolss_6d
*r
)
1726 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1731 /* include the generated boilerplate */
1732 #include "librpc/gen_ndr/ndr_spoolss_s.c"