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 "rpc_server/common/share.h"
28 #include "auth/auth.h"
29 #include "libcli/security/security.h"
30 #include "system/time.h"
31 #include "rpc_server/srvsvc/proto.h"
32 #include "param/param.h"
34 #define SRVSVC_CHECK_ADMIN_ACCESS do { \
35 struct security_token *t = dce_call->conn->auth_state.session_info->security_token; \
36 if (!security_token_has_builtin_administrators(t) && \
37 !security_token_has_sid(t, &global_sid_Builtin_Server_Operators)) { \
38 return WERR_ACCESS_DENIED; \
45 static WERROR
dcesrv_srvsvc_NetCharDevEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
46 struct srvsvc_NetCharDevEnum
*r
)
48 *r
->out
.totalentries
= 0;
50 switch (r
->in
.info_ctr
->level
) {
52 r
->out
.info_ctr
->ctr
.ctr0
= talloc(mem_ctx
, struct srvsvc_NetCharDevCtr0
);
53 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr0
);
55 r
->out
.info_ctr
->ctr
.ctr0
->count
= 0;
56 r
->out
.info_ctr
->ctr
.ctr0
->array
= NULL
;
58 return WERR_NOT_SUPPORTED
;
61 r
->out
.info_ctr
->ctr
.ctr1
= talloc(mem_ctx
, struct srvsvc_NetCharDevCtr1
);
62 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr1
);
64 r
->out
.info_ctr
->ctr
.ctr1
->count
= 0;
65 r
->out
.info_ctr
->ctr
.ctr1
->array
= NULL
;
67 return WERR_NOT_SUPPORTED
;
70 return WERR_UNKNOWN_LEVEL
;
76 srvsvc_NetCharDevGetInfo
78 static WERROR
dcesrv_srvsvc_NetCharDevGetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
79 struct srvsvc_NetCharDevGetInfo
*r
)
81 ZERO_STRUCTP(r
->out
.info
);
83 switch (r
->in
.level
) {
86 return WERR_NOT_SUPPORTED
;
90 return WERR_NOT_SUPPORTED
;
93 return WERR_UNKNOWN_LEVEL
;
99 srvsvc_NetCharDevControl
101 static WERROR
dcesrv_srvsvc_NetCharDevControl(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
102 struct srvsvc_NetCharDevControl
*r
)
104 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
109 srvsvc_NetCharDevQEnum
111 static WERROR
dcesrv_srvsvc_NetCharDevQEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
112 struct srvsvc_NetCharDevQEnum
*r
)
114 *r
->out
.totalentries
= 0;
116 switch (r
->in
.info_ctr
->level
) {
119 r
->out
.info_ctr
->ctr
.ctr0
= talloc(mem_ctx
, struct srvsvc_NetCharDevQCtr0
);
120 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr0
);
122 r
->out
.info_ctr
->ctr
.ctr0
->count
= 0;
123 r
->out
.info_ctr
->ctr
.ctr0
->array
= NULL
;
125 return WERR_NOT_SUPPORTED
;
129 r
->out
.info_ctr
->ctr
.ctr1
= talloc(mem_ctx
, struct srvsvc_NetCharDevQCtr1
);
130 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr1
);
132 r
->out
.info_ctr
->ctr
.ctr1
->count
= 0;
133 r
->out
.info_ctr
->ctr
.ctr1
->array
= NULL
;
135 return WERR_NOT_SUPPORTED
;
138 return WERR_UNKNOWN_LEVEL
;
144 srvsvc_NetCharDevQGetInfo
146 static WERROR
dcesrv_srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
147 struct srvsvc_NetCharDevQGetInfo
*r
)
149 ZERO_STRUCTP(r
->out
.info
);
151 switch (r
->in
.level
) {
154 return WERR_NOT_SUPPORTED
;
158 return WERR_NOT_SUPPORTED
;
161 return WERR_UNKNOWN_LEVEL
;
167 srvsvc_NetCharDevQSetInfo
169 static WERROR
dcesrv_srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
170 struct srvsvc_NetCharDevQSetInfo
*r
)
172 switch (r
->in
.level
) {
175 if (r
->in
.parm_error
) {
176 r
->out
.parm_error
= r
->in
.parm_error
;
178 return WERR_NOT_SUPPORTED
;
182 if (r
->in
.parm_error
) {
183 r
->out
.parm_error
= r
->in
.parm_error
;
185 return WERR_NOT_SUPPORTED
;
188 return WERR_UNKNOWN_LEVEL
;
194 srvsvc_NetCharDevQPurge
196 static WERROR
dcesrv_srvsvc_NetCharDevQPurge(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
197 struct srvsvc_NetCharDevQPurge
*r
)
199 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
204 srvsvc_NetCharDevQPurgeSelf
206 static WERROR
dcesrv_srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
207 struct srvsvc_NetCharDevQPurgeSelf
*r
)
209 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
216 static WERROR
dcesrv_srvsvc_NetConnEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
217 struct srvsvc_NetConnEnum
*r
)
219 *r
->out
.totalentries
= 0;
221 switch (r
->in
.info_ctr
->level
) {
224 r
->out
.info_ctr
->ctr
.ctr0
= talloc(mem_ctx
, struct srvsvc_NetConnCtr0
);
225 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr0
);
227 r
->out
.info_ctr
->ctr
.ctr0
->count
= 0;
228 r
->out
.info_ctr
->ctr
.ctr0
->array
= NULL
;
230 return WERR_NOT_SUPPORTED
;
234 r
->out
.info_ctr
->ctr
.ctr1
= talloc(mem_ctx
, struct srvsvc_NetConnCtr1
);
235 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr1
);
237 r
->out
.info_ctr
->ctr
.ctr1
->count
= 0;
238 r
->out
.info_ctr
->ctr
.ctr1
->array
= NULL
;
240 return WERR_NOT_SUPPORTED
;
243 return WERR_UNKNOWN_LEVEL
;
251 static WERROR
dcesrv_srvsvc_NetFileEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
252 struct srvsvc_NetFileEnum
*r
)
254 *r
->out
.totalentries
= 0;
256 switch (r
->in
.info_ctr
->level
) {
259 r
->out
.info_ctr
->ctr
.ctr2
= talloc(mem_ctx
, struct srvsvc_NetFileCtr2
);
260 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr2
);
262 r
->out
.info_ctr
->ctr
.ctr2
->count
= 0;
263 r
->out
.info_ctr
->ctr
.ctr2
->array
= NULL
;
265 return WERR_NOT_SUPPORTED
;
269 r
->out
.info_ctr
->ctr
.ctr3
= talloc(mem_ctx
, struct srvsvc_NetFileCtr3
);
270 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr3
);
272 r
->out
.info_ctr
->ctr
.ctr3
->count
= 0;
273 r
->out
.info_ctr
->ctr
.ctr3
->array
= NULL
;
275 return WERR_NOT_SUPPORTED
;
278 return WERR_UNKNOWN_LEVEL
;
284 srvsvc_NetFileGetInfo
286 static WERROR
dcesrv_srvsvc_NetFileGetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
287 struct srvsvc_NetFileGetInfo
*r
)
289 ZERO_STRUCTP(r
->out
.info
);
291 switch (r
->in
.level
) {
294 return WERR_NOT_SUPPORTED
;
298 return WERR_NOT_SUPPORTED
;
301 return WERR_UNKNOWN_LEVEL
;
309 static WERROR
dcesrv_srvsvc_NetFileClose(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
310 struct srvsvc_NetFileClose
*r
)
312 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
319 static WERROR
dcesrv_srvsvc_NetSessEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
320 struct srvsvc_NetSessEnum
*r
)
322 *r
->out
.totalentries
= 0;
324 switch (r
->in
.info_ctr
->level
) {
327 r
->out
.info_ctr
->ctr
.ctr0
= talloc(mem_ctx
, struct srvsvc_NetSessCtr0
);
328 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr0
);
330 r
->out
.info_ctr
->ctr
.ctr0
->count
= 0;
331 r
->out
.info_ctr
->ctr
.ctr0
->array
= NULL
;
333 return WERR_NOT_SUPPORTED
;
337 r
->out
.info_ctr
->ctr
.ctr1
= talloc(mem_ctx
, struct srvsvc_NetSessCtr1
);
338 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr1
);
340 r
->out
.info_ctr
->ctr
.ctr1
->count
= 0;
341 r
->out
.info_ctr
->ctr
.ctr1
->array
= NULL
;
343 return WERR_NOT_SUPPORTED
;
347 r
->out
.info_ctr
->ctr
.ctr2
= talloc(mem_ctx
, struct srvsvc_NetSessCtr2
);
348 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr2
);
350 r
->out
.info_ctr
->ctr
.ctr2
->count
= 0;
351 r
->out
.info_ctr
->ctr
.ctr2
->array
= NULL
;
353 return WERR_NOT_SUPPORTED
;
357 r
->out
.info_ctr
->ctr
.ctr10
= talloc(mem_ctx
, struct srvsvc_NetSessCtr10
);
358 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr10
);
360 r
->out
.info_ctr
->ctr
.ctr10
->count
= 0;
361 r
->out
.info_ctr
->ctr
.ctr10
->array
= NULL
;
363 return WERR_NOT_SUPPORTED
;
367 r
->out
.info_ctr
->ctr
.ctr502
= talloc(mem_ctx
, struct srvsvc_NetSessCtr502
);
368 W_ERROR_HAVE_NO_MEMORY(r
->out
.info_ctr
->ctr
.ctr502
);
370 r
->out
.info_ctr
->ctr
.ctr502
->count
= 0;
371 r
->out
.info_ctr
->ctr
.ctr502
->array
= NULL
;
373 return WERR_NOT_SUPPORTED
;
376 return WERR_UNKNOWN_LEVEL
;
384 static WERROR
dcesrv_srvsvc_NetSessDel(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
385 struct srvsvc_NetSessDel
*r
)
387 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
394 static WERROR
dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
395 struct srvsvc_NetShareAdd
*r
)
397 switch (r
->in
.level
) {
400 if (r
->in
.parm_error
) {
401 r
->out
.parm_error
= r
->in
.parm_error
;
403 return WERR_NOT_SUPPORTED
;
407 if (r
->in
.parm_error
) {
408 r
->out
.parm_error
= r
->in
.parm_error
;
410 return WERR_NOT_SUPPORTED
;
415 struct share_info
*info
;
416 struct share_context
*sctx
;
417 unsigned int count
= 8;
420 nterr
= share_get_context_by_name(mem_ctx
, lpcfg_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
421 if (!NT_STATUS_IS_OK(nterr
)) {
422 return ntstatus_to_werror(nterr
);
425 /* there are no more than 8 options in struct srvsvc_NetShareInfo2 */
426 info
= talloc_array(mem_ctx
, struct share_info
, count
);
427 W_ERROR_HAVE_NO_MEMORY(info
);
431 info
[i
].name
= SHARE_TYPE
;
432 info
[i
].type
= SHARE_INFO_STRING
;
433 switch (r
->in
.info
->info2
->type
) {
435 info
[i
].value
= talloc_strdup(info
, "DISK");
438 info
[i
].value
= talloc_strdup(info
, "PRINTER");
441 info
[i
].value
= talloc_strdup(info
, "IPC");
444 return WERR_INVALID_PARAM
;
446 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
449 if (r
->in
.info
->info2
->path
&& r
->in
.info
->info2
->path
[0]) {
450 info
[i
].name
= SHARE_PATH
;
451 info
[i
].type
= SHARE_INFO_STRING
;
453 /* Windows will send a path in a form of C:\example\path */
454 if (r
->in
.info
->info2
->path
[1] == ':') {
455 info
[i
].value
= talloc_strdup(info
, &r
->in
.info
->info2
->path
[2]);
457 /* very strange let's try to set as is */
458 info
[i
].value
= talloc_strdup(info
, r
->in
.info
->info2
->path
);
460 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
461 all_string_sub((char *)info
[i
].value
, "\\", "/", 0);
466 if (r
->in
.info
->info2
->comment
&& r
->in
.info
->info2
->comment
[0]) {
467 info
[i
].name
= SHARE_COMMENT
;
468 info
[i
].type
= SHARE_INFO_STRING
;
469 info
[i
].value
= talloc_strdup(info
, r
->in
.info
->info2
->comment
);
470 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
475 if (r
->in
.info
->info2
->password
&& r
->in
.info
->info2
->password
[0]) {
476 info
[i
].name
= SHARE_PASSWORD
;
477 info
[i
].type
= SHARE_INFO_STRING
;
478 info
[i
].value
= talloc_strdup(info
, r
->in
.info
->info2
->password
);
479 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
484 info
[i
].name
= SHARE_MAX_CONNECTIONS
;
485 info
[i
].type
= SHARE_INFO_INT
;
486 info
[i
].value
= talloc(info
, int);
487 *((int *)info
[i
].value
) = r
->in
.info
->info2
->max_users
;
490 /* TODO: security descriptor */
492 nterr
= share_create(sctx
, r
->in
.info
->info2
->name
, info
, i
);
493 if (!NT_STATUS_IS_OK(nterr
)) {
494 return ntstatus_to_werror(nterr
);
497 if (r
->in
.parm_error
) {
498 r
->out
.parm_error
= r
->in
.parm_error
;
505 if (r
->in
.parm_error
) {
506 r
->out
.parm_error
= r
->in
.parm_error
;
508 return WERR_NOT_SUPPORTED
;
513 struct share_info
*info
;
514 struct share_context
*sctx
;
515 unsigned int count
= 10;
518 nterr
= share_get_context_by_name(mem_ctx
, lpcfg_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
519 if (!NT_STATUS_IS_OK(nterr
)) {
520 return ntstatus_to_werror(nterr
);
523 /* there are no more than 10 options in struct srvsvc_NetShareInfo502 */
524 info
= talloc_array(mem_ctx
, struct share_info
, count
);
525 W_ERROR_HAVE_NO_MEMORY(info
);
529 info
[i
].name
= SHARE_TYPE
;
530 info
[i
].type
= SHARE_INFO_STRING
;
531 switch (r
->in
.info
->info502
->type
) {
533 info
[i
].value
= talloc_strdup(info
, "DISK");
536 info
[i
].value
= talloc_strdup(info
, "PRINTER");
539 info
[i
].value
= talloc_strdup(info
, "IPC");
542 return WERR_INVALID_PARAM
;
544 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
547 if (r
->in
.info
->info502
->path
&& r
->in
.info
->info502
->path
[0]) {
548 info
[i
].name
= SHARE_PATH
;
549 info
[i
].type
= SHARE_INFO_STRING
;
551 /* Windows will send a path in a form of C:\example\path */
552 if (r
->in
.info
->info502
->path
[1] == ':') {
553 info
[i
].value
= talloc_strdup(info
, &r
->in
.info
->info502
->path
[2]);
555 /* very strange let's try to set as is */
556 info
[i
].value
= talloc_strdup(info
, r
->in
.info
->info502
->path
);
558 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
559 all_string_sub((char *)info
[i
].value
, "\\", "/", 0);
564 if (r
->in
.info
->info502
->comment
&& r
->in
.info
->info502
->comment
[0]) {
565 info
[i
].name
= SHARE_COMMENT
;
566 info
[i
].type
= SHARE_INFO_STRING
;
567 info
[i
].value
= talloc_strdup(info
, r
->in
.info
->info502
->comment
);
568 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
573 if (r
->in
.info
->info502
->password
&& r
->in
.info
->info502
->password
[0]) {
574 info
[i
].name
= SHARE_PASSWORD
;
575 info
[i
].type
= SHARE_INFO_STRING
;
576 info
[i
].value
= talloc_strdup(info
, r
->in
.info
->info502
->password
);
577 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
582 info
[i
].name
= SHARE_MAX_CONNECTIONS
;
583 info
[i
].type
= SHARE_INFO_INT
;
584 info
[i
].value
= talloc(info
, int);
585 *((int *)info
[i
].value
) = r
->in
.info
->info502
->max_users
;
588 /* TODO: security descriptor */
590 nterr
= share_create(sctx
, r
->in
.info
->info502
->name
, info
, i
);
591 if (!NT_STATUS_IS_OK(nterr
)) {
592 return ntstatus_to_werror(nterr
);
595 if (r
->in
.parm_error
) {
596 r
->out
.parm_error
= r
->in
.parm_error
;
602 return WERR_UNKNOWN_LEVEL
;
606 static WERROR
dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
607 struct share_config
*scfg
, uint32_t level
,
608 union srvsvc_NetShareInfo
*info
)
610 struct dcesrv_context
*dce_ctx
= dce_call
->conn
->dce_ctx
;
615 info
->info0
->name
= talloc_strdup(mem_ctx
, scfg
->name
);
616 W_ERROR_HAVE_NO_MEMORY(info
->info0
->name
);
622 info
->info1
->name
= talloc_strdup(mem_ctx
, scfg
->name
);
623 W_ERROR_HAVE_NO_MEMORY(info
->info1
->name
);
624 info
->info1
->type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
625 info
->info1
->comment
= talloc_strdup(mem_ctx
, share_string_option(scfg
, SHARE_COMMENT
, ""));
626 W_ERROR_HAVE_NO_MEMORY(info
->info1
->comment
);
632 info
->info2
->name
= talloc_strdup(mem_ctx
, scfg
->name
);
633 W_ERROR_HAVE_NO_MEMORY(info
->info2
->name
);
634 info
->info2
->type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
635 info
->info2
->comment
= talloc_strdup(mem_ctx
, share_string_option(scfg
, SHARE_COMMENT
, ""));
636 W_ERROR_HAVE_NO_MEMORY(info
->info2
->comment
);
637 info
->info2
->permissions
= dcesrv_common_get_share_permissions(mem_ctx
, dce_ctx
, scfg
);
638 info
->info2
->max_users
= share_int_option(scfg
, SHARE_MAX_CONNECTIONS
, SHARE_MAX_CONNECTIONS_DEFAULT
);
639 info
->info2
->current_users
= dcesrv_common_get_share_current_users(mem_ctx
, dce_ctx
, scfg
);
640 info
->info2
->path
= dcesrv_common_get_share_path(mem_ctx
, dce_ctx
, scfg
);
641 W_ERROR_HAVE_NO_MEMORY(info
->info2
->path
);
642 info
->info2
->password
= talloc_strdup(mem_ctx
, share_string_option(scfg
, SHARE_PASSWORD
, NULL
));
648 info
->info501
->name
= talloc_strdup(mem_ctx
, scfg
->name
);
649 W_ERROR_HAVE_NO_MEMORY(info
->info501
->name
);
650 info
->info501
->type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
651 info
->info501
->comment
= talloc_strdup(mem_ctx
, share_string_option(scfg
, SHARE_COMMENT
, ""));
652 W_ERROR_HAVE_NO_MEMORY(info
->info501
->comment
);
653 info
->info501
->csc_policy
= share_int_option(scfg
, SHARE_CSC_POLICY
, SHARE_CSC_POLICY_DEFAULT
);
659 info
->info502
->name
= talloc_strdup(mem_ctx
, scfg
->name
);
660 W_ERROR_HAVE_NO_MEMORY(info
->info502
->name
);
661 info
->info502
->type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
662 info
->info502
->comment
= talloc_strdup(mem_ctx
, share_string_option(scfg
, SHARE_COMMENT
, ""));
663 W_ERROR_HAVE_NO_MEMORY(info
->info502
->comment
);
664 info
->info502
->permissions
= dcesrv_common_get_share_permissions(mem_ctx
, dce_ctx
, scfg
);
665 info
->info502
->max_users
= share_int_option(scfg
, SHARE_MAX_CONNECTIONS
, SHARE_MAX_CONNECTIONS_DEFAULT
);
666 info
->info502
->current_users
= dcesrv_common_get_share_current_users(mem_ctx
, dce_ctx
, scfg
);
667 info
->info502
->path
= dcesrv_common_get_share_path(mem_ctx
, dce_ctx
, scfg
);
668 W_ERROR_HAVE_NO_MEMORY(info
->info502
->path
);
669 info
->info502
->password
= talloc_strdup(mem_ctx
, share_string_option(scfg
, SHARE_PASSWORD
, NULL
));
670 info
->info502
->sd_buf
.sd
= dcesrv_common_get_security_descriptor(mem_ctx
, dce_ctx
, scfg
);
676 info
->info1005
->dfs_flags
= dcesrv_common_get_share_dfs_flags(mem_ctx
, dce_ctx
, scfg
);
681 return WERR_UNKNOWN_LEVEL
;
686 srvsvc_NetShareEnumAll
688 static WERROR
dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
689 struct srvsvc_NetShareEnumAll
*r
)
694 struct share_context
*sctx
;
695 struct share_config
*scfg
;
697 *r
->out
.totalentries
= 0;
699 /* TODO: - paging of results
702 nterr
= share_get_context_by_name(mem_ctx
, lpcfg_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
703 if (!NT_STATUS_IS_OK(nterr
)) {
704 return ntstatus_to_werror(nterr
);
707 nterr
= share_list_all(mem_ctx
, sctx
, &numshares
, &snames
);
708 if (!NT_STATUS_IS_OK(nterr
)) {
709 return ntstatus_to_werror(nterr
);
712 switch (r
->in
.info_ctr
->level
) {
716 struct srvsvc_NetShareCtr0
*ctr0
;
718 ctr0
= talloc(mem_ctx
, struct srvsvc_NetShareCtr0
);
719 W_ERROR_HAVE_NO_MEMORY(ctr0
);
721 ctr0
->count
= numshares
;
724 if (ctr0
->count
== 0) {
725 r
->out
.info_ctr
->ctr
.ctr0
= ctr0
;
729 ctr0
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo0
, ctr0
->count
);
730 W_ERROR_HAVE_NO_MEMORY(ctr0
->array
);
732 for (i
= 0; i
< ctr0
->count
; i
++) {
734 union srvsvc_NetShareInfo info
;
736 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
737 if (!NT_STATUS_IS_OK(nterr
)) {
738 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
739 return WERR_GENERAL_FAILURE
;
741 info
.info0
= &ctr0
->array
[i
];
742 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
743 if (!W_ERROR_IS_OK(status
)) {
750 r
->out
.info_ctr
->ctr
.ctr0
= ctr0
;
751 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr0
->count
;
757 struct srvsvc_NetShareCtr1
*ctr1
;
759 ctr1
= talloc(mem_ctx
, struct srvsvc_NetShareCtr1
);
760 W_ERROR_HAVE_NO_MEMORY(ctr1
);
762 ctr1
->count
= numshares
;
765 if (ctr1
->count
== 0) {
766 r
->out
.info_ctr
->ctr
.ctr1
= ctr1
;
770 ctr1
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo1
, ctr1
->count
);
771 W_ERROR_HAVE_NO_MEMORY(ctr1
->array
);
773 for (i
=0; i
< ctr1
->count
; i
++) {
775 union srvsvc_NetShareInfo info
;
777 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
778 if (!NT_STATUS_IS_OK(nterr
)) {
779 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
780 return WERR_GENERAL_FAILURE
;
782 info
.info1
= &ctr1
->array
[i
];
783 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
784 if (!W_ERROR_IS_OK(status
)) {
791 r
->out
.info_ctr
->ctr
.ctr1
= ctr1
;
792 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr1
->count
;
799 struct srvsvc_NetShareCtr2
*ctr2
;
801 SRVSVC_CHECK_ADMIN_ACCESS
;
803 ctr2
= talloc(mem_ctx
, struct srvsvc_NetShareCtr2
);
804 W_ERROR_HAVE_NO_MEMORY(ctr2
);
806 ctr2
->count
= numshares
;
809 if (ctr2
->count
== 0) {
810 r
->out
.info_ctr
->ctr
.ctr2
= ctr2
;
814 ctr2
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo2
, ctr2
->count
);
815 W_ERROR_HAVE_NO_MEMORY(ctr2
->array
);
817 for (i
=0; i
< ctr2
->count
; i
++) {
819 union srvsvc_NetShareInfo info
;
821 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
822 if (!NT_STATUS_IS_OK(nterr
)) {
823 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
824 return WERR_GENERAL_FAILURE
;
826 info
.info2
= &ctr2
->array
[i
];
827 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
828 if (!W_ERROR_IS_OK(status
)) {
835 r
->out
.info_ctr
->ctr
.ctr2
= ctr2
;
836 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr2
->count
;
843 struct srvsvc_NetShareCtr501
*ctr501
;
845 SRVSVC_CHECK_ADMIN_ACCESS
;
847 ctr501
= talloc(mem_ctx
, struct srvsvc_NetShareCtr501
);
848 W_ERROR_HAVE_NO_MEMORY(ctr501
);
850 ctr501
->count
= numshares
;
851 ctr501
->array
= NULL
;
853 if (ctr501
->count
== 0) {
854 r
->out
.info_ctr
->ctr
.ctr501
= ctr501
;
858 ctr501
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo501
, ctr501
->count
);
859 W_ERROR_HAVE_NO_MEMORY(ctr501
->array
);
861 for (i
=0; i
< ctr501
->count
; i
++) {
863 union srvsvc_NetShareInfo info
;
865 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
866 if (!NT_STATUS_IS_OK(nterr
)) {
867 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
868 return WERR_GENERAL_FAILURE
;
870 info
.info501
= &ctr501
->array
[i
];
871 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
872 if (!W_ERROR_IS_OK(status
)) {
879 r
->out
.info_ctr
->ctr
.ctr501
= ctr501
;
880 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr501
->count
;
887 struct srvsvc_NetShareCtr502
*ctr502
;
889 SRVSVC_CHECK_ADMIN_ACCESS
;
891 ctr502
= talloc(mem_ctx
, struct srvsvc_NetShareCtr502
);
892 W_ERROR_HAVE_NO_MEMORY(ctr502
);
894 ctr502
->count
= numshares
;
895 ctr502
->array
= NULL
;
897 if (ctr502
->count
== 0) {
898 r
->out
.info_ctr
->ctr
.ctr502
= ctr502
;
902 ctr502
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo502
, ctr502
->count
);
903 W_ERROR_HAVE_NO_MEMORY(ctr502
->array
);
905 for (i
=0; i
< ctr502
->count
; i
++) {
907 union srvsvc_NetShareInfo info
;
909 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
910 if (!NT_STATUS_IS_OK(nterr
)) {
911 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
912 return WERR_GENERAL_FAILURE
;
914 info
.info502
= &ctr502
->array
[i
];
915 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
916 if (!W_ERROR_IS_OK(status
)) {
923 r
->out
.info_ctr
->ctr
.ctr502
= ctr502
;
924 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr502
->count
;
929 return WERR_UNKNOWN_LEVEL
;
935 srvsvc_NetShareGetInfo
937 static WERROR
dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
938 struct srvsvc_NetShareGetInfo
*r
)
941 struct share_context
*sctx
= NULL
;
942 struct share_config
*scfg
= NULL
;
944 ZERO_STRUCTP(r
->out
.info
);
946 /* TODO: - access check
949 if (strcmp("", r
->in
.share_name
) == 0) {
950 return WERR_INVALID_PARAM
;
953 nterr
= share_get_context_by_name(mem_ctx
, lpcfg_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
954 if (!NT_STATUS_IS_OK(nterr
)) {
955 return ntstatus_to_werror(nterr
);
958 nterr
= share_get_config(mem_ctx
, sctx
, r
->in
.share_name
, &scfg
);
959 if (!NT_STATUS_IS_OK(nterr
)) {
960 return ntstatus_to_werror(nterr
);
963 switch (r
->in
.level
) {
967 union srvsvc_NetShareInfo info
;
969 info
.info0
= talloc(mem_ctx
, struct srvsvc_NetShareInfo0
);
970 W_ERROR_HAVE_NO_MEMORY(info
.info0
);
972 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.level
, &info
);
973 if (!W_ERROR_IS_OK(status
)) {
977 r
->out
.info
->info0
= info
.info0
;
983 union srvsvc_NetShareInfo info
;
985 info
.info1
= talloc(mem_ctx
, struct srvsvc_NetShareInfo1
);
986 W_ERROR_HAVE_NO_MEMORY(info
.info1
);
988 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.level
, &info
);
989 if (!W_ERROR_IS_OK(status
)) {
993 r
->out
.info
->info1
= info
.info1
;
999 union srvsvc_NetShareInfo info
;
1001 SRVSVC_CHECK_ADMIN_ACCESS
;
1003 info
.info2
= talloc(mem_ctx
, struct srvsvc_NetShareInfo2
);
1004 W_ERROR_HAVE_NO_MEMORY(info
.info2
);
1006 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.level
, &info
);
1007 if (!W_ERROR_IS_OK(status
)) {
1011 r
->out
.info
->info2
= info
.info2
;
1017 union srvsvc_NetShareInfo info
;
1019 info
.info501
= talloc(mem_ctx
, struct srvsvc_NetShareInfo501
);
1020 W_ERROR_HAVE_NO_MEMORY(info
.info501
);
1022 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.level
, &info
);
1023 if (!W_ERROR_IS_OK(status
)) {
1027 r
->out
.info
->info501
= info
.info501
;
1033 union srvsvc_NetShareInfo info
;
1035 SRVSVC_CHECK_ADMIN_ACCESS
;
1037 info
.info502
= talloc(mem_ctx
, struct srvsvc_NetShareInfo502
);
1038 W_ERROR_HAVE_NO_MEMORY(info
.info502
);
1040 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.level
, &info
);
1041 if (!W_ERROR_IS_OK(status
)) {
1045 r
->out
.info
->info502
= info
.info502
;
1051 union srvsvc_NetShareInfo info
;
1053 info
.info1005
= talloc(mem_ctx
, struct srvsvc_NetShareInfo1005
);
1054 W_ERROR_HAVE_NO_MEMORY(info
.info1005
);
1056 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.level
, &info
);
1057 if (!W_ERROR_IS_OK(status
)) {
1061 r
->out
.info
->info1005
= info
.info1005
;
1065 return WERR_UNKNOWN_LEVEL
;
1069 static WERROR
dcesrv_srvsvc_fill_share_info(struct share_info
*info
, int *count
,
1070 const char *share_name
, int level
,
1073 const char *comment
,
1074 const char *password
,
1075 enum srvsvc_ShareType type
,
1077 uint32_t csc_policy
,
1078 struct security_descriptor
*sd
)
1083 info
[i
].name
= SHARE_CSC_POLICY
;
1084 info
[i
].type
= SHARE_INFO_INT
;
1085 info
[i
].value
= talloc(info
, int);
1086 *((int *)info
[i
].value
) = csc_policy
;
1093 /* TODO: check if unknown is csc_policy */
1095 /* TODO: security descriptor */
1098 if (path
&& path
[0]) {
1099 info
[i
].name
= SHARE_PATH
;
1100 info
[i
].type
= SHARE_INFO_STRING
;
1102 /* Windows will send a path in a form of C:\example\path */
1103 if (path
[1] == ':') {
1104 info
[i
].value
= talloc_strdup(info
, &path
[2]);
1106 /* very strange let's try to set as is */
1107 info
[i
].value
= talloc_strdup(info
, path
);
1109 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
1110 all_string_sub((char *)info
[i
].value
, "\\", "/", 0);
1115 if (password
&& password
[0]) {
1116 info
[i
].name
= SHARE_PASSWORD
;
1117 info
[i
].type
= SHARE_INFO_STRING
;
1118 info
[i
].value
= talloc_strdup(info
, password
);
1119 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
1124 info
[i
].name
= SHARE_MAX_CONNECTIONS
;
1125 info
[i
].type
= SHARE_INFO_INT
;
1126 info
[i
].value
= talloc(info
, int);
1127 *((int *)info
[i
].value
) = max_users
;
1132 info
[i
].name
= SHARE_TYPE
;
1133 info
[i
].type
= SHARE_INFO_STRING
;
1136 info
[i
].value
= talloc_strdup(info
, "DISK");
1139 info
[i
].value
= talloc_strdup(info
, "PRINTER");
1142 info
[i
].value
= talloc_strdup(info
, "IPC");
1145 return WERR_INVALID_PARAM
;
1147 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
1152 info
[i
].name
= SHARE_COMMENT
;
1153 info
[i
].type
= SHARE_INFO_STRING
;
1154 info
[i
].value
= talloc_strdup(info
, comment
);
1155 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
1161 strcasecmp(share_name
, name
) != 0) {
1162 info
[i
].name
= SHARE_NAME
;
1163 info
[i
].type
= SHARE_INFO_STRING
;
1164 info
[i
].value
= talloc_strdup(info
, name
);
1165 W_ERROR_HAVE_NO_MEMORY(info
[i
].value
);
1172 return WERR_UNKNOWN_LEVEL
;
1181 srvsvc_NetShareSetInfo
1183 static WERROR
dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1184 struct srvsvc_NetShareSetInfo
*r
)
1188 struct share_context
*sctx
= NULL
;
1189 struct share_info
*info
;
1192 /* TODO: - access check
1195 /* there are no more than 10 options in all struct srvsvc_NetShareInfoXXX */
1196 info
= talloc_array(mem_ctx
, struct share_info
, 10);
1197 W_ERROR_HAVE_NO_MEMORY(info
);
1199 if (strcmp("", r
->in
.share_name
) == 0) {
1200 return WERR_INVALID_PARAM
;
1203 nterr
= share_get_context_by_name(mem_ctx
, lpcfg_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
1204 if (!NT_STATUS_IS_OK(nterr
)) {
1205 return ntstatus_to_werror(nterr
);
1208 switch (r
->in
.level
) {
1211 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1212 r
->in
.share_name
, r
->in
.level
,
1213 r
->in
.info
->info0
->name
,
1221 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1228 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1229 r
->in
.share_name
, r
->in
.level
,
1230 r
->in
.info
->info1
->name
,
1232 r
->in
.info
->info1
->comment
,
1234 r
->in
.info
->info1
->type
,
1238 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1245 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1246 r
->in
.share_name
, r
->in
.level
,
1247 r
->in
.info
->info2
->name
,
1248 r
->in
.info
->info2
->path
,
1249 r
->in
.info
->info2
->comment
,
1250 r
->in
.info
->info2
->password
,
1251 r
->in
.info
->info2
->type
,
1252 r
->in
.info
->info2
->max_users
,
1255 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1262 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1263 r
->in
.share_name
, r
->in
.level
,
1264 r
->in
.info
->info501
->name
,
1266 r
->in
.info
->info501
->comment
,
1268 r
->in
.info
->info501
->type
,
1270 r
->in
.info
->info501
->csc_policy
,
1272 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1279 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1280 r
->in
.share_name
, r
->in
.level
,
1281 r
->in
.info
->info502
->name
,
1282 r
->in
.info
->info502
->path
,
1283 r
->in
.info
->info502
->comment
,
1284 r
->in
.info
->info502
->password
,
1285 r
->in
.info
->info502
->type
,
1286 r
->in
.info
->info502
->max_users
,
1288 r
->in
.info
->info502
->sd_buf
.sd
);
1289 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1296 status
= dcesrv_srvsvc_fill_share_info(info
, &count
,
1297 r
->in
.share_name
, r
->in
.level
,
1300 r
->in
.info
->info1004
->comment
,
1306 if (!W_ERROR_EQUAL(status
, WERR_OK
)) {
1313 /* r->in.info.dfs_flags; */
1315 if (r
->in
.parm_error
) {
1316 r
->out
.parm_error
= r
->in
.parm_error
;
1322 return WERR_UNKNOWN_LEVEL
;
1325 nterr
= share_set(sctx
, r
->in
.share_name
, info
, count
);
1326 if (!NT_STATUS_IS_OK(nterr
)) {
1327 return ntstatus_to_werror(nterr
);
1330 if (r
->in
.parm_error
) {
1331 r
->out
.parm_error
= r
->in
.parm_error
;
1339 srvsvc_NetShareDelSticky
1341 static WERROR
dcesrv_srvsvc_NetShareDelSticky(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1342 struct srvsvc_NetShareDelSticky
*r
)
1344 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1349 srvsvc_NetShareCheck
1351 static WERROR
dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1352 struct srvsvc_NetShareCheck
*r
)
1355 struct share_context
*sctx
= NULL
;
1356 struct share_config
*scfg
= NULL
;
1364 /* TODO: - access check
1367 if (strcmp("", r
->in
.device_name
) == 0) {
1368 *r
->out
.type
= STYPE_IPC
;
1372 /* copy the path skipping C:\ */
1373 if (strncasecmp(r
->in
.device_name
, "C:", 2) == 0) {
1374 device
= talloc_strdup(mem_ctx
, &r
->in
.device_name
[2]);
1376 /* no chance we have a share that doesn't start with C:\ */
1377 return WERR_DEVICE_NOT_SHARED
;
1379 all_string_sub(device
, "\\", "/", 0);
1381 nterr
= share_get_context_by_name(mem_ctx
, lpcfg_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
1382 if (!NT_STATUS_IS_OK(nterr
)) {
1383 return ntstatus_to_werror(nterr
);
1386 nterr
= share_list_all(mem_ctx
, sctx
, &count
, &names
);
1387 if (!NT_STATUS_IS_OK(nterr
)) {
1388 return ntstatus_to_werror(nterr
);
1391 for (i
= 0; i
< count
; i
++) {
1395 nterr
= share_get_config(mem_ctx
, sctx
, names
[i
], &scfg
);
1396 if (!NT_STATUS_IS_OK(nterr
)) {
1397 return ntstatus_to_werror(nterr
);
1399 path
= share_string_option(scfg
, SHARE_PATH
, NULL
);
1400 if (!path
) continue;
1402 if (strcmp(device
, path
) == 0) {
1403 type
= share_string_option(scfg
, SHARE_TYPE
, NULL
);
1404 if (!type
) continue;
1406 if (strcmp(type
, "DISK") == 0) {
1407 *r
->out
.type
= STYPE_DISKTREE
;
1411 if (strcmp(type
, "IPC") == 0) {
1412 *r
->out
.type
= STYPE_IPC
;
1416 if (strcmp(type
, "PRINTER") == 0) {
1417 *r
->out
.type
= STYPE_PRINTQ
;
1423 return WERR_DEVICE_NOT_SHARED
;
1428 srvsvc_NetSrvGetInfo
1430 static WERROR
dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1431 struct srvsvc_NetSrvGetInfo
*r
)
1433 struct dcesrv_context
*dce_ctx
= dce_call
->conn
->dce_ctx
;
1434 struct dcerpc_server_info
*server_info
= lpcfg_dcerpc_server_info(mem_ctx
, dce_ctx
->lp_ctx
);
1436 ZERO_STRUCTP(r
->out
.info
);
1438 switch (r
->in
.level
) {
1441 struct srvsvc_NetSrvInfo100
*info100
;
1443 info100
= talloc(mem_ctx
, struct srvsvc_NetSrvInfo100
);
1444 W_ERROR_HAVE_NO_MEMORY(info100
);
1446 info100
->platform_id
= dcesrv_common_get_platform_id(mem_ctx
, dce_ctx
);
1447 info100
->server_name
= dcesrv_common_get_server_name(mem_ctx
, dce_ctx
, r
->in
.server_unc
);
1448 W_ERROR_HAVE_NO_MEMORY(info100
->server_name
);
1450 r
->out
.info
->info100
= info100
;
1455 struct srvsvc_NetSrvInfo101
*info101
;
1457 info101
= talloc(mem_ctx
, struct srvsvc_NetSrvInfo101
);
1458 W_ERROR_HAVE_NO_MEMORY(info101
);
1460 info101
->platform_id
= dcesrv_common_get_platform_id(mem_ctx
, dce_ctx
);
1461 info101
->server_name
= dcesrv_common_get_server_name(mem_ctx
, dce_ctx
, r
->in
.server_unc
);
1462 W_ERROR_HAVE_NO_MEMORY(info101
->server_name
);
1464 info101
->version_major
= server_info
->version_major
;
1465 info101
->version_minor
= server_info
->version_minor
;
1466 info101
->server_type
= dcesrv_common_get_server_type(mem_ctx
, dce_call
->event_ctx
, dce_ctx
);
1467 info101
->comment
= talloc_strdup(mem_ctx
, lpcfg_serverstring(dce_ctx
->lp_ctx
));
1468 W_ERROR_HAVE_NO_MEMORY(info101
->comment
);
1470 r
->out
.info
->info101
= info101
;
1475 struct srvsvc_NetSrvInfo102
*info102
;
1477 info102
= talloc(mem_ctx
, struct srvsvc_NetSrvInfo102
);
1478 W_ERROR_HAVE_NO_MEMORY(info102
);
1480 info102
->platform_id
= dcesrv_common_get_platform_id(mem_ctx
, dce_ctx
);
1481 info102
->server_name
= dcesrv_common_get_server_name(mem_ctx
, dce_ctx
, r
->in
.server_unc
);
1482 W_ERROR_HAVE_NO_MEMORY(info102
->server_name
);
1484 info102
->version_major
= server_info
->version_major
;
1485 info102
->version_minor
= server_info
->version_minor
;
1486 info102
->server_type
= dcesrv_common_get_server_type(mem_ctx
, dce_call
->event_ctx
, dce_ctx
);
1487 info102
->comment
= talloc_strdup(mem_ctx
, lpcfg_serverstring(dce_ctx
->lp_ctx
));
1488 W_ERROR_HAVE_NO_MEMORY(info102
->comment
);
1490 info102
->users
= dcesrv_common_get_users(mem_ctx
, dce_ctx
);
1491 info102
->disc
= dcesrv_common_get_disc(mem_ctx
, dce_ctx
);
1492 info102
->hidden
= dcesrv_common_get_hidden(mem_ctx
, dce_ctx
);
1493 info102
->announce
= dcesrv_common_get_announce(mem_ctx
, dce_ctx
);
1494 info102
->anndelta
= dcesrv_common_get_anndelta(mem_ctx
, dce_ctx
);
1495 info102
->licenses
= dcesrv_common_get_licenses(mem_ctx
, dce_ctx
);
1496 info102
->userpath
= dcesrv_common_get_userpath(mem_ctx
, dce_ctx
);
1497 W_ERROR_HAVE_NO_MEMORY(info102
->userpath
);
1499 r
->out
.info
->info102
= info102
;
1503 return WERR_UNKNOWN_LEVEL
;
1509 srvsvc_NetSrvSetInfo
1511 static WERROR
dcesrv_srvsvc_NetSrvSetInfo(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1512 struct srvsvc_NetSrvSetInfo
*r
)
1514 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1521 static WERROR
dcesrv_srvsvc_NetDiskEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1522 struct srvsvc_NetDiskEnum
*r
)
1524 r
->out
.info
->disks
= NULL
;
1525 r
->out
.info
->count
= 0;
1526 *r
->out
.totalentries
= 0;
1528 switch (r
->in
.level
) {
1531 /* we can safely hardcode the reply and report we have only one disk (C:) */
1532 /* for some reason Windows wants 2 entries with the second being empty */
1533 r
->out
.info
->disks
= talloc_array(mem_ctx
, struct srvsvc_NetDiskInfo0
, 2);
1534 W_ERROR_HAVE_NO_MEMORY(r
->out
.info
->disks
);
1535 r
->out
.info
->count
= 2;
1537 r
->out
.info
->disks
[0].disk
= talloc_strdup(mem_ctx
, "C:");
1538 W_ERROR_HAVE_NO_MEMORY(r
->out
.info
->disks
[0].disk
);
1540 r
->out
.info
->disks
[1].disk
= talloc_strdup(mem_ctx
, "");
1541 W_ERROR_HAVE_NO_MEMORY(r
->out
.info
->disks
[1].disk
);
1543 *r
->out
.totalentries
= 1;
1544 r
->out
.resume_handle
= r
->in
.resume_handle
;
1549 return WERR_UNKNOWN_LEVEL
;
1555 srvsvc_NetServerStatisticsGet
1557 static WERROR
dcesrv_srvsvc_NetServerStatisticsGet(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1558 struct srvsvc_NetServerStatisticsGet
*r
)
1560 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1565 srvsvc_NetTransportAdd
1567 static WERROR
dcesrv_srvsvc_NetTransportAdd(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1568 struct srvsvc_NetTransportAdd
*r
)
1570 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1575 srvsvc_NetTransportEnum
1577 static WERROR
dcesrv_srvsvc_NetTransportEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1578 struct srvsvc_NetTransportEnum
*r
)
1580 r
->out
.transports
->level
= r
->in
.transports
->level
;
1581 *r
->out
.totalentries
= 0;
1582 if (r
->out
.resume_handle
) {
1583 *r
->out
.resume_handle
= 0;
1586 switch (r
->in
.transports
->level
) {
1589 r
->out
.transports
->ctr
.ctr0
= talloc(mem_ctx
, struct srvsvc_NetTransportCtr0
);
1590 W_ERROR_HAVE_NO_MEMORY(r
->out
.transports
->ctr
.ctr0
);
1592 r
->out
.transports
->ctr
.ctr0
->count
= 0;
1593 r
->out
.transports
->ctr
.ctr0
->array
= NULL
;
1595 return WERR_NOT_SUPPORTED
;
1599 r
->out
.transports
->ctr
.ctr1
= talloc(mem_ctx
, struct srvsvc_NetTransportCtr1
);
1600 W_ERROR_HAVE_NO_MEMORY(r
->out
.transports
->ctr
.ctr1
);
1602 r
->out
.transports
->ctr
.ctr1
->count
= 0;
1603 r
->out
.transports
->ctr
.ctr1
->array
= NULL
;
1605 return WERR_NOT_SUPPORTED
;
1609 r
->out
.transports
->ctr
.ctr2
= talloc(mem_ctx
, struct srvsvc_NetTransportCtr2
);
1610 W_ERROR_HAVE_NO_MEMORY(r
->out
.transports
->ctr
.ctr2
);
1612 r
->out
.transports
->ctr
.ctr2
->count
= 0;
1613 r
->out
.transports
->ctr
.ctr2
->array
= NULL
;
1615 return WERR_NOT_SUPPORTED
;
1619 r
->out
.transports
->ctr
.ctr3
= talloc(mem_ctx
, struct srvsvc_NetTransportCtr3
);
1620 W_ERROR_HAVE_NO_MEMORY(r
->out
.transports
->ctr
.ctr3
);
1622 r
->out
.transports
->ctr
.ctr3
->count
= 0;
1623 r
->out
.transports
->ctr
.ctr3
->array
= NULL
;
1625 return WERR_NOT_SUPPORTED
;
1628 return WERR_UNKNOWN_LEVEL
;
1633 srvsvc_NetTransportDel
1635 static WERROR
dcesrv_srvsvc_NetTransportDel(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1636 struct srvsvc_NetTransportDel
*r
)
1638 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1645 static WERROR
dcesrv_srvsvc_NetRemoteTOD(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1646 struct srvsvc_NetRemoteTOD
*r
)
1648 struct timeval tval
;
1651 struct srvsvc_NetRemoteTODInfo
*info
;
1653 info
= talloc(mem_ctx
, struct srvsvc_NetRemoteTODInfo
);
1654 W_ERROR_HAVE_NO_MEMORY(info
);
1656 GetTimeOfDay(&tval
);
1662 /* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
1663 info
->msecs
= (tm
.tm_hour
*60*60*1000)
1664 + (tm
.tm_min
*60*1000)
1666 + (tval
.tv_usec
/1000);
1667 info
->hours
= tm
.tm_hour
;
1668 info
->mins
= tm
.tm_min
;
1669 info
->secs
= tm
.tm_sec
;
1670 info
->hunds
= tval
.tv_usec
/10000;
1671 info
->timezone
= get_time_zone(t
)/60;
1672 info
->tinterval
= 310; /* just return the same as windows */
1673 info
->day
= tm
.tm_mday
;
1674 info
->month
= tm
.tm_mon
+ 1;
1675 info
->year
= tm
.tm_year
+ 1900;
1676 info
->weekday
= tm
.tm_wday
;
1678 *r
->out
.info
= info
;
1686 static WERROR
dcesrv_srvsvc_NetPathType(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1687 struct srvsvc_NetPathType
*r
)
1689 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1694 srvsvc_NetPathCanonicalize
1696 static WERROR
dcesrv_srvsvc_NetPathCanonicalize(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1697 struct srvsvc_NetPathCanonicalize
*r
)
1699 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1704 srvsvc_NetPathCompare
1706 static WERROR
dcesrv_srvsvc_NetPathCompare(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1707 struct srvsvc_NetPathCompare
*r
)
1709 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1714 srvsvc_NetNameValidate
1716 static WERROR
dcesrv_srvsvc_NetNameValidate(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1717 struct srvsvc_NetNameValidate
*r
)
1721 if ((r
->in
.flags
!= 0x0) && (r
->in
.flags
!= 0x80000000)) {
1722 return WERR_INVALID_NAME
;
1725 switch (r
->in
.name_type
) {
1734 return WERR_NOT_SUPPORTED
;
1736 case 9: /* validate share name */
1738 len
= strlen_m(r
->in
.name
);
1739 if ((r
->in
.flags
== 0x0) && (len
> 81)) {
1740 return WERR_INVALID_NAME
;
1742 if ((r
->in
.flags
== 0x80000000) && (len
> 13)) {
1743 return WERR_INVALID_NAME
;
1745 if (! dcesrv_common_validate_share_name(mem_ctx
, r
->in
.name
)) {
1746 return WERR_INVALID_NAME
;
1754 return WERR_NOT_SUPPORTED
;
1756 return WERR_INVALID_PARAM
;
1762 srvsvc_NetPRNameCompare
1764 static WERROR
dcesrv_srvsvc_NetPRNameCompare(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1765 struct srvsvc_NetPRNameCompare
*r
)
1767 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
1774 static WERROR
dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
1775 struct srvsvc_NetShareEnum
*r
)
1779 const char **snames
;
1780 struct share_context
*sctx
;
1781 struct share_config
*scfg
;
1782 struct dcesrv_context
*dce_ctx
= dce_call
->conn
->dce_ctx
;
1784 *r
->out
.totalentries
= 0;
1786 /* TODO: - paging of results
1789 nterr
= share_get_context_by_name(mem_ctx
, lpcfg_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
1790 if (!NT_STATUS_IS_OK(nterr
)) {
1791 return ntstatus_to_werror(nterr
);
1794 nterr
= share_list_all(mem_ctx
, sctx
, &numshares
, &snames
);
1795 if (!NT_STATUS_IS_OK(nterr
)) {
1796 return ntstatus_to_werror(nterr
);
1799 switch (r
->in
.info_ctr
->level
) {
1802 unsigned int i
, y
= 0;
1804 struct srvsvc_NetShareCtr0
*ctr0
;
1806 ctr0
= talloc(mem_ctx
, struct srvsvc_NetShareCtr0
);
1807 W_ERROR_HAVE_NO_MEMORY(ctr0
);
1810 ctr0
->count
= count
;
1813 if (ctr0
->count
== 0) {
1814 r
->out
.info_ctr
->ctr
.ctr0
= ctr0
;
1818 ctr0
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo0
, count
);
1819 W_ERROR_HAVE_NO_MEMORY(ctr0
->array
);
1821 for (i
=0; i
< count
; i
++) {
1823 union srvsvc_NetShareInfo info
;
1824 enum srvsvc_ShareType type
;
1826 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
1827 if (!NT_STATUS_IS_OK(nterr
)) {
1828 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
1829 return WERR_GENERAL_FAILURE
;
1832 type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
1833 if (type
& STYPE_HIDDEN
) {
1839 info
.info0
= &ctr0
->array
[y
];
1840 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
1841 W_ERROR_NOT_OK_RETURN(status
);
1845 talloc_free(snames
);
1847 r
->out
.info_ctr
->ctr
.ctr0
= ctr0
;
1848 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr0
->count
;
1854 unsigned int i
, y
= 0;
1856 struct srvsvc_NetShareCtr1
*ctr1
;
1858 ctr1
= talloc(mem_ctx
, struct srvsvc_NetShareCtr1
);
1859 W_ERROR_HAVE_NO_MEMORY(ctr1
);
1862 ctr1
->count
= count
;
1865 if (ctr1
->count
== 0) {
1866 r
->out
.info_ctr
->ctr
.ctr1
= ctr1
;
1870 ctr1
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo1
, count
);
1871 W_ERROR_HAVE_NO_MEMORY(ctr1
->array
);
1873 for (i
=0; i
< count
; i
++) {
1875 union srvsvc_NetShareInfo info
;
1876 enum srvsvc_ShareType type
;
1878 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
1879 if (!NT_STATUS_IS_OK(nterr
)) {
1880 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
1881 return WERR_GENERAL_FAILURE
;
1884 type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
1885 if (type
& STYPE_HIDDEN
) {
1891 info
.info1
= &ctr1
->array
[y
];
1892 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
1893 W_ERROR_NOT_OK_RETURN(status
);
1897 talloc_free(snames
);
1899 r
->out
.info_ctr
->ctr
.ctr1
= ctr1
;
1900 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr1
->count
;
1906 unsigned int i
, y
= 0;
1908 struct srvsvc_NetShareCtr2
*ctr2
;
1910 SRVSVC_CHECK_ADMIN_ACCESS
;
1912 ctr2
= talloc(mem_ctx
, struct srvsvc_NetShareCtr2
);
1913 W_ERROR_HAVE_NO_MEMORY(ctr2
);
1916 ctr2
->count
= count
;
1919 if (ctr2
->count
== 0) {
1920 r
->out
.info_ctr
->ctr
.ctr2
= ctr2
;
1924 ctr2
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo2
, count
);
1925 W_ERROR_HAVE_NO_MEMORY(ctr2
->array
);
1927 for (i
=0; i
< count
; i
++) {
1929 union srvsvc_NetShareInfo info
;
1930 enum srvsvc_ShareType type
;
1932 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
1933 if (!NT_STATUS_IS_OK(nterr
)) {
1934 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
1935 return WERR_GENERAL_FAILURE
;
1938 type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
1939 if (type
& STYPE_HIDDEN
) {
1945 info
.info2
= &ctr2
->array
[y
];
1946 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
1947 W_ERROR_NOT_OK_RETURN(status
);
1951 talloc_free(snames
);
1953 r
->out
.info_ctr
->ctr
.ctr2
= ctr2
;
1954 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr2
->count
;
1960 unsigned int i
, y
= 0;
1962 struct srvsvc_NetShareCtr502
*ctr502
;
1964 SRVSVC_CHECK_ADMIN_ACCESS
;
1966 ctr502
= talloc(mem_ctx
, struct srvsvc_NetShareCtr502
);
1967 W_ERROR_HAVE_NO_MEMORY(ctr502
);
1970 ctr502
->count
= count
;
1971 ctr502
->array
= NULL
;
1973 if (ctr502
->count
== 0) {
1974 r
->out
.info_ctr
->ctr
.ctr502
= ctr502
;
1978 ctr502
->array
= talloc_array(mem_ctx
, struct srvsvc_NetShareInfo502
, count
);
1979 W_ERROR_HAVE_NO_MEMORY(ctr502
->array
);
1981 for (i
=0; i
< count
; i
++) {
1983 union srvsvc_NetShareInfo info
;
1984 enum srvsvc_ShareType type
;
1986 nterr
= share_get_config(mem_ctx
, sctx
, snames
[i
], &scfg
);
1987 if (!NT_STATUS_IS_OK(nterr
)) {
1988 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames
[i
]));
1989 return WERR_GENERAL_FAILURE
;
1992 type
= dcesrv_common_get_share_type(mem_ctx
, dce_ctx
, scfg
);
1993 if (type
& STYPE_HIDDEN
) {
1999 info
.info502
= &ctr502
->array
[y
];
2000 status
= dcesrv_srvsvc_fiel_ShareInfo(dce_call
, mem_ctx
, scfg
, r
->in
.info_ctr
->level
, &info
);
2001 W_ERROR_NOT_OK_RETURN(status
);
2005 talloc_free(snames
);
2007 r
->out
.info_ctr
->ctr
.ctr502
= ctr502
;
2008 *r
->out
.totalentries
= r
->out
.info_ctr
->ctr
.ctr502
->count
;
2013 return WERR_UNKNOWN_LEVEL
;
2019 srvsvc_NetShareDelStart
2021 static WERROR
dcesrv_srvsvc_NetShareDelStart(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2022 struct srvsvc_NetShareDelStart
*r
)
2024 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2029 srvsvc_NetShareDelCommit
2031 static WERROR
dcesrv_srvsvc_NetShareDelCommit(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2032 struct srvsvc_NetShareDelCommit
*r
)
2034 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2039 srvsvc_NetGetFileSecurity
2041 static WERROR
dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2042 struct srvsvc_NetGetFileSecurity
*r
)
2044 struct sec_desc_buf
*sd_buf
;
2045 struct ntvfs_context
*ntvfs_ctx
= NULL
;
2046 struct ntvfs_request
*ntvfs_req
;
2047 union smb_fileinfo
*io
;
2050 nt_status
= srvsvc_create_ntvfs_context(dce_call
, mem_ctx
, r
->in
.share
, &ntvfs_ctx
);
2051 if (!NT_STATUS_IS_OK(nt_status
)) return ntstatus_to_werror(nt_status
);
2053 ntvfs_req
= ntvfs_request_create(ntvfs_ctx
, mem_ctx
,
2054 dce_call
->conn
->auth_state
.session_info
,
2058 W_ERROR_HAVE_NO_MEMORY(ntvfs_req
);
2060 sd_buf
= talloc(mem_ctx
, struct sec_desc_buf
);
2061 W_ERROR_HAVE_NO_MEMORY(sd_buf
);
2063 io
= talloc(mem_ctx
, union smb_fileinfo
);
2064 W_ERROR_HAVE_NO_MEMORY(io
);
2066 io
->query_secdesc
.level
= RAW_FILEINFO_SEC_DESC
;
2067 io
->query_secdesc
.in
.file
.path
= r
->in
.file
;
2068 io
->query_secdesc
.in
.secinfo_flags
= r
->in
.securityinformation
;
2070 nt_status
= ntvfs_qpathinfo(ntvfs_req
, io
);
2071 if (!NT_STATUS_IS_OK(nt_status
)) return ntstatus_to_werror(nt_status
);
2073 sd_buf
->sd
= io
->query_secdesc
.out
.sd
;
2075 *r
->out
.sd_buf
= sd_buf
;
2081 srvsvc_NetSetFileSecurity
2083 static WERROR
dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2084 struct srvsvc_NetSetFileSecurity
*r
)
2086 struct ntvfs_context
*ntvfs_ctx
;
2087 struct ntvfs_request
*ntvfs_req
;
2088 union smb_setfileinfo
*io
;
2091 nt_status
= srvsvc_create_ntvfs_context(dce_call
, mem_ctx
, r
->in
.share
, &ntvfs_ctx
);
2092 if (!NT_STATUS_IS_OK(nt_status
)) return ntstatus_to_werror(nt_status
);
2094 ntvfs_req
= ntvfs_request_create(ntvfs_ctx
, mem_ctx
,
2095 dce_call
->conn
->auth_state
.session_info
,
2099 W_ERROR_HAVE_NO_MEMORY(ntvfs_req
);
2101 io
= talloc(mem_ctx
, union smb_setfileinfo
);
2102 W_ERROR_HAVE_NO_MEMORY(io
);
2104 io
->set_secdesc
.level
= RAW_FILEINFO_SEC_DESC
;
2105 io
->set_secdesc
.in
.file
.path
= r
->in
.file
;
2106 io
->set_secdesc
.in
.secinfo_flags
= r
->in
.securityinformation
;
2107 io
->set_secdesc
.in
.sd
= r
->in
.sd_buf
->sd
;
2109 nt_status
= ntvfs_setpathinfo(ntvfs_req
, io
);
2110 if (!NT_STATUS_IS_OK(nt_status
)) return ntstatus_to_werror(nt_status
);
2117 srvsvc_NetServerTransportAddEx
2119 static WERROR
dcesrv_srvsvc_NetServerTransportAddEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2120 struct srvsvc_NetServerTransportAddEx
*r
)
2122 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2127 srvsvc_NetServerSetServiceBitsEx
2129 static WERROR
dcesrv_srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2130 struct srvsvc_NetServerSetServiceBitsEx
*r
)
2132 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2137 srvsvc_NETRDFSGETVERSION
2139 static WERROR
dcesrv_srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2140 struct srvsvc_NETRDFSGETVERSION
*r
)
2142 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2147 srvsvc_NETRDFSCREATELOCALPARTITION
2149 static WERROR
dcesrv_srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2150 struct srvsvc_NETRDFSCREATELOCALPARTITION
*r
)
2152 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2157 srvsvc_NETRDFSDELETELOCALPARTITION
2159 static WERROR
dcesrv_srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2160 struct srvsvc_NETRDFSDELETELOCALPARTITION
*r
)
2162 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2167 srvsvc_NETRDFSSETLOCALVOLUMESTATE
2169 static WERROR
dcesrv_srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2170 struct srvsvc_NETRDFSSETLOCALVOLUMESTATE
*r
)
2172 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2177 srvsvc_NETRDFSSETSERVERINFO
2179 static WERROR
dcesrv_srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2180 struct srvsvc_NETRDFSSETSERVERINFO
*r
)
2182 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2187 srvsvc_NETRDFSCREATEEXITPOINT
2189 static WERROR
dcesrv_srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2190 struct srvsvc_NETRDFSCREATEEXITPOINT
*r
)
2192 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2197 srvsvc_NETRDFSDELETEEXITPOINT
2199 static WERROR
dcesrv_srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2200 struct srvsvc_NETRDFSDELETEEXITPOINT
*r
)
2202 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2207 srvsvc_NETRDFSMODIFYPREFIX
2209 static WERROR
dcesrv_srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2210 struct srvsvc_NETRDFSMODIFYPREFIX
*r
)
2212 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2217 srvsvc_NETRDFSFIXLOCALVOLUME
2219 static WERROR
dcesrv_srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2220 struct srvsvc_NETRDFSFIXLOCALVOLUME
*r
)
2222 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2227 srvsvc_NETRDFSMANAGERREPORTSITEINFO
2229 static WERROR
dcesrv_srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2230 struct srvsvc_NETRDFSMANAGERREPORTSITEINFO
*r
)
2232 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2237 srvsvc_NETRSERVERTRANSPORTDELEX
2239 static WERROR
dcesrv_srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2240 struct srvsvc_NETRSERVERTRANSPORTDELEX
*r
)
2242 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2248 static WERROR
dcesrv_srvsvc_NetShareDel(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2249 struct srvsvc_NetShareDel
*r
)
2252 struct share_context
*sctx
;
2254 nterr
= share_get_context_by_name(mem_ctx
, lpcfg_share_backend(dce_call
->conn
->dce_ctx
->lp_ctx
), dce_call
->event_ctx
, dce_call
->conn
->dce_ctx
->lp_ctx
, &sctx
);
2255 if (!NT_STATUS_IS_OK(nterr
)) {
2256 return ntstatus_to_werror(nterr
);
2259 nterr
= share_remove(sctx
, r
->in
.share_name
);
2260 if (!NT_STATUS_IS_OK(nterr
)) {
2261 return ntstatus_to_werror(nterr
);
2268 srvsvc_NetSetServiceBits
2270 static WERROR
dcesrv_srvsvc_NetSetServiceBits(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2271 struct srvsvc_NetSetServiceBits
*r
)
2273 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2277 srvsvc_NETRPRNAMECANONICALIZE
2279 static WERROR
dcesrv_srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state
*dce_call
, TALLOC_CTX
*mem_ctx
,
2280 struct srvsvc_NETRPRNAMECANONICALIZE
*r
)
2282 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR
);
2285 /* include the generated boilerplate */
2286 #include "librpc/gen_ndr/ndr_srvsvc_s.c"