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 if (strcmp("", r
->in
.share_name
) == 0) {
1225 return WERR_INVALID_PARAM
;
1228 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
);
1229 if (!NT_STATUS_IS_OK(nterr
)) {
1230 return ntstatus_to_werror(nterr
);
1233 switch (r
->in
.level
) {
1236 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1237 r
->in
.share_name
, r
->in
.level
,
1238 r
->in
.info
->info0
->name
,
1246 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1253 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1254 r
->in
.share_name
, r
->in
.level
,
1255 r
->in
.info
->info1
->name
,
1257 r
->in
.info
->info1
->comment
,
1259 r
->in
.info
->info1
->type
,
1263 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1270 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1271 r
->in
.share_name
, r
->in
.level
,
1272 r
->in
.info
->info2
->name
,
1273 r
->in
.info
->info2
->path
,
1274 r
->in
.info
->info2
->comment
,
1275 r
->in
.info
->info2
->password
,
1276 r
->in
.info
->info2
->type
,
1277 r
->in
.info
->info2
->max_users
,
1280 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1287 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1288 r
->in
.share_name
, r
->in
.level
,
1289 r
->in
.info
->info501
->name
,
1291 r
->in
.info
->info501
->comment
,
1293 r
->in
.info
->info501
->type
,
1295 r
->in
.info
->info501
->csc_policy
,
1297 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1304 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1305 r
->in
.share_name
, r
->in
.level
,
1306 r
->in
.info
->info502
->name
,
1307 r
->in
.info
->info502
->path
,
1308 r
->in
.info
->info502
->comment
,
1309 r
->in
.info
->info502
->password
,
1310 r
->in
.info
->info502
->type
,
1311 r
->in
.info
->info502
->max_users
,
1313 r
->in
.info
->info502
->sd_buf
.sd
);
1314 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1321 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1322 r
->in
.share_name
, r
->in
.level
,
1325 r
->in
.info
->info1004
->comment
,
1331 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1338 /* r->in.info.dfs_flags; */
1340 if (r
->in
.parm_error
) {
1341 r
->out
.parm_error
= r
->in
.parm_error
;
1347 return WERR_UNKNOWN_LEVEL
;
1350 nterr
= share_set(sctx
, r
->in
.share_name
, info
, count
);
1351 if (!NT_STATUS_IS_OK(nterr
)) {
1352 return ntstatus_to_werror(nterr
);
1355 if (r
->in
.parm_error
) {
1356 r
->out
.parm_error
= r
->in
.parm_error
;
1364 srvsvc_NetShareDelSticky
1366 static WERROR
dcesrv_srvsvc_NetShareDelSticky(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1367 struct srvsvc_NetShareDelSticky
*r
)
1369 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1374 srvsvc_NetShareCheck
1376 static WERROR
dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1377 struct srvsvc_NetShareCheck
*r
)
1380 struct share_context
*sctx
= NULL
;
1381 struct share_config
*scfg
= NULL
;
1389 /* TODO: - access check
1392 if (strcmp("", r
->in
.device_name
) == 0) {
1393 *r
->out
.type
= STYPE_IPC
;
1397 /* copy the path skipping C:\ */
1398 if (strncasecmp(r
->in
.device_name
, "C:", 2) == 0) {
1399 device
= talloc_strdup(mem_ctx
, &r
->in
.device_name
[2]);
1401 /* no chance we have a share that doesn't start with C:\ */
1402 return WERR_DEVICE_NOT_SHARED
;
1404 all_string_sub(device
, "\\", "/", 0);
1406 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
);
1407 if (!NT_STATUS_IS_OK(nterr
)) {
1408 return ntstatus_to_werror(nterr
);
1411 nterr
= share_list_all(mem_ctx
, sctx
, &count
, &names
);
1412 if (!NT_STATUS_IS_OK(nterr
)) {
1413 return ntstatus_to_werror(nterr
);
1416 for (i
= 0; i
< count
; i
++) {
1420 nterr
= share_get_config(mem_ctx
, sctx
, names
[i
], &scfg
);
1421 if (!NT_STATUS_IS_OK(nterr
)) {
1422 return ntstatus_to_werror(nterr
);
1424 path
= share_string_option(scfg
, SHARE_PATH
, NULL
);
1425 if (!path
) continue;
1427 if (strcmp(device
, path
) == 0) {
1428 type
= share_string_option(scfg
, SHARE_TYPE
, NULL
);
1429 if (!type
) continue;
1431 if (strcmp(type
, "DISK") == 0) {
1432 *r
->out
.type
= STYPE_DISKTREE
;
1436 if (strcmp(type
, "IPC") == 0) {
1437 *r
->out
.type
= STYPE_IPC
;
1441 if (strcmp(type
, "PRINTER") == 0) {
1442 *r
->out
.type
= STYPE_PRINTQ
;
1448 return WERR_DEVICE_NOT_SHARED
;
1453 srvsvc_NetSrvGetInfo
1455 static WERROR
dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1456 struct srvsvc_NetSrvGetInfo
*r
)
1458 struct dcesrv_context
*dce_ctx
= dce_call
->conn
->dce_ctx
;
1459 struct dcerpc_server_info
*server_info
= lp_dcerpc_server_info(mem_ctx
, dce_ctx
->lp_ctx
);
1461 ZERO_STRUCTP(r
->out
.info
);
1463 switch (r
->in
.level
) {
1466 struct srvsvc_NetSrvInfo100
*info100
;
1468 info100
= talloc(mem_ctx
, struct srvsvc_NetSrvInfo100
);
1469 W_ERROR_HAVE_NO_MEMORY(info100
);
1471 info100
->platform_id
= dcesrv_common_get_platform_id(mem_ctx
, dce_ctx
);
1472 info100
->server_name
= dcesrv_common_get_server_name(mem_ctx
, dce_ctx
, r
->in
.server_unc
);
1473 W_ERROR_HAVE_NO_MEMORY(info100
->server_name
);
1475 r
->out
.info
->info100
= info100
;
1480 struct srvsvc_NetSrvInfo101
*info101
;
1482 info101
= talloc(mem_ctx
, struct srvsvc_NetSrvInfo101
);
1483 W_ERROR_HAVE_NO_MEMORY(info101
);
1485 info101
->platform_id
= dcesrv_common_get_platform_id(mem_ctx
, dce_ctx
);
1486 info101
->server_name
= dcesrv_common_get_server_name(mem_ctx
, dce_ctx
, r
->in
.server_unc
);
1487 W_ERROR_HAVE_NO_MEMORY(info101
->server_name
);
1489 info101
->version_major
= server_info
->version_major
;
1490 info101
->version_minor
= server_info
->version_minor
;
1491 info101
->server_type
= dcesrv_common_get_server_type(mem_ctx
, dce_call
->event_ctx
, dce_ctx
);
1492 info101
->comment
= talloc_strdup(mem_ctx
, lp_serverstring(dce_ctx
->lp_ctx
));
1493 W_ERROR_HAVE_NO_MEMORY(info101
->comment
);
1495 r
->out
.info
->info101
= info101
;
1500 struct srvsvc_NetSrvInfo102
*info102
;
1502 info102
= talloc(mem_ctx
, struct srvsvc_NetSrvInfo102
);
1503 W_ERROR_HAVE_NO_MEMORY(info102
);
1505 info102
->platform_id
= dcesrv_common_get_platform_id(mem_ctx
, dce_ctx
);
1506 info102
->server_name
= dcesrv_common_get_server_name(mem_ctx
, dce_ctx
, r
->in
.server_unc
);
1507 W_ERROR_HAVE_NO_MEMORY(info102
->server_name
);
1509 info102
->version_major
= server_info
->version_major
;
1510 info102
->version_minor
= server_info
->version_minor
;
1511 info102
->server_type
= dcesrv_common_get_server_type(mem_ctx
, dce_call
->event_ctx
, dce_ctx
);
1512 info102
->comment
= talloc_strdup(mem_ctx
, lp_serverstring(dce_ctx
->lp_ctx
));
1513 W_ERROR_HAVE_NO_MEMORY(info102
->comment
);
1515 info102
->users
= dcesrv_common_get_users(mem_ctx
, dce_ctx
);
1516 info102
->disc
= dcesrv_common_get_disc(mem_ctx
, dce_ctx
);
1517 info102
->hidden
= dcesrv_common_get_hidden(mem_ctx
, dce_ctx
);
1518 info102
->announce
= dcesrv_common_get_announce(mem_ctx
, dce_ctx
);
1519 info102
->anndelta
= dcesrv_common_get_anndelta(mem_ctx
, dce_ctx
);
1520 info102
->licenses
= dcesrv_common_get_licenses(mem_ctx
, dce_ctx
);
1521 info102
->userpath
= dcesrv_common_get_userpath(mem_ctx
, dce_ctx
);
1522 W_ERROR_HAVE_NO_MEMORY(info102
->userpath
);
1524 r
->out
.info
->info102
= info102
;
1528 return WERR_UNKNOWN_LEVEL
;
1531 return WERR_UNKNOWN_LEVEL
;
1536 srvsvc_NetSrvSetInfo
1538 static WERROR
dcesrv_srvsvc_NetSrvSetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1539 struct srvsvc_NetSrvSetInfo
*r
)
1541 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1548 static WERROR
dcesrv_srvsvc_NetDiskEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1549 struct srvsvc_NetDiskEnum
*r
)
1551 r
->out
.info
->disks
= NULL
;
1552 r
->out
.info
->count
= 0;
1553 *r
->out
.totalentries
= 0;
1555 switch (r
->in
.level
) {
1558 /* we can safely hardcode the reply and report we have only one disk (C:) */
1559 /* for some reason Windows wants 2 entries with the second being empty */
1560 r
->out
.info
->disks
= talloc_array(mem_ctx
, struct srvsvc_NetDiskInfo0
, 2);
1561 W_ERROR_HAVE_NO_MEMORY(r
->out
.info
->disks
);
1562 r
->out
.info
->count
= 2;
1564 r
->out
.info
->disks
[0].disk
= talloc_strdup(mem_ctx
, "C:");
1565 W_ERROR_HAVE_NO_MEMORY(r
->out
.info
->disks
[0].disk
);
1567 r
->out
.info
->disks
[1].disk
= talloc_strdup(mem_ctx
, "");
1568 W_ERROR_HAVE_NO_MEMORY(r
->out
.info
->disks
[1].disk
);
1570 *r
->out
.totalentries
= 1;
1571 r
->out
.resume_handle
= r
->in
.resume_handle
;
1576 return WERR_UNKNOWN_LEVEL
;
1579 return WERR_UNKNOWN_LEVEL
;
1584 srvsvc_NetServerStatisticsGet
1586 static WERROR
dcesrv_srvsvc_NetServerStatisticsGet(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1587 struct srvsvc_NetServerStatisticsGet
*r
)
1589 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1594 srvsvc_NetTransportAdd
1596 static WERROR
dcesrv_srvsvc_NetTransportAdd(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1597 struct srvsvc_NetTransportAdd
*r
)
1599 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1604 srvsvc_NetTransportEnum
1606 static WERROR
dcesrv_srvsvc_NetTransportEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1607 struct srvsvc_NetTransportEnum
*r
)
1609 r
->out
.transports
->level
= r
->in
.transports
->level
;
1610 *r
->out
.totalentries
= 0;
1611 if (r
->out
.resume_handle
) {
1612 *r
->out
.resume_handle
= 0;
1615 switch (r
->in
.transports
->level
) {
1618 r
->out
.transports
->ctr
.ctr0
= talloc(mem_ctx
, struct srvsvc_NetTransportCtr0
);
1619 W_ERROR_HAVE_NO_MEMORY(r
->out
.transports
->ctr
.ctr0
);
1621 r
->out
.transports
->ctr
.ctr0
->count
= 0;
1622 r
->out
.transports
->ctr
.ctr0
->array
= NULL
;
1624 return WERR_NOT_SUPPORTED
;
1628 r
->out
.transports
->ctr
.ctr1
= talloc(mem_ctx
, struct srvsvc_NetTransportCtr1
);
1629 W_ERROR_HAVE_NO_MEMORY(r
->out
.transports
->ctr
.ctr1
);
1631 r
->out
.transports
->ctr
.ctr1
->count
= 0;
1632 r
->out
.transports
->ctr
.ctr1
->array
= NULL
;
1634 return WERR_NOT_SUPPORTED
;
1638 r
->out
.transports
->ctr
.ctr2
= talloc(mem_ctx
, struct srvsvc_NetTransportCtr2
);
1639 W_ERROR_HAVE_NO_MEMORY(r
->out
.transports
->ctr
.ctr2
);
1641 r
->out
.transports
->ctr
.ctr2
->count
= 0;
1642 r
->out
.transports
->ctr
.ctr2
->array
= NULL
;
1644 return WERR_NOT_SUPPORTED
;
1648 r
->out
.transports
->ctr
.ctr3
= talloc(mem_ctx
, struct srvsvc_NetTransportCtr3
);
1649 W_ERROR_HAVE_NO_MEMORY(r
->out
.transports
->ctr
.ctr3
);
1651 r
->out
.transports
->ctr
.ctr3
->count
= 0;
1652 r
->out
.transports
->ctr
.ctr3
->array
= NULL
;
1654 return WERR_NOT_SUPPORTED
;
1657 return WERR_UNKNOWN_LEVEL
;
1660 return WERR_UNKNOWN_LEVEL
;
1664 srvsvc_NetTransportDel
1666 static WERROR
dcesrv_srvsvc_NetTransportDel(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1667 struct srvsvc_NetTransportDel
*r
)
1669 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1676 static WERROR
dcesrv_srvsvc_NetRemoteTOD(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1677 struct srvsvc_NetRemoteTOD
*r
)
1679 struct timeval tval
;
1682 struct srvsvc_NetRemoteTODInfo
*info
;
1684 info
= talloc(mem_ctx
, struct srvsvc_NetRemoteTODInfo
);
1685 W_ERROR_HAVE_NO_MEMORY(info
);
1687 GetTimeOfDay(&tval
);
1693 /* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
1694 info
->msecs
= (tm
.tm_hour
*60*60*1000)
1695 + (tm
.tm_min
*60*1000)
1697 + (tval
.tv_usec
/1000);
1698 info
->hours
= tm
.tm_hour
;
1699 info
->mins
= tm
.tm_min
;
1700 info
->secs
= tm
.tm_sec
;
1701 info
->hunds
= tval
.tv_usec
/10000;
1702 info
->timezone
= get_time_zone(t
)/60;
1703 info
->tinterval
= 310; /* just return the same as windows */
1704 info
->day
= tm
.tm_mday
;
1705 info
->month
= tm
.tm_mon
+ 1;
1706 info
->year
= tm
.tm_year
+ 1900;
1707 info
->weekday
= tm
.tm_wday
;
1709 *r
->out
.info
= info
;
1717 static WERROR
dcesrv_srvsvc_NetPathType(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1718 struct srvsvc_NetPathType
*r
)
1720 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1725 srvsvc_NetPathCanonicalize
1727 static WERROR
dcesrv_srvsvc_NetPathCanonicalize(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1728 struct srvsvc_NetPathCanonicalize
*r
)
1730 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1735 srvsvc_NetPathCompare
1737 static WERROR
dcesrv_srvsvc_NetPathCompare(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1738 struct srvsvc_NetPathCompare
*r
)
1740 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1745 srvsvc_NetNameValidate
1747 static WERROR
dcesrv_srvsvc_NetNameValidate(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1748 struct srvsvc_NetNameValidate
*r
)
1752 if ((r
->in
.flags
!= 0x0) && (r
->in
.flags
!= 0x80000000)) {
1753 return WERR_INVALID_NAME
;
1756 switch (r
->in
.name_type
) {
1765 return WERR_NOT_SUPPORTED
;
1767 case 9: /* validate share name */
1769 len
= strlen_m(r
->in
.name
);
1770 if ((r
->in
.flags
== 0x0) && (len
> 81)) {
1771 return WERR_INVALID_NAME
;
1773 if ((r
->in
.flags
== 0x80000000) && (len
> 13)) {
1774 return WERR_INVALID_NAME
;
1776 if (! dcesrv_common_validate_share_name(mem_ctx
, r
->in
.name
)) {
1777 return WERR_INVALID_NAME
;
1785 return WERR_NOT_SUPPORTED
;
1787 return WERR_INVALID_PARAM
;
1790 return WERR_INVALID_PARAM
;
1795 srvsvc_NetPRNameCompare
1797 static WERROR
dcesrv_srvsvc_NetPRNameCompare(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1798 struct srvsvc_NetPRNameCompare
*r
)
1800 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1807 static WERROR
dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1808 struct srvsvc_NetShareEnum
*r
)
1812 const char **snames
;
1813 struct share_context
*sctx
;
1814 struct share_config
*scfg
;
1815 struct dcesrv_context
*dce_ctx
= dce_call
->conn
->dce_ctx
;
1817 *r
->out
.totalentries
= 0;
1819 /* TODO: - paging of results
1822 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
);
1823 if (!NT_STATUS_IS_OK(nterr
)) {
1824 return ntstatus_to_werror(nterr
);
1827 nterr
= share_list_all(mem_ctx
, sctx
, &numshares
, &snames
);
1828 if (!NT_STATUS_IS_OK(nterr
)) {
1829 return ntstatus_to_werror(nterr
);
1832 switch (r
->in
.info_ctr
->level
) {
1835 unsigned int i
, y
= 0;
1837 struct srvsvc_NetShareCtr0
*ctr0
;
1839 ctr0
= talloc(mem_ctx
, struct srvsvc_NetShareCtr0
);
1840 W_ERROR_HAVE_NO_MEMORY(ctr0
);
1843 ctr0
->count
= count
;
1846 if (ctr0
->count
== 0) {
1847 r
->out
.info_ctr
->ctr
.ctr0
= ctr0
;
1851 ctr0
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo0
, count
);
1852 W_ERROR_HAVE_NO_MEMORY(ctr0
->array
);
1854 for (i
=0; i
< count
; i
++) {
1856 union srvsvc_NetShareInfo info
;
1857 enum srvsvc_ShareType type
;
1859 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
1860 if (!NT_STATUS_IS_OK(nterr
)) {
1861 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
1862 return WERR_GENERAL_FAILURE
;
1865 type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
1866 if (type
& STYPE_HIDDEN
) {
1872 info
.info0
= &ctr0
->array
[y
];
1873 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
1874 W_ERROR_NOT_OK_RETURN(status
);
1878 talloc_free(snames
);
1880 r
->out
.info_ctr
->ctr
.ctr0
= ctr0
;
1881 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr0
->count
;
1887 unsigned int i
, y
= 0;
1889 struct srvsvc_NetShareCtr1
*ctr1
;
1891 ctr1
= talloc(mem_ctx
, struct srvsvc_NetShareCtr1
);
1892 W_ERROR_HAVE_NO_MEMORY(ctr1
);
1895 ctr1
->count
= count
;
1898 if (ctr1
->count
== 0) {
1899 r
->out
.info_ctr
->ctr
.ctr1
= ctr1
;
1903 ctr1
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo1
, count
);
1904 W_ERROR_HAVE_NO_MEMORY(ctr1
->array
);
1906 for (i
=0; i
< count
; i
++) {
1908 union srvsvc_NetShareInfo info
;
1909 enum srvsvc_ShareType type
;
1911 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
1912 if (!NT_STATUS_IS_OK(nterr
)) {
1913 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
1914 return WERR_GENERAL_FAILURE
;
1917 type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
1918 if (type
& STYPE_HIDDEN
) {
1924 info
.info1
= &ctr1
->array
[y
];
1925 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
1926 W_ERROR_NOT_OK_RETURN(status
);
1930 talloc_free(snames
);
1932 r
->out
.info_ctr
->ctr
.ctr1
= ctr1
;
1933 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr1
->count
;
1939 unsigned int i
, y
= 0;
1941 struct srvsvc_NetShareCtr2
*ctr2
;
1943 SRVSVC_CHECK_ADMIN_ACCESS
;
1945 ctr2
= talloc(mem_ctx
, struct srvsvc_NetShareCtr2
);
1946 W_ERROR_HAVE_NO_MEMORY(ctr2
);
1949 ctr2
->count
= count
;
1952 if (ctr2
->count
== 0) {
1953 r
->out
.info_ctr
->ctr
.ctr2
= ctr2
;
1957 ctr2
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo2
, count
);
1958 W_ERROR_HAVE_NO_MEMORY(ctr2
->array
);
1960 for (i
=0; i
< count
; i
++) {
1962 union srvsvc_NetShareInfo info
;
1963 enum srvsvc_ShareType type
;
1965 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
1966 if (!NT_STATUS_IS_OK(nterr
)) {
1967 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
1968 return WERR_GENERAL_FAILURE
;
1971 type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
1972 if (type
& STYPE_HIDDEN
) {
1978 info
.info2
= &ctr2
->array
[y
];
1979 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
1980 W_ERROR_NOT_OK_RETURN(status
);
1984 talloc_free(snames
);
1986 r
->out
.info_ctr
->ctr
.ctr2
= ctr2
;
1987 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr2
->count
;
1993 unsigned int i
, y
= 0;
1995 struct srvsvc_NetShareCtr502
*ctr502
;
1997 SRVSVC_CHECK_ADMIN_ACCESS
;
1999 ctr502
= talloc(mem_ctx
, struct srvsvc_NetShareCtr502
);
2000 W_ERROR_HAVE_NO_MEMORY(ctr502
);
2003 ctr502
->count
= count
;
2004 ctr502
->array
= NULL
;
2006 if (ctr502
->count
== 0) {
2007 r
->out
.info_ctr
->ctr
.ctr502
= ctr502
;
2011 ctr502
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo502
, count
);
2012 W_ERROR_HAVE_NO_MEMORY(ctr502
->array
);
2014 for (i
=0; i
< count
; i
++) {
2016 union srvsvc_NetShareInfo info
;
2017 enum srvsvc_ShareType type
;
2019 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
2020 if (!NT_STATUS_IS_OK(nterr
)) {
2021 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
2022 return WERR_GENERAL_FAILURE
;
2025 type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
2026 if (type
& STYPE_HIDDEN
) {
2032 info
.info502
= &ctr502
->array
[y
];
2033 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
2034 W_ERROR_NOT_OK_RETURN(status
);
2038 talloc_free(snames
);
2040 r
->out
.info_ctr
->ctr
.ctr502
= ctr502
;
2041 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr502
->count
;
2046 return WERR_UNKNOWN_LEVEL
;
2049 return WERR_UNKNOWN_LEVEL
;
2054 srvsvc_NetShareDelStart
2056 static WERROR
dcesrv_srvsvc_NetShareDelStart(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2057 struct srvsvc_NetShareDelStart
*r
)
2059 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2064 srvsvc_NetShareDelCommit
2066 static WERROR
dcesrv_srvsvc_NetShareDelCommit(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2067 struct srvsvc_NetShareDelCommit
*r
)
2069 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2074 srvsvc_NetGetFileSecurity
2076 static WERROR
dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2077 struct srvsvc_NetGetFileSecurity
*r
)
2079 struct sec_desc_buf
*sd_buf
;
2080 struct ntvfs_context
*ntvfs_ctx
= NULL
;
2081 struct ntvfs_request
*ntvfs_req
;
2082 union smb_fileinfo
*io
;
2085 nt_status
= srvsvc_create_ntvfs_context(dce_call
, mem_ctx
, r
->in
.share
, &ntvfs_ctx
);
2086 if (!NT_STATUS_IS_OK(nt_status
)) return ntstatus_to_werror(nt_status
);
2088 ntvfs_req
= ntvfs_request_create(ntvfs_ctx
, mem_ctx
,
2089 dce_call
->conn
->auth_state
.session_info
,
2093 W_ERROR_HAVE_NO_MEMORY(ntvfs_req
);
2095 sd_buf
= talloc(mem_ctx
, struct sec_desc_buf
);
2096 W_ERROR_HAVE_NO_MEMORY(sd_buf
);
2098 io
= talloc(mem_ctx
, union smb_fileinfo
);
2099 W_ERROR_HAVE_NO_MEMORY(io
);
2101 io
->query_secdesc
.level
= RAW_FILEINFO_SEC_DESC
;
2102 io
->query_secdesc
.in
.file
.path
= r
->in
.file
;
2103 io
->query_secdesc
.in
.secinfo_flags
= r
->in
.securityinformation
;
2105 nt_status
= ntvfs_qpathinfo(ntvfs_req
, io
);
2106 if (!NT_STATUS_IS_OK(nt_status
)) return ntstatus_to_werror(nt_status
);
2108 sd_buf
->sd
= io
->query_secdesc
.out
.sd
;
2110 *r
->out
.sd_buf
= sd_buf
;
2116 srvsvc_NetSetFileSecurity
2118 static WERROR
dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2119 struct srvsvc_NetSetFileSecurity
*r
)
2121 struct ntvfs_context
*ntvfs_ctx
;
2122 struct ntvfs_request
*ntvfs_req
;
2123 union smb_setfileinfo
*io
;
2126 nt_status
= srvsvc_create_ntvfs_context(dce_call
, mem_ctx
, r
->in
.share
, &ntvfs_ctx
);
2127 if (!NT_STATUS_IS_OK(nt_status
)) return ntstatus_to_werror(nt_status
);
2129 ntvfs_req
= ntvfs_request_create(ntvfs_ctx
, mem_ctx
,
2130 dce_call
->conn
->auth_state
.session_info
,
2134 W_ERROR_HAVE_NO_MEMORY(ntvfs_req
);
2136 io
= talloc(mem_ctx
, union smb_setfileinfo
);
2137 W_ERROR_HAVE_NO_MEMORY(io
);
2139 io
->set_secdesc
.level
= RAW_FILEINFO_SEC_DESC
;
2140 io
->set_secdesc
.in
.file
.path
= r
->in
.file
;
2141 io
->set_secdesc
.in
.secinfo_flags
= r
->in
.securityinformation
;
2142 io
->set_secdesc
.in
.sd
= r
->in
.sd_buf
->sd
;
2144 nt_status
= ntvfs_setpathinfo(ntvfs_req
, io
);
2145 if (!NT_STATUS_IS_OK(nt_status
)) return ntstatus_to_werror(nt_status
);
2152 srvsvc_NetServerTransportAddEx
2154 static WERROR
dcesrv_srvsvc_NetServerTransportAddEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2155 struct srvsvc_NetServerTransportAddEx
*r
)
2157 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2162 srvsvc_NetServerSetServiceBitsEx
2164 static WERROR
dcesrv_srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2165 struct srvsvc_NetServerSetServiceBitsEx
*r
)
2167 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2172 srvsvc_NETRDFSGETVERSION
2174 static WERROR
dcesrv_srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2175 struct srvsvc_NETRDFSGETVERSION
*r
)
2177 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2182 srvsvc_NETRDFSCREATELOCALPARTITION
2184 static WERROR
dcesrv_srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2185 struct srvsvc_NETRDFSCREATELOCALPARTITION
*r
)
2187 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2192 srvsvc_NETRDFSDELETELOCALPARTITION
2194 static WERROR
dcesrv_srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2195 struct srvsvc_NETRDFSDELETELOCALPARTITION
*r
)
2197 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2202 srvsvc_NETRDFSSETLOCALVOLUMESTATE
2204 static WERROR
dcesrv_srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2205 struct srvsvc_NETRDFSSETLOCALVOLUMESTATE
*r
)
2207 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2212 srvsvc_NETRDFSSETSERVERINFO
2214 static WERROR
dcesrv_srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2215 struct srvsvc_NETRDFSSETSERVERINFO
*r
)
2217 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2222 srvsvc_NETRDFSCREATEEXITPOINT
2224 static WERROR
dcesrv_srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2225 struct srvsvc_NETRDFSCREATEEXITPOINT
*r
)
2227 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2232 srvsvc_NETRDFSDELETEEXITPOINT
2234 static WERROR
dcesrv_srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2235 struct srvsvc_NETRDFSDELETEEXITPOINT
*r
)
2237 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2242 srvsvc_NETRDFSMODIFYPREFIX
2244 static WERROR
dcesrv_srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2245 struct srvsvc_NETRDFSMODIFYPREFIX
*r
)
2247 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2252 srvsvc_NETRDFSFIXLOCALVOLUME
2254 static WERROR
dcesrv_srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2255 struct srvsvc_NETRDFSFIXLOCALVOLUME
*r
)
2257 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2262 srvsvc_NETRDFSMANAGERREPORTSITEINFO
2264 static WERROR
dcesrv_srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2265 struct srvsvc_NETRDFSMANAGERREPORTSITEINFO
*r
)
2267 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2272 srvsvc_NETRSERVERTRANSPORTDELEX
2274 static WERROR
dcesrv_srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2275 struct srvsvc_NETRSERVERTRANSPORTDELEX
*r
)
2277 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2283 static WERROR
dcesrv_srvsvc_NetShareDel(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2284 struct srvsvc_NetShareDel
*r
)
2287 struct share_context
*sctx
;
2289 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
);
2290 if (!NT_STATUS_IS_OK(nterr
)) {
2291 return ntstatus_to_werror(nterr
);
2294 nterr
= share_remove(sctx
, r
->in
.share_name
);
2295 if (!NT_STATUS_IS_OK(nterr
)) {
2296 return ntstatus_to_werror(nterr
);
2303 srvsvc_NetSetServiceBits
2305 static WERROR
dcesrv_srvsvc_NetSetServiceBits(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2306 struct srvsvc_NetSetServiceBits
*r
)
2308 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2312 srvsvc_NETRPRNAMECANONICALIZE
2314 static WERROR
dcesrv_srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2315 struct srvsvc_NETRPRNAMECANONICALIZE
*r
)
2317 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2320 /* include the generated boilerplate */
2321 #include "librpc/gen_ndr/ndr_srvsvc_s.c"