2 Unix SMB/CIFS implementation.
4 endpoint server for the srvsvc pipe
6 Copyright (C) Stefan (metze) Metzmacher 2004-2006
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "ntvfs/ntvfs.h"
24 #include "rpc_server/dcerpc_server.h"
25 #include "librpc/gen_ndr/ndr_srvsvc.h"
26 #include "rpc_server/common/common.h"
27 #include "auth/auth.h"
28 #include "libcli/security/security.h"
29 #include "system/time.h"
30 #include "rpc_server/srvsvc/proto.h"
31 #include "param/param.h"
33 #define SRVSVC_CHECK_ADMIN_ACCESS do { \
34 struct security_token *t = dce_call->conn->auth_state.session_info->security_token; \
35 if (!security_token_has_builtin_administrators(t) && \
36 !security_token_has_sid_string(t, SID_BUILTIN_SERVER_OPERATORS)) { \
37 return WERR_ACCESS_DENIED; \
44 static WERROR
dcesrv_srvsvc_NetCharDevEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
45 struct srvsvc_NetCharDevEnum
*r
)
47 *r
->out
.totalentries
= 0;
49 switch (r
->in
.info_ctr
->level
) {
51 r
->out
.info_ctr
->ctr
.ctr0
= talloc(mem_ctx
, struct srvsvc_NetCharDevCtr0
);
52 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr0
);
54 r
->out
.info_ctr
->ctr
.ctr0
->count
= 0;
55 r
->out
.info_ctr
->ctr
.ctr0
->array
= NULL
;
57 return WERR_NOT_SUPPORTED
;
60 r
->out
.info_ctr
->ctr
.ctr1
= talloc(mem_ctx
, struct srvsvc_NetCharDevCtr1
);
61 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr1
);
63 r
->out
.info_ctr
->ctr
.ctr1
->count
= 0;
64 r
->out
.info_ctr
->ctr
.ctr1
->array
= NULL
;
66 return WERR_NOT_SUPPORTED
;
69 return WERR_UNKNOWN_LEVEL
;
77 srvsvc_NetCharDevGetInfo
79 static WERROR
dcesrv_srvsvc_NetCharDevGetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
80 struct srvsvc_NetCharDevGetInfo
*r
)
82 ZERO_STRUCTP(r
->out
.info
);
84 switch (r
->in
.level
) {
87 return WERR_NOT_SUPPORTED
;
91 return WERR_NOT_SUPPORTED
;
94 return WERR_UNKNOWN_LEVEL
;
97 return WERR_UNKNOWN_LEVEL
;
102 srvsvc_NetCharDevControl
104 static WERROR
dcesrv_srvsvc_NetCharDevControl(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
105 struct srvsvc_NetCharDevControl
*r
)
107 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
112 srvsvc_NetCharDevQEnum
114 static WERROR
dcesrv_srvsvc_NetCharDevQEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
115 struct srvsvc_NetCharDevQEnum
*r
)
117 *r
->out
.totalentries
= 0;
119 switch (r
->in
.info_ctr
->level
) {
122 r
->out
.info_ctr
->ctr
.ctr0
= talloc(mem_ctx
, struct srvsvc_NetCharDevQCtr0
);
123 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr0
);
125 r
->out
.info_ctr
->ctr
.ctr0
->count
= 0;
126 r
->out
.info_ctr
->ctr
.ctr0
->array
= NULL
;
128 return WERR_NOT_SUPPORTED
;
132 r
->out
.info_ctr
->ctr
.ctr1
= talloc(mem_ctx
, struct srvsvc_NetCharDevQCtr1
);
133 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr1
);
135 r
->out
.info_ctr
->ctr
.ctr1
->count
= 0;
136 r
->out
.info_ctr
->ctr
.ctr1
->array
= NULL
;
138 return WERR_NOT_SUPPORTED
;
141 return WERR_UNKNOWN_LEVEL
;
144 return WERR_UNKNOWN_LEVEL
;
149 srvsvc_NetCharDevQGetInfo
151 static WERROR
dcesrv_srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
152 struct srvsvc_NetCharDevQGetInfo
*r
)
154 ZERO_STRUCTP(r
->out
.info
);
156 switch (r
->in
.level
) {
159 return WERR_NOT_SUPPORTED
;
163 return WERR_NOT_SUPPORTED
;
166 return WERR_UNKNOWN_LEVEL
;
169 return WERR_UNKNOWN_LEVEL
;
174 srvsvc_NetCharDevQSetInfo
176 static WERROR
dcesrv_srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
177 struct srvsvc_NetCharDevQSetInfo
*r
)
179 switch (r
->in
.level
) {
182 if (r
->in
.parm_error
) {
183 r
->out
.parm_error
= r
->in
.parm_error
;
185 return WERR_NOT_SUPPORTED
;
189 if (r
->in
.parm_error
) {
190 r
->out
.parm_error
= r
->in
.parm_error
;
192 return WERR_NOT_SUPPORTED
;
195 return WERR_UNKNOWN_LEVEL
;
198 return WERR_UNKNOWN_LEVEL
;
203 srvsvc_NetCharDevQPurge
205 static WERROR
dcesrv_srvsvc_NetCharDevQPurge(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
206 struct srvsvc_NetCharDevQPurge
*r
)
208 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
213 srvsvc_NetCharDevQPurgeSelf
215 static WERROR
dcesrv_srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
216 struct srvsvc_NetCharDevQPurgeSelf
*r
)
218 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
225 static WERROR
dcesrv_srvsvc_NetConnEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
226 struct srvsvc_NetConnEnum
*r
)
228 *r
->out
.totalentries
= 0;
230 switch (r
->in
.info_ctr
->level
) {
233 r
->out
.info_ctr
->ctr
.ctr0
= talloc(mem_ctx
, struct srvsvc_NetConnCtr0
);
234 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr0
);
236 r
->out
.info_ctr
->ctr
.ctr0
->count
= 0;
237 r
->out
.info_ctr
->ctr
.ctr0
->array
= NULL
;
239 return WERR_NOT_SUPPORTED
;
243 r
->out
.info_ctr
->ctr
.ctr1
= talloc(mem_ctx
, struct srvsvc_NetConnCtr1
);
244 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr1
);
246 r
->out
.info_ctr
->ctr
.ctr1
->count
= 0;
247 r
->out
.info_ctr
->ctr
.ctr1
->array
= NULL
;
249 return WERR_NOT_SUPPORTED
;
252 return WERR_UNKNOWN_LEVEL
;
255 return WERR_UNKNOWN_LEVEL
;
262 static WERROR
dcesrv_srvsvc_NetFileEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
263 struct srvsvc_NetFileEnum
*r
)
265 *r
->out
.totalentries
= 0;
267 switch (r
->in
.info_ctr
->level
) {
270 r
->out
.info_ctr
->ctr
.ctr2
= talloc(mem_ctx
, struct srvsvc_NetFileCtr2
);
271 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr2
);
273 r
->out
.info_ctr
->ctr
.ctr2
->count
= 0;
274 r
->out
.info_ctr
->ctr
.ctr2
->array
= NULL
;
276 return WERR_NOT_SUPPORTED
;
280 r
->out
.info_ctr
->ctr
.ctr3
= talloc(mem_ctx
, struct srvsvc_NetFileCtr3
);
281 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr3
);
283 r
->out
.info_ctr
->ctr
.ctr3
->count
= 0;
284 r
->out
.info_ctr
->ctr
.ctr3
->array
= NULL
;
286 return WERR_NOT_SUPPORTED
;
289 return WERR_UNKNOWN_LEVEL
;
292 return WERR_UNKNOWN_LEVEL
;
297 srvsvc_NetFileGetInfo
299 static WERROR
dcesrv_srvsvc_NetFileGetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
300 struct srvsvc_NetFileGetInfo
*r
)
302 ZERO_STRUCTP(r
->out
.info
);
304 switch (r
->in
.level
) {
307 return WERR_NOT_SUPPORTED
;
311 return WERR_NOT_SUPPORTED
;
314 return WERR_UNKNOWN_LEVEL
;
317 return WERR_UNKNOWN_LEVEL
;
324 static WERROR
dcesrv_srvsvc_NetFileClose(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
325 struct srvsvc_NetFileClose
*r
)
327 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
334 static WERROR
dcesrv_srvsvc_NetSessEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
335 struct srvsvc_NetSessEnum
*r
)
337 *r
->out
.totalentries
= 0;
339 switch (r
->in
.info_ctr
->level
) {
342 r
->out
.info_ctr
->ctr
.ctr0
= talloc(mem_ctx
, struct srvsvc_NetSessCtr0
);
343 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr0
);
345 r
->out
.info_ctr
->ctr
.ctr0
->count
= 0;
346 r
->out
.info_ctr
->ctr
.ctr0
->array
= NULL
;
348 return WERR_NOT_SUPPORTED
;
352 r
->out
.info_ctr
->ctr
.ctr1
= talloc(mem_ctx
, struct srvsvc_NetSessCtr1
);
353 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr1
);
355 r
->out
.info_ctr
->ctr
.ctr1
->count
= 0;
356 r
->out
.info_ctr
->ctr
.ctr1
->array
= NULL
;
358 return WERR_NOT_SUPPORTED
;
362 r
->out
.info_ctr
->ctr
.ctr2
= talloc(mem_ctx
, struct srvsvc_NetSessCtr2
);
363 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr2
);
365 r
->out
.info_ctr
->ctr
.ctr2
->count
= 0;
366 r
->out
.info_ctr
->ctr
.ctr2
->array
= NULL
;
368 return WERR_NOT_SUPPORTED
;
372 r
->out
.info_ctr
->ctr
.ctr10
= talloc(mem_ctx
, struct srvsvc_NetSessCtr10
);
373 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr10
);
375 r
->out
.info_ctr
->ctr
.ctr10
->count
= 0;
376 r
->out
.info_ctr
->ctr
.ctr10
->array
= NULL
;
378 return WERR_NOT_SUPPORTED
;
382 r
->out
.info_ctr
->ctr
.ctr502
= talloc(mem_ctx
, struct srvsvc_NetSessCtr502
);
383 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr502
);
385 r
->out
.info_ctr
->ctr
.ctr502
->count
= 0;
386 r
->out
.info_ctr
->ctr
.ctr502
->array
= NULL
;
388 return WERR_NOT_SUPPORTED
;
391 return WERR_UNKNOWN_LEVEL
;
394 return WERR_UNKNOWN_LEVEL
;
401 static WERROR
dcesrv_srvsvc_NetSessDel(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
402 struct srvsvc_NetSessDel
*r
)
404 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
411 static WERROR
dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
412 struct srvsvc_NetShareAdd
*r
)
414 switch (r
->in
.level
) {
417 if (r
->in
.parm_error
) {
418 r
->out
.parm_error
= r
->in
.parm_error
;
420 return WERR_NOT_SUPPORTED
;
424 if (r
->in
.parm_error
) {
425 r
->out
.parm_error
= r
->in
.parm_error
;
427 return WERR_NOT_SUPPORTED
;
432 struct share_info
*info
;
433 struct share_context
*sctx
;
434 unsigned int count
= 8;
437 nterr
= share_get_context_by_name(mem_ctx
, lp_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
438 if (!NT_STATUS_IS_OK(nterr
)) {
439 return ntstatus_to_werror(nterr
);
442 /* there are no more than 8 options in struct srvsvc_NetShareInfo2 */
443 info
= talloc_array(mem_ctx
, struct share_info
, count
);
444 W_ERROR_HAVE_NO_MEMORY(info
);
448 info
[i
].name
= SHARE_TYPE
;
449 info
[i
].type
= SHARE_INFO_STRING
;
450 switch (r
->in
.info
->info2
->type
) {
452 info
[i
].value
= talloc_strdup(info
, "DISK");
455 info
[i
].value
= talloc_strdup(info
, "PRINTER");
458 info
[i
].value
= talloc_strdup(info
, "IPC");
461 return WERR_INVALID_PARAM
;
463 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
466 if (r
->in
.info
->info2
->path
&& r
->in
.info
->info2
->path
[0]) {
467 info
[i
].name
= SHARE_PATH
;
468 info
[i
].type
= SHARE_INFO_STRING
;
470 /* Windows will send a path in a form of C:\example\path */
471 if (r
->in
.info
->info2
->path
[1] == ':') {
472 info
[i
].value
= talloc_strdup(info
, &r
->in
.info
->info2
->path
[2]);
474 /* very strange let's try to set as is */
475 info
[i
].value
= talloc_strdup(info
, r
->in
.info
->info2
->path
);
477 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
478 all_string_sub((char *)info
[i
].value
, "\\", "/", 0);
483 if (r
->in
.info
->info2
->comment
&& r
->in
.info
->info2
->comment
[0]) {
484 info
[i
].name
= SHARE_COMMENT
;
485 info
[i
].type
= SHARE_INFO_STRING
;
486 info
[i
].value
= talloc_strdup(info
, r
->in
.info
->info2
->comment
);
487 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
492 if (r
->in
.info
->info2
->password
&& r
->in
.info
->info2
->password
[0]) {
493 info
[i
].name
= SHARE_PASSWORD
;
494 info
[i
].type
= SHARE_INFO_STRING
;
495 info
[i
].value
= talloc_strdup(info
, r
->in
.info
->info2
->password
);
496 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
501 info
[i
].name
= SHARE_MAX_CONNECTIONS
;
502 info
[i
].type
= SHARE_INFO_INT
;
503 info
[i
].value
= talloc(info
, int);
504 *((int *)info
[i
].value
) = r
->in
.info
->info2
->max_users
;
507 /* TODO: security descriptor */
509 nterr
= share_create(sctx
, r
->in
.info
->info2
->name
, info
, i
);
510 if (!NT_STATUS_IS_OK(nterr
)) {
511 return ntstatus_to_werror(nterr
);
514 if (r
->in
.parm_error
) {
515 r
->out
.parm_error
= r
->in
.parm_error
;
522 if (r
->in
.parm_error
) {
523 r
->out
.parm_error
= r
->in
.parm_error
;
525 return WERR_NOT_SUPPORTED
;
530 struct share_info
*info
;
531 struct share_context
*sctx
;
532 unsigned int count
= 10;
535 nterr
= share_get_context_by_name(mem_ctx
, lp_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
536 if (!NT_STATUS_IS_OK(nterr
)) {
537 return ntstatus_to_werror(nterr
);
540 /* there are no more than 10 options in struct srvsvc_NetShareInfo502 */
541 info
= talloc_array(mem_ctx
, struct share_info
, count
);
542 W_ERROR_HAVE_NO_MEMORY(info
);
546 info
[i
].name
= SHARE_TYPE
;
547 info
[i
].type
= SHARE_INFO_STRING
;
548 switch (r
->in
.info
->info502
->type
) {
550 info
[i
].value
= talloc_strdup(info
, "DISK");
553 info
[i
].value
= talloc_strdup(info
, "PRINTER");
556 info
[i
].value
= talloc_strdup(info
, "IPC");
559 return WERR_INVALID_PARAM
;
561 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
564 if (r
->in
.info
->info502
->path
&& r
->in
.info
->info502
->path
[0]) {
565 info
[i
].name
= SHARE_PATH
;
566 info
[i
].type
= SHARE_INFO_STRING
;
568 /* Windows will send a path in a form of C:\example\path */
569 if (r
->in
.info
->info502
->path
[1] == ':') {
570 info
[i
].value
= talloc_strdup(info
, &r
->in
.info
->info502
->path
[2]);
572 /* very strange let's try to set as is */
573 info
[i
].value
= talloc_strdup(info
, r
->in
.info
->info502
->path
);
575 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
576 all_string_sub((char *)info
[i
].value
, "\\", "/", 0);
581 if (r
->in
.info
->info502
->comment
&& r
->in
.info
->info502
->comment
[0]) {
582 info
[i
].name
= SHARE_COMMENT
;
583 info
[i
].type
= SHARE_INFO_STRING
;
584 info
[i
].value
= talloc_strdup(info
, r
->in
.info
->info502
->comment
);
585 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
590 if (r
->in
.info
->info502
->password
&& r
->in
.info
->info502
->password
[0]) {
591 info
[i
].name
= SHARE_PASSWORD
;
592 info
[i
].type
= SHARE_INFO_STRING
;
593 info
[i
].value
= talloc_strdup(info
, r
->in
.info
->info502
->password
);
594 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
599 info
[i
].name
= SHARE_MAX_CONNECTIONS
;
600 info
[i
].type
= SHARE_INFO_INT
;
601 info
[i
].value
= talloc(info
, int);
602 *((int *)info
[i
].value
) = r
->in
.info
->info502
->max_users
;
605 /* TODO: security descriptor */
607 nterr
= share_create(sctx
, r
->in
.info
->info502
->name
, info
, i
);
608 if (!NT_STATUS_IS_OK(nterr
)) {
609 return ntstatus_to_werror(nterr
);
612 if (r
->in
.parm_error
) {
613 r
->out
.parm_error
= r
->in
.parm_error
;
619 return WERR_UNKNOWN_LEVEL
;
622 return WERR_UNKNOWN_LEVEL
;
625 static WERROR
dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
626 struct share_config
*scfg
, uint32_t level
,
627 union srvsvc_NetShareInfo
*info
)
629 struct dcesrv_context
*dce_ctx
= dce_call
->conn
->dce_ctx
;
634 info
->info0
->name
= talloc_strdup(mem_ctx
, scfg
->name
);
635 W_ERROR_HAVE_NO_MEMORY(info
->info0
->name
);
641 info
->info1
->name
= talloc_strdup(mem_ctx
, scfg
->name
);
642 W_ERROR_HAVE_NO_MEMORY(info
->info1
->name
);
643 info
->info1
->type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
644 info
->info1
->comment
= talloc_strdup(mem_ctx
, share_string_option(scfg
, SHARE_COMMENT
, ""));
645 W_ERROR_HAVE_NO_MEMORY(info
->info1
->comment
);
651 info
->info2
->name
= talloc_strdup(mem_ctx
, scfg
->name
);
652 W_ERROR_HAVE_NO_MEMORY(info
->info2
->name
);
653 info
->info2
->type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
654 info
->info2
->comment
= talloc_strdup(mem_ctx
, share_string_option(scfg
, SHARE_COMMENT
, ""));
655 W_ERROR_HAVE_NO_MEMORY(info
->info2
->comment
);
656 info
->info2
->permissions
= dcesrv_common_get_share_permissions(mem_ctx
, dce_ctx
, scfg
);
657 info
->info2
->max_users
= share_int_option(scfg
, SHARE_MAX_CONNECTIONS
, SHARE_MAX_CONNECTIONS_DEFAULT
);
658 info
->info2
->current_users
= dcesrv_common_get_share_current_users(mem_ctx
, dce_ctx
, scfg
);
659 info
->info2
->path
= dcesrv_common_get_share_path(mem_ctx
, dce_ctx
, scfg
);
660 W_ERROR_HAVE_NO_MEMORY(info
->info2
->path
);
661 info
->info2
->password
= talloc_strdup(mem_ctx
, share_string_option(scfg
, SHARE_PASSWORD
, NULL
));
667 info
->info501
->name
= talloc_strdup(mem_ctx
, scfg
->name
);
668 W_ERROR_HAVE_NO_MEMORY(info
->info501
->name
);
669 info
->info501
->type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
670 info
->info501
->comment
= talloc_strdup(mem_ctx
, share_string_option(scfg
, SHARE_COMMENT
, ""));
671 W_ERROR_HAVE_NO_MEMORY(info
->info501
->comment
);
672 info
->info501
->csc_policy
= share_int_option(scfg
, SHARE_CSC_POLICY
, SHARE_CSC_POLICY_DEFAULT
);
678 info
->info502
->name
= talloc_strdup(mem_ctx
, scfg
->name
);
679 W_ERROR_HAVE_NO_MEMORY(info
->info502
->name
);
680 info
->info502
->type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
681 info
->info502
->comment
= talloc_strdup(mem_ctx
, share_string_option(scfg
, SHARE_COMMENT
, ""));
682 W_ERROR_HAVE_NO_MEMORY(info
->info502
->comment
);
683 info
->info502
->permissions
= dcesrv_common_get_share_permissions(mem_ctx
, dce_ctx
, scfg
);
684 info
->info502
->max_users
= share_int_option(scfg
, SHARE_MAX_CONNECTIONS
, SHARE_MAX_CONNECTIONS_DEFAULT
);
685 info
->info502
->current_users
= dcesrv_common_get_share_current_users(mem_ctx
, dce_ctx
, scfg
);
686 info
->info502
->path
= dcesrv_common_get_share_path(mem_ctx
, dce_ctx
, scfg
);
687 W_ERROR_HAVE_NO_MEMORY(info
->info502
->path
);
688 info
->info502
->password
= talloc_strdup(mem_ctx
, share_string_option(scfg
, SHARE_PASSWORD
, NULL
));
689 info
->info502
->sd_buf
.sd
= dcesrv_common_get_security_descriptor(mem_ctx
, dce_ctx
, scfg
);
695 info
->info1005
->dfs_flags
= dcesrv_common_get_share_dfs_flags(mem_ctx
, dce_ctx
, scfg
);
700 return WERR_UNKNOWN_LEVEL
;
703 return WERR_UNKNOWN_LEVEL
;
707 srvsvc_NetShareEnumAll
709 static WERROR
dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
710 struct srvsvc_NetShareEnumAll
*r
)
715 struct share_context
*sctx
;
716 struct share_config
*scfg
;
718 *r
->out
.totalentries
= 0;
720 /* TODO: - paging of results
723 nterr
= share_get_context_by_name(mem_ctx
, lp_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
724 if (!NT_STATUS_IS_OK(nterr
)) {
725 return ntstatus_to_werror(nterr
);
728 nterr
= share_list_all(mem_ctx
, sctx
, &numshares
, &snames
);
729 if (!NT_STATUS_IS_OK(nterr
)) {
730 return ntstatus_to_werror(nterr
);
733 switch (r
->in
.info_ctr
->level
) {
737 struct srvsvc_NetShareCtr0
*ctr0
;
739 ctr0
= talloc(mem_ctx
, struct srvsvc_NetShareCtr0
);
740 W_ERROR_HAVE_NO_MEMORY(ctr0
);
742 ctr0
->count
= numshares
;
745 if (ctr0
->count
== 0) {
746 r
->out
.info_ctr
->ctr
.ctr0
= ctr0
;
750 ctr0
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo0
, ctr0
->count
);
751 W_ERROR_HAVE_NO_MEMORY(ctr0
->array
);
753 for (i
= 0; i
< ctr0
->count
; i
++) {
755 union srvsvc_NetShareInfo info
;
757 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
758 if (!NT_STATUS_IS_OK(nterr
)) {
759 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
760 return WERR_GENERAL_FAILURE
;
762 info
.info0
= &ctr0
->array
[i
];
763 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
764 if (!W_ERROR_IS_OK(status
)) {
771 r
->out
.info_ctr
->ctr
.ctr0
= ctr0
;
772 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr0
->count
;
778 struct srvsvc_NetShareCtr1
*ctr1
;
780 ctr1
= talloc(mem_ctx
, struct srvsvc_NetShareCtr1
);
781 W_ERROR_HAVE_NO_MEMORY(ctr1
);
783 ctr1
->count
= numshares
;
786 if (ctr1
->count
== 0) {
787 r
->out
.info_ctr
->ctr
.ctr1
= ctr1
;
791 ctr1
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo1
, ctr1
->count
);
792 W_ERROR_HAVE_NO_MEMORY(ctr1
->array
);
794 for (i
=0; i
< ctr1
->count
; i
++) {
796 union srvsvc_NetShareInfo info
;
798 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
799 if (!NT_STATUS_IS_OK(nterr
)) {
800 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
801 return WERR_GENERAL_FAILURE
;
803 info
.info1
= &ctr1
->array
[i
];
804 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
805 if (!W_ERROR_IS_OK(status
)) {
812 r
->out
.info_ctr
->ctr
.ctr1
= ctr1
;
813 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr1
->count
;
820 struct srvsvc_NetShareCtr2
*ctr2
;
822 SRVSVC_CHECK_ADMIN_ACCESS
;
824 ctr2
= talloc(mem_ctx
, struct srvsvc_NetShareCtr2
);
825 W_ERROR_HAVE_NO_MEMORY(ctr2
);
827 ctr2
->count
= numshares
;
830 if (ctr2
->count
== 0) {
831 r
->out
.info_ctr
->ctr
.ctr2
= ctr2
;
835 ctr2
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo2
, ctr2
->count
);
836 W_ERROR_HAVE_NO_MEMORY(ctr2
->array
);
838 for (i
=0; i
< ctr2
->count
; i
++) {
840 union srvsvc_NetShareInfo info
;
842 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
843 if (!NT_STATUS_IS_OK(nterr
)) {
844 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
845 return WERR_GENERAL_FAILURE
;
847 info
.info2
= &ctr2
->array
[i
];
848 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
849 if (!W_ERROR_IS_OK(status
)) {
856 r
->out
.info_ctr
->ctr
.ctr2
= ctr2
;
857 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr2
->count
;
864 struct srvsvc_NetShareCtr501
*ctr501
;
866 SRVSVC_CHECK_ADMIN_ACCESS
;
868 ctr501
= talloc(mem_ctx
, struct srvsvc_NetShareCtr501
);
869 W_ERROR_HAVE_NO_MEMORY(ctr501
);
871 ctr501
->count
= numshares
;
872 ctr501
->array
= NULL
;
874 if (ctr501
->count
== 0) {
875 r
->out
.info_ctr
->ctr
.ctr501
= ctr501
;
879 ctr501
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo501
, ctr501
->count
);
880 W_ERROR_HAVE_NO_MEMORY(ctr501
->array
);
882 for (i
=0; i
< ctr501
->count
; i
++) {
884 union srvsvc_NetShareInfo info
;
886 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
887 if (!NT_STATUS_IS_OK(nterr
)) {
888 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
889 return WERR_GENERAL_FAILURE
;
891 info
.info501
= &ctr501
->array
[i
];
892 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
893 if (!W_ERROR_IS_OK(status
)) {
900 r
->out
.info_ctr
->ctr
.ctr501
= ctr501
;
901 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr501
->count
;
908 struct srvsvc_NetShareCtr502
*ctr502
;
910 SRVSVC_CHECK_ADMIN_ACCESS
;
912 ctr502
= talloc(mem_ctx
, struct srvsvc_NetShareCtr502
);
913 W_ERROR_HAVE_NO_MEMORY(ctr502
);
915 ctr502
->count
= numshares
;
916 ctr502
->array
= NULL
;
918 if (ctr502
->count
== 0) {
919 r
->out
.info_ctr
->ctr
.ctr502
= ctr502
;
923 ctr502
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo502
, ctr502
->count
);
924 W_ERROR_HAVE_NO_MEMORY(ctr502
->array
);
926 for (i
=0; i
< ctr502
->count
; i
++) {
928 union srvsvc_NetShareInfo info
;
930 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
931 if (!NT_STATUS_IS_OK(nterr
)) {
932 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
933 return WERR_GENERAL_FAILURE
;
935 info
.info502
= &ctr502
->array
[i
];
936 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
937 if (!W_ERROR_IS_OK(status
)) {
944 r
->out
.info_ctr
->ctr
.ctr502
= ctr502
;
945 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr502
->count
;
950 return WERR_UNKNOWN_LEVEL
;
953 return WERR_UNKNOWN_LEVEL
;
958 srvsvc_NetShareGetInfo
960 static WERROR
dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
961 struct srvsvc_NetShareGetInfo
*r
)
964 struct share_context
*sctx
= NULL
;
965 struct share_config
*scfg
= NULL
;
967 ZERO_STRUCTP(r
->out
.info
);
969 /* TODO: - access check
972 if (strcmp("", r
->in
.share_name
) == 0) {
973 return WERR_INVALID_PARAM
;
976 nterr
= share_get_context_by_name(mem_ctx
, lp_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
977 if (!NT_STATUS_IS_OK(nterr
)) {
978 return ntstatus_to_werror(nterr
);
981 nterr
= share_get_config(mem_ctx
, sctx
, r
->in
.share_name
, &scfg
);
982 if (!NT_STATUS_IS_OK(nterr
)) {
983 return ntstatus_to_werror(nterr
);
986 switch (r
->in
.level
) {
990 union srvsvc_NetShareInfo info
;
992 info
.info0
= talloc(mem_ctx
, struct srvsvc_NetShareInfo0
);
993 W_ERROR_HAVE_NO_MEMORY(info
.info0
);
995 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.level
, &info
);
996 if (!W_ERROR_IS_OK(status
)) {
1000 r
->out
.info
->info0
= info
.info0
;
1006 union srvsvc_NetShareInfo info
;
1008 info
.info1
= talloc(mem_ctx
, struct srvsvc_NetShareInfo1
);
1009 W_ERROR_HAVE_NO_MEMORY(info
.info1
);
1011 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.level
, &info
);
1012 if (!W_ERROR_IS_OK(status
)) {
1016 r
->out
.info
->info1
= info
.info1
;
1022 union srvsvc_NetShareInfo info
;
1024 SRVSVC_CHECK_ADMIN_ACCESS
;
1026 info
.info2
= talloc(mem_ctx
, struct srvsvc_NetShareInfo2
);
1027 W_ERROR_HAVE_NO_MEMORY(info
.info2
);
1029 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.level
, &info
);
1030 if (!W_ERROR_IS_OK(status
)) {
1034 r
->out
.info
->info2
= info
.info2
;
1040 union srvsvc_NetShareInfo info
;
1042 info
.info501
= talloc(mem_ctx
, struct srvsvc_NetShareInfo501
);
1043 W_ERROR_HAVE_NO_MEMORY(info
.info501
);
1045 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.level
, &info
);
1046 if (!W_ERROR_IS_OK(status
)) {
1050 r
->out
.info
->info501
= info
.info501
;
1056 union srvsvc_NetShareInfo info
;
1058 SRVSVC_CHECK_ADMIN_ACCESS
;
1060 info
.info502
= talloc(mem_ctx
, struct srvsvc_NetShareInfo502
);
1061 W_ERROR_HAVE_NO_MEMORY(info
.info502
);
1063 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.level
, &info
);
1064 if (!W_ERROR_IS_OK(status
)) {
1068 r
->out
.info
->info502
= info
.info502
;
1074 union srvsvc_NetShareInfo info
;
1076 info
.info1005
= talloc(mem_ctx
, struct srvsvc_NetShareInfo1005
);
1077 W_ERROR_HAVE_NO_MEMORY(info
.info1005
);
1079 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.level
, &info
);
1080 if (!W_ERROR_IS_OK(status
)) {
1084 r
->out
.info
->info1005
= info
.info1005
;
1088 return WERR_UNKNOWN_LEVEL
;
1091 return WERR_UNKNOWN_LEVEL
;
1094 static WERROR
dcesrv_srvsvc_fill_share_info(struct share_info
*info
, int *count
,
1095 const char *share_name
, int level
,
1098 const char *comment
,
1099 const char *password
,
1100 enum srvsvc_ShareType type
,
1102 uint32_t csc_policy
,
1103 struct security_descriptor
*sd
)
1108 info
[i
].name
= SHARE_CSC_POLICY
;
1109 info
[i
].type
= SHARE_INFO_INT
;
1110 info
[i
].value
= talloc(info
, int);
1111 *((int *)info
[i
].value
) = csc_policy
;
1118 /* TODO: check if unknown is csc_policy */
1120 /* TODO: security descriptor */
1123 if (path
&& path
[0]) {
1124 info
[i
].name
= SHARE_PATH
;
1125 info
[i
].type
= SHARE_INFO_STRING
;
1127 /* Windows will send a path in a form of C:\example\path */
1128 if (path
[1] == ':') {
1129 info
[i
].value
= talloc_strdup(info
, &path
[2]);
1131 /* very strange let's try to set as is */
1132 info
[i
].value
= talloc_strdup(info
, path
);
1134 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
1135 all_string_sub((char *)info
[i
].value
, "\\", "/", 0);
1140 if (password
&& password
[0]) {
1141 info
[i
].name
= SHARE_PASSWORD
;
1142 info
[i
].type
= SHARE_INFO_STRING
;
1143 info
[i
].value
= talloc_strdup(info
, password
);
1144 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
1149 info
[i
].name
= SHARE_MAX_CONNECTIONS
;
1150 info
[i
].type
= SHARE_INFO_INT
;
1151 info
[i
].value
= talloc(info
, int);
1152 *((int *)info
[i
].value
) = max_users
;
1157 info
[i
].name
= SHARE_TYPE
;
1158 info
[i
].type
= SHARE_INFO_STRING
;
1161 info
[i
].value
= talloc_strdup(info
, "DISK");
1164 info
[i
].value
= talloc_strdup(info
, "PRINTER");
1167 info
[i
].value
= talloc_strdup(info
, "IPC");
1170 return WERR_INVALID_PARAM
;
1172 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
1177 info
[i
].name
= SHARE_COMMENT
;
1178 info
[i
].type
= SHARE_INFO_STRING
;
1179 info
[i
].value
= talloc_strdup(info
, comment
);
1180 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
1186 strcasecmp(share_name
, name
) != 0) {
1187 info
[i
].name
= SHARE_NAME
;
1188 info
[i
].type
= SHARE_INFO_STRING
;
1189 info
[i
].value
= talloc_strdup(info
, name
);
1190 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
1197 return WERR_UNKNOWN_LEVEL
;
1206 srvsvc_NetShareSetInfo
1208 static WERROR
dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1209 struct srvsvc_NetShareSetInfo
*r
)
1213 struct share_context
*sctx
= NULL
;
1214 struct share_info
*info
;
1217 /* TODO: - access check
1220 /* there are no more than 10 options in all struct srvsvc_NetShareInfoXXX */
1221 info
= talloc_array(mem_ctx
, struct share_info
, 10);
1222 W_ERROR_HAVE_NO_MEMORY(info
);
1224 ZERO_STRUCT(r
->out
);
1226 if (strcmp("", r
->in
.share_name
) == 0) {
1227 return WERR_INVALID_PARAM
;
1230 nterr
= share_get_context_by_name(mem_ctx
, lp_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
1231 if (!NT_STATUS_IS_OK(nterr
)) {
1232 return ntstatus_to_werror(nterr
);
1235 switch (r
->in
.level
) {
1238 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1239 r
->in
.share_name
, r
->in
.level
,
1240 r
->in
.info
->info0
->name
,
1248 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1255 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1256 r
->in
.share_name
, r
->in
.level
,
1257 r
->in
.info
->info1
->name
,
1259 r
->in
.info
->info1
->comment
,
1261 r
->in
.info
->info1
->type
,
1265 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1272 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1273 r
->in
.share_name
, r
->in
.level
,
1274 r
->in
.info
->info2
->name
,
1275 r
->in
.info
->info2
->path
,
1276 r
->in
.info
->info2
->comment
,
1277 r
->in
.info
->info2
->password
,
1278 r
->in
.info
->info2
->type
,
1279 r
->in
.info
->info2
->max_users
,
1282 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1289 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1290 r
->in
.share_name
, r
->in
.level
,
1291 r
->in
.info
->info501
->name
,
1293 r
->in
.info
->info501
->comment
,
1295 r
->in
.info
->info501
->type
,
1297 r
->in
.info
->info501
->csc_policy
,
1299 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1306 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1307 r
->in
.share_name
, r
->in
.level
,
1308 r
->in
.info
->info502
->name
,
1309 r
->in
.info
->info502
->path
,
1310 r
->in
.info
->info502
->comment
,
1311 r
->in
.info
->info502
->password
,
1312 r
->in
.info
->info502
->type
,
1313 r
->in
.info
->info502
->max_users
,
1315 r
->in
.info
->info502
->sd_buf
.sd
);
1316 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1323 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1324 r
->in
.share_name
, r
->in
.level
,
1327 r
->in
.info
->info1004
->comment
,
1333 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1340 /* r->in.info.dfs_flags; */
1342 if (r
->in
.parm_error
) {
1343 r
->out
.parm_error
= r
->in
.parm_error
;
1349 return WERR_UNKNOWN_LEVEL
;
1352 nterr
= share_set(sctx
, r
->in
.share_name
, info
, count
);
1353 if (!NT_STATUS_IS_OK(nterr
)) {
1354 return ntstatus_to_werror(nterr
);
1357 if (r
->in
.parm_error
) {
1358 r
->out
.parm_error
= r
->in
.parm_error
;
1366 srvsvc_NetShareDelSticky
1368 static WERROR
dcesrv_srvsvc_NetShareDelSticky(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1369 struct srvsvc_NetShareDelSticky
*r
)
1371 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1376 srvsvc_NetShareCheck
1378 static WERROR
dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1379 struct srvsvc_NetShareCheck
*r
)
1382 struct share_context
*sctx
= NULL
;
1383 struct share_config
*scfg
= NULL
;
1391 /* TODO: - access check
1394 if (strcmp("", r
->in
.device_name
) == 0) {
1395 *r
->out
.type
= STYPE_IPC
;
1399 /* copy the path skipping C:\ */
1400 if (strncasecmp(r
->in
.device_name
, "C:", 2) == 0) {
1401 device
= talloc_strdup(mem_ctx
, &r
->in
.device_name
[2]);
1403 /* no chance we have a share that doesn't start with C:\ */
1404 return WERR_DEVICE_NOT_SHARED
;
1406 all_string_sub(device
, "\\", "/", 0);
1408 nterr
= share_get_context_by_name(mem_ctx
, lp_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
1409 if (!NT_STATUS_IS_OK(nterr
)) {
1410 return ntstatus_to_werror(nterr
);
1413 nterr
= share_list_all(mem_ctx
, sctx
, &count
, &names
);
1414 if (!NT_STATUS_IS_OK(nterr
)) {
1415 return ntstatus_to_werror(nterr
);
1418 for (i
= 0; i
< count
; i
++) {
1422 nterr
= share_get_config(mem_ctx
, sctx
, names
[i
], &scfg
);
1423 if (!NT_STATUS_IS_OK(nterr
)) {
1424 return ntstatus_to_werror(nterr
);
1426 path
= share_string_option(scfg
, SHARE_PATH
, NULL
);
1427 if (!path
) continue;
1429 if (strcmp(device
, path
) == 0) {
1430 type
= share_string_option(scfg
, SHARE_TYPE
, NULL
);
1431 if (!type
) continue;
1433 if (strcmp(type
, "DISK") == 0) {
1434 *r
->out
.type
= STYPE_DISKTREE
;
1438 if (strcmp(type
, "IPC") == 0) {
1439 *r
->out
.type
= STYPE_IPC
;
1443 if (strcmp(type
, "PRINTER") == 0) {
1444 *r
->out
.type
= STYPE_PRINTQ
;
1450 return WERR_DEVICE_NOT_SHARED
;
1455 srvsvc_NetSrvGetInfo
1457 static WERROR
dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1458 struct srvsvc_NetSrvGetInfo
*r
)
1460 struct dcesrv_context
*dce_ctx
= dce_call
->conn
->dce_ctx
;
1461 struct dcerpc_server_info
*server_info
= lp_dcerpc_server_info(mem_ctx
, dce_ctx
->lp_ctx
);
1463 ZERO_STRUCTP(r
->out
.info
);
1465 switch (r
->in
.level
) {
1468 struct srvsvc_NetSrvInfo100
*info100
;
1470 info100
= talloc(mem_ctx
, struct srvsvc_NetSrvInfo100
);
1471 W_ERROR_HAVE_NO_MEMORY(info100
);
1473 info100
->platform_id
= dcesrv_common_get_platform_id(mem_ctx
, dce_ctx
);
1474 info100
->server_name
= dcesrv_common_get_server_name(mem_ctx
, dce_ctx
, r
->in
.server_unc
);
1475 W_ERROR_HAVE_NO_MEMORY(info100
->server_name
);
1477 r
->out
.info
->info100
= info100
;
1482 struct srvsvc_NetSrvInfo101
*info101
;
1484 info101
= talloc(mem_ctx
, struct srvsvc_NetSrvInfo101
);
1485 W_ERROR_HAVE_NO_MEMORY(info101
);
1487 info101
->platform_id
= dcesrv_common_get_platform_id(mem_ctx
, dce_ctx
);
1488 info101
->server_name
= dcesrv_common_get_server_name(mem_ctx
, dce_ctx
, r
->in
.server_unc
);
1489 W_ERROR_HAVE_NO_MEMORY(info101
->server_name
);
1491 info101
->version_major
= server_info
->version_major
;
1492 info101
->version_minor
= server_info
->version_minor
;
1493 info101
->server_type
= dcesrv_common_get_server_type(mem_ctx
, dce_call
->event_ctx
, dce_ctx
);
1494 info101
->comment
= talloc_strdup(mem_ctx
, lp_serverstring(dce_ctx
->lp_ctx
));
1495 W_ERROR_HAVE_NO_MEMORY(info101
->comment
);
1497 r
->out
.info
->info101
= info101
;
1502 struct srvsvc_NetSrvInfo102
*info102
;
1504 info102
= talloc(mem_ctx
, struct srvsvc_NetSrvInfo102
);
1505 W_ERROR_HAVE_NO_MEMORY(info102
);
1507 info102
->platform_id
= dcesrv_common_get_platform_id(mem_ctx
, dce_ctx
);
1508 info102
->server_name
= dcesrv_common_get_server_name(mem_ctx
, dce_ctx
, r
->in
.server_unc
);
1509 W_ERROR_HAVE_NO_MEMORY(info102
->server_name
);
1511 info102
->version_major
= server_info
->version_major
;
1512 info102
->version_minor
= server_info
->version_minor
;
1513 info102
->server_type
= dcesrv_common_get_server_type(mem_ctx
, dce_call
->event_ctx
, dce_ctx
);
1514 info102
->comment
= talloc_strdup(mem_ctx
, lp_serverstring(dce_ctx
->lp_ctx
));
1515 W_ERROR_HAVE_NO_MEMORY(info102
->comment
);
1517 info102
->users
= dcesrv_common_get_users(mem_ctx
, dce_ctx
);
1518 info102
->disc
= dcesrv_common_get_disc(mem_ctx
, dce_ctx
);
1519 info102
->hidden
= dcesrv_common_get_hidden(mem_ctx
, dce_ctx
);
1520 info102
->announce
= dcesrv_common_get_announce(mem_ctx
, dce_ctx
);
1521 info102
->anndelta
= dcesrv_common_get_anndelta(mem_ctx
, dce_ctx
);
1522 info102
->licenses
= dcesrv_common_get_licenses(mem_ctx
, dce_ctx
);
1523 info102
->userpath
= dcesrv_common_get_userpath(mem_ctx
, dce_ctx
);
1524 W_ERROR_HAVE_NO_MEMORY(info102
->userpath
);
1526 r
->out
.info
->info102
= info102
;
1530 return WERR_UNKNOWN_LEVEL
;
1533 return WERR_UNKNOWN_LEVEL
;
1538 srvsvc_NetSrvSetInfo
1540 static WERROR
dcesrv_srvsvc_NetSrvSetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1541 struct srvsvc_NetSrvSetInfo
*r
)
1543 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1550 static WERROR
dcesrv_srvsvc_NetDiskEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1551 struct srvsvc_NetDiskEnum
*r
)
1553 r
->out
.info
->disks
= NULL
;
1554 r
->out
.info
->count
= 0;
1555 *r
->out
.totalentries
= 0;
1557 switch (r
->in
.level
) {
1560 /* we can safely hardcode the reply and report we have only one disk (C:) */
1561 /* for some reason Windows wants 2 entries with the second being empty */
1562 r
->out
.info
->disks
= talloc_array(mem_ctx
, struct srvsvc_NetDiskInfo0
, 2);
1563 W_ERROR_HAVE_NO_MEMORY(r
->out
.info
->disks
);
1564 r
->out
.info
->count
= 2;
1566 r
->out
.info
->disks
[0].disk
= talloc_strdup(mem_ctx
, "C:");
1567 W_ERROR_HAVE_NO_MEMORY(r
->out
.info
->disks
[0].disk
);
1569 r
->out
.info
->disks
[1].disk
= talloc_strdup(mem_ctx
, "");
1570 W_ERROR_HAVE_NO_MEMORY(r
->out
.info
->disks
[1].disk
);
1572 *r
->out
.totalentries
= 1;
1573 r
->out
.resume_handle
= r
->in
.resume_handle
;
1578 return WERR_UNKNOWN_LEVEL
;
1581 return WERR_UNKNOWN_LEVEL
;
1586 srvsvc_NetServerStatisticsGet
1588 static WERROR
dcesrv_srvsvc_NetServerStatisticsGet(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1589 struct srvsvc_NetServerStatisticsGet
*r
)
1591 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1596 srvsvc_NetTransportAdd
1598 static WERROR
dcesrv_srvsvc_NetTransportAdd(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1599 struct srvsvc_NetTransportAdd
*r
)
1601 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1606 srvsvc_NetTransportEnum
1608 static WERROR
dcesrv_srvsvc_NetTransportEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1609 struct srvsvc_NetTransportEnum
*r
)
1611 r
->out
.transports
->level
= r
->in
.transports
->level
;
1612 *r
->out
.totalentries
= 0;
1613 if (r
->out
.resume_handle
) {
1614 *r
->out
.resume_handle
= 0;
1617 switch (r
->in
.transports
->level
) {
1620 r
->out
.transports
->ctr
.ctr0
= talloc(mem_ctx
, struct srvsvc_NetTransportCtr0
);
1621 W_ERROR_HAVE_NO_MEMORY(r
->out
.transports
->ctr
.ctr0
);
1623 r
->out
.transports
->ctr
.ctr0
->count
= 0;
1624 r
->out
.transports
->ctr
.ctr0
->array
= NULL
;
1626 return WERR_NOT_SUPPORTED
;
1630 r
->out
.transports
->ctr
.ctr1
= talloc(mem_ctx
, struct srvsvc_NetTransportCtr1
);
1631 W_ERROR_HAVE_NO_MEMORY(r
->out
.transports
->ctr
.ctr1
);
1633 r
->out
.transports
->ctr
.ctr1
->count
= 0;
1634 r
->out
.transports
->ctr
.ctr1
->array
= NULL
;
1636 return WERR_NOT_SUPPORTED
;
1640 r
->out
.transports
->ctr
.ctr2
= talloc(mem_ctx
, struct srvsvc_NetTransportCtr2
);
1641 W_ERROR_HAVE_NO_MEMORY(r
->out
.transports
->ctr
.ctr2
);
1643 r
->out
.transports
->ctr
.ctr2
->count
= 0;
1644 r
->out
.transports
->ctr
.ctr2
->array
= NULL
;
1646 return WERR_NOT_SUPPORTED
;
1650 r
->out
.transports
->ctr
.ctr3
= talloc(mem_ctx
, struct srvsvc_NetTransportCtr3
);
1651 W_ERROR_HAVE_NO_MEMORY(r
->out
.transports
->ctr
.ctr3
);
1653 r
->out
.transports
->ctr
.ctr3
->count
= 0;
1654 r
->out
.transports
->ctr
.ctr3
->array
= NULL
;
1656 return WERR_NOT_SUPPORTED
;
1659 return WERR_UNKNOWN_LEVEL
;
1662 return WERR_UNKNOWN_LEVEL
;
1666 srvsvc_NetTransportDel
1668 static WERROR
dcesrv_srvsvc_NetTransportDel(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1669 struct srvsvc_NetTransportDel
*r
)
1671 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1678 static WERROR
dcesrv_srvsvc_NetRemoteTOD(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1679 struct srvsvc_NetRemoteTOD
*r
)
1681 struct timeval tval
;
1684 struct srvsvc_NetRemoteTODInfo
*info
;
1686 info
= talloc(mem_ctx
, struct srvsvc_NetRemoteTODInfo
);
1687 W_ERROR_HAVE_NO_MEMORY(info
);
1689 GetTimeOfDay(&tval
);
1695 /* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
1696 info
->msecs
= (tm
.tm_hour
*60*60*1000)
1697 + (tm
.tm_min
*60*1000)
1699 + (tval
.tv_usec
/1000);
1700 info
->hours
= tm
.tm_hour
;
1701 info
->mins
= tm
.tm_min
;
1702 info
->secs
= tm
.tm_sec
;
1703 info
->hunds
= tval
.tv_usec
/10000;
1704 info
->timezone
= get_time_zone(t
)/60;
1705 info
->tinterval
= 310; /* just return the same as windows */
1706 info
->day
= tm
.tm_mday
;
1707 info
->month
= tm
.tm_mon
+ 1;
1708 info
->year
= tm
.tm_year
+ 1900;
1709 info
->weekday
= tm
.tm_wday
;
1711 *r
->out
.info
= info
;
1719 static WERROR
dcesrv_srvsvc_NetPathType(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1720 struct srvsvc_NetPathType
*r
)
1722 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1727 srvsvc_NetPathCanonicalize
1729 static WERROR
dcesrv_srvsvc_NetPathCanonicalize(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1730 struct srvsvc_NetPathCanonicalize
*r
)
1732 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1737 srvsvc_NetPathCompare
1739 static WERROR
dcesrv_srvsvc_NetPathCompare(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1740 struct srvsvc_NetPathCompare
*r
)
1742 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1747 srvsvc_NetNameValidate
1749 static WERROR
dcesrv_srvsvc_NetNameValidate(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1750 struct srvsvc_NetNameValidate
*r
)
1754 if ((r
->in
.flags
!= 0x0) && (r
->in
.flags
!= 0x80000000)) {
1755 return WERR_INVALID_NAME
;
1758 switch (r
->in
.name_type
) {
1767 return WERR_NOT_SUPPORTED
;
1769 case 9: /* validate share name */
1771 len
= strlen_m(r
->in
.name
);
1772 if ((r
->in
.flags
== 0x0) && (len
> 81)) {
1773 return WERR_INVALID_NAME
;
1775 if ((r
->in
.flags
== 0x80000000) && (len
> 13)) {
1776 return WERR_INVALID_NAME
;
1778 if (! dcesrv_common_validate_share_name(mem_ctx
, r
->in
.name
)) {
1779 return WERR_INVALID_NAME
;
1787 return WERR_NOT_SUPPORTED
;
1789 return WERR_INVALID_PARAM
;
1792 return WERR_INVALID_PARAM
;
1797 srvsvc_NetPRNameCompare
1799 static WERROR
dcesrv_srvsvc_NetPRNameCompare(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1800 struct srvsvc_NetPRNameCompare
*r
)
1802 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1809 static WERROR
dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1810 struct srvsvc_NetShareEnum
*r
)
1814 const char **snames
;
1815 struct share_context
*sctx
;
1816 struct share_config
*scfg
;
1817 struct dcesrv_context
*dce_ctx
= dce_call
->conn
->dce_ctx
;
1819 *r
->out
.totalentries
= 0;
1821 /* TODO: - paging of results
1824 nterr
= share_get_context_by_name(mem_ctx
, lp_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
1825 if (!NT_STATUS_IS_OK(nterr
)) {
1826 return ntstatus_to_werror(nterr
);
1829 nterr
= share_list_all(mem_ctx
, sctx
, &numshares
, &snames
);
1830 if (!NT_STATUS_IS_OK(nterr
)) {
1831 return ntstatus_to_werror(nterr
);
1834 switch (r
->in
.info_ctr
->level
) {
1837 unsigned int i
, y
= 0;
1839 struct srvsvc_NetShareCtr0
*ctr0
;
1841 ctr0
= talloc(mem_ctx
, struct srvsvc_NetShareCtr0
);
1842 W_ERROR_HAVE_NO_MEMORY(ctr0
);
1845 ctr0
->count
= count
;
1848 if (ctr0
->count
== 0) {
1849 r
->out
.info_ctr
->ctr
.ctr0
= ctr0
;
1853 ctr0
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo0
, count
);
1854 W_ERROR_HAVE_NO_MEMORY(ctr0
->array
);
1856 for (i
=0; i
< count
; i
++) {
1858 union srvsvc_NetShareInfo info
;
1859 enum srvsvc_ShareType type
;
1861 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
1862 if (!NT_STATUS_IS_OK(nterr
)) {
1863 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
1864 return WERR_GENERAL_FAILURE
;
1867 type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
1868 if (type
& STYPE_HIDDEN
) {
1874 info
.info0
= &ctr0
->array
[y
];
1875 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
1876 W_ERROR_NOT_OK_RETURN(status
);
1880 talloc_free(snames
);
1882 r
->out
.info_ctr
->ctr
.ctr0
= ctr0
;
1883 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr0
->count
;
1889 unsigned int i
, y
= 0;
1891 struct srvsvc_NetShareCtr1
*ctr1
;
1893 ctr1
= talloc(mem_ctx
, struct srvsvc_NetShareCtr1
);
1894 W_ERROR_HAVE_NO_MEMORY(ctr1
);
1897 ctr1
->count
= count
;
1900 if (ctr1
->count
== 0) {
1901 r
->out
.info_ctr
->ctr
.ctr1
= ctr1
;
1905 ctr1
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo1
, count
);
1906 W_ERROR_HAVE_NO_MEMORY(ctr1
->array
);
1908 for (i
=0; i
< count
; i
++) {
1910 union srvsvc_NetShareInfo info
;
1911 enum srvsvc_ShareType type
;
1913 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
1914 if (!NT_STATUS_IS_OK(nterr
)) {
1915 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
1916 return WERR_GENERAL_FAILURE
;
1919 type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
1920 if (type
& STYPE_HIDDEN
) {
1926 info
.info1
= &ctr1
->array
[y
];
1927 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
1928 W_ERROR_NOT_OK_RETURN(status
);
1932 talloc_free(snames
);
1934 r
->out
.info_ctr
->ctr
.ctr1
= ctr1
;
1935 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr1
->count
;
1941 unsigned int i
, y
= 0;
1943 struct srvsvc_NetShareCtr2
*ctr2
;
1945 SRVSVC_CHECK_ADMIN_ACCESS
;
1947 ctr2
= talloc(mem_ctx
, struct srvsvc_NetShareCtr2
);
1948 W_ERROR_HAVE_NO_MEMORY(ctr2
);
1951 ctr2
->count
= count
;
1954 if (ctr2
->count
== 0) {
1955 r
->out
.info_ctr
->ctr
.ctr2
= ctr2
;
1959 ctr2
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo2
, count
);
1960 W_ERROR_HAVE_NO_MEMORY(ctr2
->array
);
1962 for (i
=0; i
< count
; i
++) {
1964 union srvsvc_NetShareInfo info
;
1965 enum srvsvc_ShareType type
;
1967 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
1968 if (!NT_STATUS_IS_OK(nterr
)) {
1969 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
1970 return WERR_GENERAL_FAILURE
;
1973 type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
1974 if (type
& STYPE_HIDDEN
) {
1980 info
.info2
= &ctr2
->array
[y
];
1981 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
1982 W_ERROR_NOT_OK_RETURN(status
);
1986 talloc_free(snames
);
1988 r
->out
.info_ctr
->ctr
.ctr2
= ctr2
;
1989 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr2
->count
;
1995 unsigned int i
, y
= 0;
1997 struct srvsvc_NetShareCtr502
*ctr502
;
1999 SRVSVC_CHECK_ADMIN_ACCESS
;
2001 ctr502
= talloc(mem_ctx
, struct srvsvc_NetShareCtr502
);
2002 W_ERROR_HAVE_NO_MEMORY(ctr502
);
2005 ctr502
->count
= count
;
2006 ctr502
->array
= NULL
;
2008 if (ctr502
->count
== 0) {
2009 r
->out
.info_ctr
->ctr
.ctr502
= ctr502
;
2013 ctr502
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo502
, count
);
2014 W_ERROR_HAVE_NO_MEMORY(ctr502
->array
);
2016 for (i
=0; i
< count
; i
++) {
2018 union srvsvc_NetShareInfo info
;
2019 enum srvsvc_ShareType type
;
2021 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
2022 if (!NT_STATUS_IS_OK(nterr
)) {
2023 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
2024 return WERR_GENERAL_FAILURE
;
2027 type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
2028 if (type
& STYPE_HIDDEN
) {
2034 info
.info502
= &ctr502
->array
[y
];
2035 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
2036 W_ERROR_NOT_OK_RETURN(status
);
2040 talloc_free(snames
);
2042 r
->out
.info_ctr
->ctr
.ctr502
= ctr502
;
2043 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr502
->count
;
2048 return WERR_UNKNOWN_LEVEL
;
2051 return WERR_UNKNOWN_LEVEL
;
2056 srvsvc_NetShareDelStart
2058 static WERROR
dcesrv_srvsvc_NetShareDelStart(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2059 struct srvsvc_NetShareDelStart
*r
)
2061 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2066 srvsvc_NetShareDelCommit
2068 static WERROR
dcesrv_srvsvc_NetShareDelCommit(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2069 struct srvsvc_NetShareDelCommit
*r
)
2071 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2076 srvsvc_NetGetFileSecurity
2078 static WERROR
dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2079 struct srvsvc_NetGetFileSecurity
*r
)
2081 struct sec_desc_buf
*sd_buf
;
2082 struct ntvfs_context
*ntvfs_ctx
= NULL
;
2083 struct ntvfs_request
*ntvfs_req
;
2084 union smb_fileinfo
*io
;
2087 nt_status
= srvsvc_create_ntvfs_context(dce_call
, mem_ctx
, r
->in
.share
, &ntvfs_ctx
);
2088 if (!NT_STATUS_IS_OK(nt_status
)) return ntstatus_to_werror(nt_status
);
2090 ntvfs_req
= ntvfs_request_create(ntvfs_ctx
, mem_ctx
,
2091 dce_call
->conn
->auth_state
.session_info
,
2095 W_ERROR_HAVE_NO_MEMORY(ntvfs_req
);
2097 sd_buf
= talloc(mem_ctx
, struct sec_desc_buf
);
2098 W_ERROR_HAVE_NO_MEMORY(sd_buf
);
2100 io
= talloc(mem_ctx
, union smb_fileinfo
);
2101 W_ERROR_HAVE_NO_MEMORY(io
);
2103 io
->query_secdesc
.level
= RAW_FILEINFO_SEC_DESC
;
2104 io
->query_secdesc
.in
.file
.path
= r
->in
.file
;
2105 io
->query_secdesc
.in
.secinfo_flags
= r
->in
.securityinformation
;
2107 nt_status
= ntvfs_qpathinfo(ntvfs_req
, io
);
2108 if (!NT_STATUS_IS_OK(nt_status
)) return ntstatus_to_werror(nt_status
);
2110 sd_buf
->sd
= io
->query_secdesc
.out
.sd
;
2112 *r
->out
.sd_buf
= sd_buf
;
2118 srvsvc_NetSetFileSecurity
2120 static WERROR
dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2121 struct srvsvc_NetSetFileSecurity
*r
)
2123 struct ntvfs_context
*ntvfs_ctx
;
2124 struct ntvfs_request
*ntvfs_req
;
2125 union smb_setfileinfo
*io
;
2128 nt_status
= srvsvc_create_ntvfs_context(dce_call
, mem_ctx
, r
->in
.share
, &ntvfs_ctx
);
2129 if (!NT_STATUS_IS_OK(nt_status
)) return ntstatus_to_werror(nt_status
);
2131 ntvfs_req
= ntvfs_request_create(ntvfs_ctx
, mem_ctx
,
2132 dce_call
->conn
->auth_state
.session_info
,
2136 W_ERROR_HAVE_NO_MEMORY(ntvfs_req
);
2138 io
= talloc(mem_ctx
, union smb_setfileinfo
);
2139 W_ERROR_HAVE_NO_MEMORY(io
);
2141 io
->set_secdesc
.level
= RAW_FILEINFO_SEC_DESC
;
2142 io
->set_secdesc
.in
.file
.path
= r
->in
.file
;
2143 io
->set_secdesc
.in
.secinfo_flags
= r
->in
.securityinformation
;
2144 io
->set_secdesc
.in
.sd
= r
->in
.sd_buf
->sd
;
2146 nt_status
= ntvfs_setpathinfo(ntvfs_req
, io
);
2147 if (!NT_STATUS_IS_OK(nt_status
)) return ntstatus_to_werror(nt_status
);
2154 srvsvc_NetServerTransportAddEx
2156 static WERROR
dcesrv_srvsvc_NetServerTransportAddEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2157 struct srvsvc_NetServerTransportAddEx
*r
)
2159 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2164 srvsvc_NetServerSetServiceBitsEx
2166 static WERROR
dcesrv_srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2167 struct srvsvc_NetServerSetServiceBitsEx
*r
)
2169 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2174 srvsvc_NETRDFSGETVERSION
2176 static WERROR
dcesrv_srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2177 struct srvsvc_NETRDFSGETVERSION
*r
)
2179 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2184 srvsvc_NETRDFSCREATELOCALPARTITION
2186 static WERROR
dcesrv_srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2187 struct srvsvc_NETRDFSCREATELOCALPARTITION
*r
)
2189 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2194 srvsvc_NETRDFSDELETELOCALPARTITION
2196 static WERROR
dcesrv_srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2197 struct srvsvc_NETRDFSDELETELOCALPARTITION
*r
)
2199 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2204 srvsvc_NETRDFSSETLOCALVOLUMESTATE
2206 static WERROR
dcesrv_srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2207 struct srvsvc_NETRDFSSETLOCALVOLUMESTATE
*r
)
2209 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2214 srvsvc_NETRDFSSETSERVERINFO
2216 static WERROR
dcesrv_srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2217 struct srvsvc_NETRDFSSETSERVERINFO
*r
)
2219 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2224 srvsvc_NETRDFSCREATEEXITPOINT
2226 static WERROR
dcesrv_srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2227 struct srvsvc_NETRDFSCREATEEXITPOINT
*r
)
2229 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2234 srvsvc_NETRDFSDELETEEXITPOINT
2236 static WERROR
dcesrv_srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2237 struct srvsvc_NETRDFSDELETEEXITPOINT
*r
)
2239 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2244 srvsvc_NETRDFSMODIFYPREFIX
2246 static WERROR
dcesrv_srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2247 struct srvsvc_NETRDFSMODIFYPREFIX
*r
)
2249 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2254 srvsvc_NETRDFSFIXLOCALVOLUME
2256 static WERROR
dcesrv_srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2257 struct srvsvc_NETRDFSFIXLOCALVOLUME
*r
)
2259 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2264 srvsvc_NETRDFSMANAGERREPORTSITEINFO
2266 static WERROR
dcesrv_srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2267 struct srvsvc_NETRDFSMANAGERREPORTSITEINFO
*r
)
2269 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2274 srvsvc_NETRSERVERTRANSPORTDELEX
2276 static WERROR
dcesrv_srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2277 struct srvsvc_NETRSERVERTRANSPORTDELEX
*r
)
2279 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2285 static WERROR
dcesrv_srvsvc_NetShareDel(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2286 struct srvsvc_NetShareDel
*r
)
2289 struct share_context
*sctx
;
2291 nterr
= share_get_context_by_name(mem_ctx
, lp_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
2292 if (!NT_STATUS_IS_OK(nterr
)) {
2293 return ntstatus_to_werror(nterr
);
2296 nterr
= share_remove(sctx
, r
->in
.share_name
);
2297 if (!NT_STATUS_IS_OK(nterr
)) {
2298 return ntstatus_to_werror(nterr
);
2305 srvsvc_NetSetServiceBits
2307 static WERROR
dcesrv_srvsvc_NetSetServiceBits(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2308 struct srvsvc_NetSetServiceBits
*r
)
2310 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2314 srvsvc_NETRPRNAMECANONICALIZE
2316 static WERROR
dcesrv_srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2317 struct srvsvc_NETRPRNAMECANONICALIZE
*r
)
2319 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2322 /* include the generated boilerplate */
2323 #include "librpc/gen_ndr/ndr_srvsvc_s.c"