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/tsocket/tsocket.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,info,level) \
37 ((info)?ndr_size_##fn(info, level, 0):0)
39 #define SPOOLSS_BUFFER_UNION_ARRAY(fn,info,level,count) \
40 ((info)?ndr_size_##fn##_info(dce_call, 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 const struct tsocket_address
*local_address
;
153 const char **aliases
;
154 const char *dnsdomain
;
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(lpcfg_netbios_name(dce_call
->conn
->dce_ctx
->lp_ctx
), server_name
);
178 if (ret
) return WERR_OK
;
180 aliases
= lpcfg_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 dnsdomain
= lpcfg_dnsdomain(dce_call
->conn
->dce_ctx
->lp_ctx
);
192 if (dnsdomain
!= NULL
) {
195 str
= talloc_asprintf(mem_ctx
, "%s.%s",
196 lpcfg_netbios_name(dce_call
->conn
->dce_ctx
->lp_ctx
),
198 W_ERROR_HAVE_NO_MEMORY(str
);
200 ret
= strequal(str
, server_name
);
202 if (ret
) return WERR_OK
;
205 local_address
= dcesrv_connection_get_local_address(dce_call
->conn
);
207 myaddr
= tsocket_address_inet_addr_string(local_address
, mem_ctx
);
208 W_ERROR_HAVE_NO_MEMORY(myaddr
);
210 ret
= strequal(myaddr
, server_name
);
212 if (ret
) return WERR_OK
;
214 return WERR_INVALID_PRINTER_NAME
;
217 static NTSTATUS
dcerpc_spoolss_bind(struct dcesrv_call_state
*dce_call
, const struct dcesrv_interface
*iface
)
220 struct ntptr_context
*ntptr
;
222 status
= ntptr_init_context(dce_call
->context
, dce_call
->conn
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
,
223 "simple_ldb", &ntptr
);
224 NT_STATUS_NOT_OK_RETURN(status
);
226 dce_call
->context
->private_data
= ntptr
;
231 #define DCESRV_INTERFACE_SPOOLSS_BIND dcerpc_spoolss_bind
236 static WERROR
dcesrv_spoolss_EnumPrinters(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
237 struct spoolss_EnumPrinters
*r
)
239 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
242 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, r
->in
.server
);
243 W_ERROR_NOT_OK_RETURN(status
);
245 status
= ntptr_EnumPrinters(ntptr
, mem_ctx
, r
);
246 W_ERROR_NOT_OK_RETURN(status
);
248 *r
->out
.needed
= SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPrinters
, *r
->out
.info
, r
->in
.level
, *r
->out
.count
);
249 *r
->out
.info
= SPOOLSS_BUFFER_OK(*r
->out
.info
, NULL
);
250 *r
->out
.count
= SPOOLSS_BUFFER_OK(*r
->out
.count
, 0);
251 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
254 static WERROR
dcesrv_spoolss_OpenPrinterEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
255 struct spoolss_OpenPrinterEx
*r
);
259 static WERROR
dcesrv_spoolss_OpenPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
260 struct spoolss_OpenPrinter
*r
)
263 struct spoolss_OpenPrinterEx
*r2
;
265 r2
= talloc(mem_ctx
, struct spoolss_OpenPrinterEx
);
266 W_ERROR_HAVE_NO_MEMORY(r2
);
268 r2
->in
.printername
= r
->in
.printername
;
269 r2
->in
.datatype
= r
->in
.datatype
;
270 r2
->in
.devmode_ctr
= r
->in
.devmode_ctr
;
271 r2
->in
.access_mask
= r
->in
.access_mask
;
272 r2
->in
.userlevel_ctr
.level
= 1;
273 r2
->in
.userlevel_ctr
.user_info
.level1
= NULL
;
274 r2
->out
.handle
= r
->out
.handle
;
276 /* TODO: we should take care about async replies here,
277 if spoolss_OpenPrinterEx() would be async!
279 status
= dcesrv_spoolss_OpenPrinterEx(dce_call
, mem_ctx
, r2
);
281 r
->out
.handle
= r2
->out
.handle
;
290 static WERROR
dcesrv_spoolss_SetJob(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
291 struct spoolss_SetJob
*r
)
293 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
300 static WERROR
dcesrv_spoolss_GetJob(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
301 struct spoolss_GetJob
*r
)
303 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
310 static WERROR
dcesrv_spoolss_EnumJobs(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
311 struct spoolss_EnumJobs
*r
)
320 static WERROR
dcesrv_spoolss_AddPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
321 struct spoolss_AddPrinter
*r
)
323 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
328 spoolss_DeletePrinter
330 static WERROR
dcesrv_spoolss_DeletePrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
331 struct spoolss_DeletePrinter
*r
)
333 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
340 static WERROR
dcesrv_spoolss_SetPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
341 struct spoolss_SetPrinter
*r
)
343 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
350 static WERROR
dcesrv_spoolss_GetPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
351 struct spoolss_GetPrinter
*r
)
353 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
358 spoolss_AddPrinterDriver
360 static WERROR
dcesrv_spoolss_AddPrinterDriver(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
361 struct spoolss_AddPrinterDriver
*r
)
363 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
368 spoolss_EnumPrinterDrivers
370 static WERROR
dcesrv_spoolss_EnumPrinterDrivers(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
371 struct spoolss_EnumPrinterDrivers
*r
)
373 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
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
, *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
);
408 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, r
->in
.server
);
409 W_ERROR_NOT_OK_RETURN(status
);
411 status
= ntptr_GetPrinterDriverDirectory(ntptr
, mem_ctx
, r
);
412 W_ERROR_NOT_OK_RETURN(status
);
414 *r
->out
.needed
= SPOOLSS_BUFFER_UNION(spoolss_DriverDirectoryInfo
, r
->out
.info
, r
->in
.level
);
415 r
->out
.info
= SPOOLSS_BUFFER_OK(r
->out
.info
, NULL
);
416 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
421 spoolss_DeletePrinterDriver
423 static WERROR
dcesrv_spoolss_DeletePrinterDriver(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
424 struct spoolss_DeletePrinterDriver
*r
)
426 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
431 spoolss_AddPrintProcessor
433 static WERROR
dcesrv_spoolss_AddPrintProcessor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
434 struct spoolss_AddPrintProcessor
*r
)
436 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
441 spoolss_EnumPrintProcessors
443 static WERROR
dcesrv_spoolss_EnumPrintProcessors(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
444 struct spoolss_EnumPrintProcessors
*r
)
451 spoolss_GetPrintProcessorDirectory
453 static WERROR
dcesrv_spoolss_GetPrintProcessorDirectory(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
454 struct spoolss_GetPrintProcessorDirectory
*r
)
456 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
459 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, r
->in
.server
);
460 W_ERROR_NOT_OK_RETURN(status
);
462 status
= ntptr_GetPrintProcessorDirectory(ntptr
, mem_ctx
, r
);
463 W_ERROR_NOT_OK_RETURN(status
);
465 *r
->out
.needed
= SPOOLSS_BUFFER_UNION(spoolss_PrintProcessorDirectoryInfo
, r
->out
.info
, r
->in
.level
);
466 r
->out
.info
= SPOOLSS_BUFFER_OK(r
->out
.info
, NULL
);
467 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
472 spoolss_StartDocPrinter
474 static WERROR
dcesrv_spoolss_StartDocPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
475 struct spoolss_StartDocPrinter
*r
)
477 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
482 spoolss_StartPagePrinter
484 static WERROR
dcesrv_spoolss_StartPagePrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
485 struct spoolss_StartPagePrinter
*r
)
487 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
494 static WERROR
dcesrv_spoolss_WritePrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
495 struct spoolss_WritePrinter
*r
)
497 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
502 spoolss_EndPagePrinter
504 static WERROR
dcesrv_spoolss_EndPagePrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
505 struct spoolss_EndPagePrinter
*r
)
507 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
514 static WERROR
dcesrv_spoolss_AbortPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
515 struct spoolss_AbortPrinter
*r
)
517 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
524 static WERROR
dcesrv_spoolss_ReadPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
525 struct spoolss_ReadPrinter
*r
)
527 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
532 spoolss_EndDocPrinter
534 static WERROR
dcesrv_spoolss_EndDocPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
535 struct spoolss_EndDocPrinter
*r
)
537 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
544 static WERROR
dcesrv_spoolss_AddJob(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
545 struct spoolss_AddJob
*r
)
547 if (r
->in
.level
!= 1) {
548 return WERR_UNKNOWN_LEVEL
;
551 return WERR_INVALID_PARAM
;
558 static WERROR
dcesrv_spoolss_ScheduleJob(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
559 struct spoolss_ScheduleJob
*r
)
561 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
566 spoolss_GetPrinterData
568 static WERROR
dcesrv_spoolss_GetPrinterData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
569 struct spoolss_GetPrinterData
*r
)
571 struct ntptr_GenericHandle
*handle
;
572 struct dcesrv_handle
*h
;
575 r
->out
.type
= talloc_zero(mem_ctx
, enum winreg_Type
);
576 W_ERROR_HAVE_NO_MEMORY(r
->out
.type
);
578 r
->out
.needed
= talloc_zero(mem_ctx
, uint32_t);
579 W_ERROR_HAVE_NO_MEMORY(r
->out
.needed
);
581 r
->out
.data
= talloc_zero_array(mem_ctx
, uint8_t, r
->in
.offered
);
582 W_ERROR_HAVE_NO_MEMORY(r
->out
.data
);
584 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
585 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
589 switch (handle
->type
) {
590 case NTPTR_HANDLE_SERVER
:
591 status
= ntptr_GetPrintServerData(handle
, mem_ctx
, r
);
594 status
= WERR_FOOBAR
;
598 W_ERROR_NOT_OK_RETURN(status
);
600 *r
->out
.type
= SPOOLSS_BUFFER_OK(*r
->out
.type
, REG_NONE
);
601 r
->out
.data
= SPOOLSS_BUFFER_OK(r
->out
.data
, r
->out
.data
);
602 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_MORE_DATA
);
607 spoolss_SetPrinterData
609 static WERROR
dcesrv_spoolss_SetPrinterData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
610 struct spoolss_SetPrinterData
*r
)
612 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
617 spoolss_WaitForPrinterChange
619 static WERROR
dcesrv_spoolss_WaitForPrinterChange(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
620 struct spoolss_WaitForPrinterChange
*r
)
622 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
629 static WERROR
dcesrv_spoolss_ClosePrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
630 struct spoolss_ClosePrinter
*r
)
632 struct dcesrv_handle
*h
;
634 *r
->out
.handle
= *r
->in
.handle
;
636 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
640 ZERO_STRUCTP(r
->out
.handle
);
649 static WERROR
dcesrv_spoolss_AddForm(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
650 struct spoolss_AddForm
*r
)
652 struct ntptr_GenericHandle
*handle
;
653 struct dcesrv_handle
*h
;
656 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
657 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
661 switch (handle
->type
) {
662 case NTPTR_HANDLE_SERVER
:
663 status
= ntptr_AddPrintServerForm(handle
, mem_ctx
, r
);
664 W_ERROR_NOT_OK_RETURN(status
);
666 case NTPTR_HANDLE_PRINTER
:
667 status
= ntptr_AddPrinterForm(handle
, mem_ctx
, r
);
668 W_ERROR_NOT_OK_RETURN(status
);
681 static WERROR
dcesrv_spoolss_DeleteForm(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
682 struct spoolss_DeleteForm
*r
)
684 struct ntptr_GenericHandle
*handle
;
685 struct dcesrv_handle
*h
;
688 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
689 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
693 switch (handle
->type
) {
694 case NTPTR_HANDLE_SERVER
:
695 status
= ntptr_DeletePrintServerForm(handle
, mem_ctx
, r
);
696 W_ERROR_NOT_OK_RETURN(status
);
698 case NTPTR_HANDLE_PRINTER
:
699 status
= ntptr_DeletePrinterForm(handle
, mem_ctx
, r
);
700 W_ERROR_NOT_OK_RETURN(status
);
713 static WERROR
dcesrv_spoolss_GetForm(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
714 struct spoolss_GetForm
*r
)
716 struct ntptr_GenericHandle
*handle
;
717 struct dcesrv_handle
*h
;
720 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
721 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
725 switch (handle
->type
) {
726 case NTPTR_HANDLE_SERVER
:
728 * stupid, but w2k3 returns WERR_BADFID here?
731 case NTPTR_HANDLE_PRINTER
:
732 status
= ntptr_GetPrinterForm(handle
, mem_ctx
, r
);
733 W_ERROR_NOT_OK_RETURN(status
);
739 *r
->out
.needed
= SPOOLSS_BUFFER_UNION(spoolss_FormInfo
, r
->out
.info
, r
->in
.level
);
740 r
->out
.info
= SPOOLSS_BUFFER_OK(r
->out
.info
, NULL
);
741 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
748 static WERROR
dcesrv_spoolss_SetForm(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
749 struct spoolss_SetForm
*r
)
751 struct ntptr_GenericHandle
*handle
;
752 struct dcesrv_handle
*h
;
755 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
756 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
760 switch (handle
->type
) {
761 case NTPTR_HANDLE_SERVER
:
762 status
= ntptr_SetPrintServerForm(handle
, mem_ctx
, r
);
763 W_ERROR_NOT_OK_RETURN(status
);
765 case NTPTR_HANDLE_PRINTER
:
766 status
= ntptr_SetPrinterForm(handle
, mem_ctx
, r
);
767 W_ERROR_NOT_OK_RETURN(status
);
780 static WERROR
dcesrv_spoolss_EnumForms(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
781 struct spoolss_EnumForms
*r
)
783 struct ntptr_GenericHandle
*handle
;
784 struct dcesrv_handle
*h
;
787 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
788 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
792 switch (handle
->type
) {
793 case NTPTR_HANDLE_SERVER
:
794 status
= ntptr_EnumPrintServerForms(handle
, mem_ctx
, r
);
795 W_ERROR_NOT_OK_RETURN(status
);
797 case NTPTR_HANDLE_PRINTER
:
798 status
= ntptr_EnumPrinterForms(handle
, mem_ctx
, r
);
799 W_ERROR_NOT_OK_RETURN(status
);
805 *r
->out
.needed
= SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumForms
, *r
->out
.info
, r
->in
.level
, *r
->out
.count
);
806 *r
->out
.info
= SPOOLSS_BUFFER_OK(*r
->out
.info
, NULL
);
807 *r
->out
.count
= SPOOLSS_BUFFER_OK(*r
->out
.count
, 0);
808 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
815 static WERROR
dcesrv_spoolss_EnumPorts(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
816 struct spoolss_EnumPorts
*r
)
818 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
821 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, r
->in
.servername
);
822 W_ERROR_NOT_OK_RETURN(status
);
824 status
= ntptr_EnumPorts(ntptr
, mem_ctx
, r
);
825 W_ERROR_NOT_OK_RETURN(status
);
827 *r
->out
.needed
= SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPorts
, *r
->out
.info
, r
->in
.level
, *r
->out
.count
);
828 *r
->out
.info
= SPOOLSS_BUFFER_OK(*r
->out
.info
, NULL
);
829 *r
->out
.count
= SPOOLSS_BUFFER_OK(*r
->out
.count
, 0);
830 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
837 static WERROR
dcesrv_spoolss_EnumMonitors(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
838 struct spoolss_EnumMonitors
*r
)
840 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
843 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, r
->in
.servername
);
844 W_ERROR_NOT_OK_RETURN(status
);
846 status
= ntptr_EnumMonitors(ntptr
, mem_ctx
, r
);
847 W_ERROR_NOT_OK_RETURN(status
);
849 *r
->out
.needed
= SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumMonitors
, *r
->out
.info
, r
->in
.level
, *r
->out
.count
);
850 *r
->out
.info
= SPOOLSS_BUFFER_OK(*r
->out
.info
, NULL
);
851 *r
->out
.count
= SPOOLSS_BUFFER_OK(*r
->out
.count
, 0);
852 return SPOOLSS_BUFFER_OK(WERR_OK
, WERR_INSUFFICIENT_BUFFER
);
859 static WERROR
dcesrv_spoolss_AddPort(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
860 struct spoolss_AddPort
*r
)
862 return WERR_NOT_SUPPORTED
;
867 spoolss_ConfigurePort
869 static WERROR
dcesrv_spoolss_ConfigurePort(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
870 struct spoolss_ConfigurePort
*r
)
872 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
879 static WERROR
dcesrv_spoolss_DeletePort(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
880 struct spoolss_DeletePort
*r
)
882 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
887 spoolss_CreatePrinterIC
889 static WERROR
dcesrv_spoolss_CreatePrinterIC(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
890 struct spoolss_CreatePrinterIC
*r
)
892 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
897 spoolss_PlayGDIScriptOnPrinterIC
899 static WERROR
dcesrv_spoolss_PlayGDIScriptOnPrinterIC(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
900 struct spoolss_PlayGDIScriptOnPrinterIC
*r
)
902 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
907 spoolss_DeletePrinterIC
909 static WERROR
dcesrv_spoolss_DeletePrinterIC(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
910 struct spoolss_DeletePrinterIC
*r
)
912 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
917 spoolss_AddPrinterConnection
919 static WERROR
dcesrv_spoolss_AddPrinterConnection(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
920 struct spoolss_AddPrinterConnection
*r
)
922 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
927 spoolss_DeletePrinterConnection
929 static WERROR
dcesrv_spoolss_DeletePrinterConnection(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
930 struct spoolss_DeletePrinterConnection
*r
)
932 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
937 spoolss_PrinterMessageBox
939 static WERROR
dcesrv_spoolss_PrinterMessageBox(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
940 struct spoolss_PrinterMessageBox
*r
)
942 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
949 static WERROR
dcesrv_spoolss_AddMonitor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
950 struct spoolss_AddMonitor
*r
)
952 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
957 spoolss_DeleteMonitor
959 static WERROR
dcesrv_spoolss_DeleteMonitor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
960 struct spoolss_DeleteMonitor
*r
)
962 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
967 spoolss_DeletePrintProcessor
969 static WERROR
dcesrv_spoolss_DeletePrintProcessor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
970 struct spoolss_DeletePrintProcessor
*r
)
972 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
977 spoolss_AddPrintProvidor
979 static WERROR
dcesrv_spoolss_AddPrintProvidor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
980 struct spoolss_AddPrintProvidor
*r
)
982 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
987 spoolss_DeletePrintProvidor
989 static WERROR
dcesrv_spoolss_DeletePrintProvidor(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
990 struct spoolss_DeletePrintProvidor
*r
)
992 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
997 spoolss_EnumPrintProcDataTypes
999 static WERROR
dcesrv_spoolss_EnumPrintProcDataTypes(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1000 struct spoolss_EnumPrintProcDataTypes
*r
)
1007 spoolss_ResetPrinter
1009 static WERROR
dcesrv_spoolss_ResetPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1010 struct spoolss_ResetPrinter
*r
)
1012 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1017 spoolss_GetPrinterDriver2
1019 static WERROR
dcesrv_spoolss_GetPrinterDriver2(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1020 struct spoolss_GetPrinterDriver2
*r
)
1022 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1027 spoolss_FindFirstPrinterChangeNotification
1029 static WERROR
dcesrv_spoolss_FindFirstPrinterChangeNotification(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1030 struct spoolss_FindFirstPrinterChangeNotification
*r
)
1032 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1037 spoolss_FindNextPrinterChangeNotification
1039 static WERROR
dcesrv_spoolss_FindNextPrinterChangeNotification(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1040 struct spoolss_FindNextPrinterChangeNotification
*r
)
1042 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1047 spoolss_FindClosePrinterNotify
1049 static WERROR
dcesrv_spoolss_FindClosePrinterNotify(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1050 struct spoolss_FindClosePrinterNotify
*r
)
1052 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1057 spoolss_RouterFindFirstPrinterChangeNotificationOld
1059 static WERROR
dcesrv_spoolss_RouterFindFirstPrinterChangeNotificationOld(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1060 struct spoolss_RouterFindFirstPrinterChangeNotificationOld
*r
)
1062 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1067 spoolss_ReplyOpenPrinter
1069 static WERROR
dcesrv_spoolss_ReplyOpenPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1070 struct spoolss_ReplyOpenPrinter
*r
)
1072 struct dcesrv_handle
*handle
;
1074 handle
= dcesrv_handle_new(dce_call
->context
, SPOOLSS_NOTIFY
);
1075 W_ERROR_HAVE_NO_MEMORY(handle
);
1077 /* For now, just return a handle */
1079 *r
->out
.handle
= handle
->wire_handle
;
1086 spoolss_RouterReplyPrinter
1088 static WERROR
dcesrv_spoolss_RouterReplyPrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1089 struct spoolss_RouterReplyPrinter
*r
)
1091 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1096 spoolss_ReplyClosePrinter
1098 static WERROR
dcesrv_spoolss_ReplyClosePrinter(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1099 struct spoolss_ReplyClosePrinter
*r
)
1101 struct dcesrv_handle
*handle
;
1103 DCESRV_PULL_HANDLE_WERR(handle
, r
->in
.handle
, SPOOLSS_NOTIFY
);
1105 talloc_free(handle
);
1107 ZERO_STRUCTP(r
->out
.handle
);
1115 static WERROR
dcesrv_spoolss_AddPortEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1116 struct spoolss_AddPortEx
*r
)
1118 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1123 spoolss_RouterFindFirstPrinterChangeNotification
1125 static WERROR
dcesrv_spoolss_RouterFindFirstPrinterChangeNotification(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1126 struct spoolss_RouterFindFirstPrinterChangeNotification
*r
)
1128 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1135 static WERROR
dcesrv_spoolss_SpoolerInit(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1136 struct spoolss_SpoolerInit
*r
)
1138 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1143 spoolss_ResetPrinterEx
1145 static WERROR
dcesrv_spoolss_ResetPrinterEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1146 struct spoolss_ResetPrinterEx
*r
)
1148 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1153 spoolss_RemoteFindFirstPrinterChangeNotifyEx
1155 static WERROR
dcesrv_spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1156 struct spoolss_RemoteFindFirstPrinterChangeNotifyEx
*r
)
1158 struct dcerpc_pipe
*p
;
1159 struct dcerpc_binding
*binding
;
1161 struct spoolss_ReplyOpenPrinter rop
;
1162 struct cli_credentials
*creds
;
1163 struct policy_handle notify_handle
;
1165 DEBUG(2, ("Received RFFPCNex from %s\n", r
->in
.local_machine
));
1168 * TODO: for now just open a connection to the client and drop it again
1169 * to keep the w2k3 PrintServer
1170 * happy to allow to open the Add Printer GUI
1171 * and the torture suite passing
1174 binding
= talloc_zero(mem_ctx
, struct dcerpc_binding
);
1176 binding
->transport
= NCACN_NP
;
1177 if (strncmp(r
->in
.local_machine
, "\\\\", 2))
1178 return WERR_INVALID_COMPUTERNAME
;
1179 binding
->host
= r
->in
.local_machine
+2;
1181 creds
= cli_credentials_init_anon(mem_ctx
); /* FIXME: Use machine credentials instead ? */
1183 status
= dcerpc_pipe_connect_b(mem_ctx
, &p
, binding
, &ndr_table_spoolss
,
1184 creds
, dce_call
->event_ctx
,
1185 dce_call
->conn
->dce_ctx
->lp_ctx
);
1187 if (NT_STATUS_IS_ERR(status
)) {
1188 DEBUG(0, ("unable to call back to %s\n", r
->in
.local_machine
));
1189 return WERR_SERVER_UNAVAILABLE
;
1193 rop
.in
.server_name
= lpcfg_netbios_name(dce_call
->conn
->dce_ctx
->lp_ctx
);
1194 W_ERROR_HAVE_NO_MEMORY(rop
.in
.server_name
);
1195 rop
.in
.printer_local
= 0;
1196 rop
.in
.type
= REG_NONE
;
1198 rop
.in
.buffer
= NULL
;
1199 rop
.out
.handle
= ¬ify_handle
;
1201 status
= dcerpc_spoolss_ReplyOpenPrinter_r(p
->binding_handle
, mem_ctx
, &rop
);
1202 if (NT_STATUS_IS_ERR(status
)) {
1203 DEBUG(0, ("unable to open remote printer %s\n",
1204 r
->in
.local_machine
));
1205 return WERR_SERVER_UNAVAILABLE
;
1215 spoolss_RouterReplyPrinterEx
1217 static WERROR
dcesrv_spoolss_RouterReplyPrinterEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1218 struct spoolss_RouterReplyPrinterEx
*r
)
1220 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1225 spoolss_RouterRefreshPrinterChangeNotify
1227 static WERROR
dcesrv_spoolss_RouterRefreshPrinterChangeNotify(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1228 struct spoolss_RouterRefreshPrinterChangeNotify
*r
)
1230 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1237 static WERROR
dcesrv_spoolss_44(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1238 struct spoolss_44
*r
)
1240 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1244 spoolss_OpenPrinterEx
1246 static WERROR
dcesrv_spoolss_OpenPrinterEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1247 struct spoolss_OpenPrinterEx
*r
)
1249 struct ntptr_context
*ntptr
= talloc_get_type(dce_call
->context
->private_data
, struct ntptr_context
);
1250 struct ntptr_GenericHandle
*handle
;
1251 struct dcesrv_handle
*h
;
1254 enum ntptr_HandleType type
;
1257 ZERO_STRUCTP(r
->out
.handle
);
1259 status
= dcesrv_spoolss_parse_printer_name(mem_ctx
, r
->in
.printername
, &server
, &object
, &type
);
1260 W_ERROR_NOT_OK_RETURN(status
);
1262 status
= dcesrv_spoolss_check_server_name(dce_call
, mem_ctx
, server
);
1263 W_ERROR_NOT_OK_RETURN(status
);
1266 case NTPTR_HANDLE_SERVER
:
1267 status
= ntptr_OpenPrintServer(ntptr
, mem_ctx
, r
, server
, &handle
);
1268 W_ERROR_NOT_OK_RETURN(status
);
1270 case NTPTR_HANDLE_PORT
:
1271 status
= ntptr_OpenPort(ntptr
, mem_ctx
, r
, object
, &handle
);
1272 W_ERROR_NOT_OK_RETURN(status
);
1274 case NTPTR_HANDLE_MONITOR
:
1275 status
= ntptr_OpenMonitor(ntptr
, mem_ctx
, r
, object
, &handle
);
1276 W_ERROR_NOT_OK_RETURN(status
);
1278 case NTPTR_HANDLE_PRINTER
:
1279 status
= ntptr_OpenPrinter(ntptr
, mem_ctx
, r
, object
, &handle
);
1280 W_ERROR_NOT_OK_RETURN(status
);
1286 h
= dcesrv_handle_new(dce_call
->context
, handle
->type
);
1287 W_ERROR_HAVE_NO_MEMORY(h
);
1289 h
->data
= talloc_steal(h
, handle
);
1291 *r
->out
.handle
= h
->wire_handle
;
1297 spoolss_AddPrinterEx
1299 static WERROR
dcesrv_spoolss_AddPrinterEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1300 struct spoolss_AddPrinterEx
*r
)
1302 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1309 static WERROR
dcesrv_spoolss_SetPort(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1310 struct spoolss_SetPort
*r
)
1312 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1317 spoolss_EnumPrinterData
1319 static WERROR
dcesrv_spoolss_EnumPrinterData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1320 struct spoolss_EnumPrinterData
*r
)
1322 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1327 spoolss_DeletePrinterData
1329 static WERROR
dcesrv_spoolss_DeletePrinterData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1330 struct spoolss_DeletePrinterData
*r
)
1332 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1339 static WERROR
dcesrv_spoolss_4a(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1340 struct spoolss_4a
*r
)
1342 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1349 static WERROR
dcesrv_spoolss_4b(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1350 struct spoolss_4b
*r
)
1352 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1359 static WERROR
dcesrv_spoolss_4c(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1360 struct spoolss_4c
*r
)
1362 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1367 spoolss_SetPrinterDataEx
1369 static WERROR
dcesrv_spoolss_SetPrinterDataEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1370 struct spoolss_SetPrinterDataEx
*r
)
1372 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1377 spoolss_GetPrinterDataEx
1379 static WERROR
dcesrv_spoolss_GetPrinterDataEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1380 struct spoolss_GetPrinterDataEx
*r
)
1382 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1387 spoolss_EnumPrinterDataEx
1389 static WERROR
dcesrv_spoolss_EnumPrinterDataEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1390 struct spoolss_EnumPrinterDataEx
*r
)
1392 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1397 spoolss_EnumPrinterKey
1399 static WERROR
dcesrv_spoolss_EnumPrinterKey(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1400 struct spoolss_EnumPrinterKey
*r
)
1402 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1407 spoolss_DeletePrinterDataEx
1409 static WERROR
dcesrv_spoolss_DeletePrinterDataEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1410 struct spoolss_DeletePrinterDataEx
*r
)
1412 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1417 spoolss_DeletePrinterKey
1419 static WERROR
dcesrv_spoolss_DeletePrinterKey(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1420 struct spoolss_DeletePrinterKey
*r
)
1422 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1429 static WERROR
dcesrv_spoolss_53(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1430 struct spoolss_53
*r
)
1432 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1437 spoolss_DeletePrinterDriverEx
1439 static WERROR
dcesrv_spoolss_DeletePrinterDriverEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1440 struct spoolss_DeletePrinterDriverEx
*r
)
1442 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1447 spoolss_AddPerMachineConnection
1449 static WERROR
dcesrv_spoolss_AddPerMachineConnection(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1450 struct spoolss_AddPerMachineConnection
*r
)
1452 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1457 spoolss_DeletePerMachineConnection
1459 static WERROR
dcesrv_spoolss_DeletePerMachineConnection(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1460 struct spoolss_DeletePerMachineConnection
*r
)
1462 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1467 spoolss_EnumPerMachineConnections
1469 static WERROR
dcesrv_spoolss_EnumPerMachineConnections(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1470 struct spoolss_EnumPerMachineConnections
*r
)
1472 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1479 static WERROR
dcesrv_spoolss_XcvData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1480 struct spoolss_XcvData
*r
)
1482 struct ntptr_GenericHandle
*handle
;
1483 struct dcesrv_handle
*h
;
1486 DCESRV_PULL_HANDLE_WERR(h
, r
->in
.handle
, DCESRV_HANDLE_ANY
);
1487 handle
= talloc_get_type(h
->data
, struct ntptr_GenericHandle
);
1489 switch (handle
->type
) {
1490 case NTPTR_HANDLE_SERVER
:
1491 status
= ntptr_XcvDataPrintServer(handle
, mem_ctx
, r
);
1492 W_ERROR_NOT_OK_RETURN(status
);
1494 case NTPTR_HANDLE_PRINTER
:
1495 status
= ntptr_XcvDataPrinter(handle
, mem_ctx
, r
);
1496 W_ERROR_NOT_OK_RETURN(status
);
1498 case NTPTR_HANDLE_PORT
:
1499 status
= ntptr_XcvDataPort(handle
, mem_ctx
, r
);
1500 W_ERROR_NOT_OK_RETURN(status
);
1502 case NTPTR_HANDLE_MONITOR
:
1503 status
= ntptr_XcvDataMonitor(handle
, mem_ctx
, r
);
1504 W_ERROR_NOT_OK_RETURN(status
);
1510 /* TODO: handle the buffer sizes here! */
1516 spoolss_AddPrinterDriverEx
1518 static WERROR
dcesrv_spoolss_AddPrinterDriverEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1519 struct spoolss_AddPrinterDriverEx
*r
)
1521 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1528 static WERROR
dcesrv_spoolss_5a(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1529 struct spoolss_5a
*r
)
1531 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1538 static WERROR
dcesrv_spoolss_5b(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1539 struct spoolss_5b
*r
)
1541 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1548 static WERROR
dcesrv_spoolss_5c(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1549 struct spoolss_5c
*r
)
1551 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1558 static WERROR
dcesrv_spoolss_5d(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1559 struct spoolss_5d
*r
)
1561 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1568 static WERROR
dcesrv_spoolss_5e(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1569 struct spoolss_5e
*r
)
1571 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1578 static WERROR
dcesrv_spoolss_5f(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1579 struct spoolss_5f
*r
)
1581 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1587 static WERROR
dcesrv_spoolss_60(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1588 struct spoolss_60
*r
)
1590 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1595 spoolss_RpcSendRecvBidiData
1597 static WERROR
dcesrv_spoolss_RpcSendRecvBidiData(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1598 struct spoolss_RpcSendRecvBidiData
*r
)
1600 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1607 static WERROR
dcesrv_spoolss_62(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1608 struct spoolss_62
*r
)
1610 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1617 static WERROR
dcesrv_spoolss_63(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1618 struct spoolss_63
*r
)
1620 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1627 static WERROR
dcesrv_spoolss_64(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1628 struct spoolss_64
*r
)
1630 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1637 static WERROR
dcesrv_spoolss_65(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1638 struct spoolss_65
*r
)
1640 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1645 spoolss_GetCorePrinterDrivers
1647 static WERROR
dcesrv_spoolss_GetCorePrinterDrivers(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1648 struct spoolss_GetCorePrinterDrivers
*r
)
1650 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1657 static WERROR
dcesrv_spoolss_67(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1658 struct spoolss_67
*r
)
1660 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1665 spoolss_GetPrinterDriverPackagePath
1667 static WERROR
dcesrv_spoolss_GetPrinterDriverPackagePath(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1668 struct spoolss_GetPrinterDriverPackagePath
*r
)
1670 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1677 static WERROR
dcesrv_spoolss_69(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1678 struct spoolss_69
*r
)
1680 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1687 static WERROR
dcesrv_spoolss_6a(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1688 struct spoolss_6a
*r
)
1690 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1697 static WERROR
dcesrv_spoolss_6b(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1698 struct spoolss_6b
*r
)
1700 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1707 static WERROR
dcesrv_spoolss_6c(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1708 struct spoolss_6c
*r
)
1710 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1717 static WERROR
dcesrv_spoolss_6d(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1718 struct spoolss_6d
*r
)
1720 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1725 spoolss_RpcGetJobNamedPropertyValue
1727 static WERROR
dcesrv_spoolss_RpcGetJobNamedPropertyValue(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1728 struct spoolss_RpcGetJobNamedPropertyValue
*r
)
1730 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1735 spoolss_RpcSetJobNamedProperty
1737 static WERROR
dcesrv_spoolss_RpcSetJobNamedProperty(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1738 struct spoolss_RpcSetJobNamedProperty
*r
)
1740 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1745 spoolss_RpcDeleteJobNamedProperty
1747 static WERROR
dcesrv_spoolss_RpcDeleteJobNamedProperty(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1748 struct spoolss_RpcDeleteJobNamedProperty
*r
)
1750 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1754 spoolss_RpcEnumJobNamedProperties
1756 static WERROR
dcesrv_spoolss_RpcEnumJobNamedProperties(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1757 struct spoolss_RpcEnumJobNamedProperties
*r
)
1759 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1762 /* include the generated boilerplate */
1763 #include "librpc/gen_ndr/ndr_spoolss_s.c"