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/proto.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_string(t, 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;
78 srvsvc_NetCharDevGetInfo
80 static WERROR dcesrv_srvsvc_NetCharDevGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
81 struct srvsvc_NetCharDevGetInfo *r)
83 ZERO_STRUCTP(r->out.info);
85 switch (r->in.level) {
88 return WERR_NOT_SUPPORTED;
92 return WERR_NOT_SUPPORTED;
95 return WERR_UNKNOWN_LEVEL;
98 return WERR_UNKNOWN_LEVEL;
103 srvsvc_NetCharDevControl
105 static WERROR dcesrv_srvsvc_NetCharDevControl(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
106 struct srvsvc_NetCharDevControl *r)
108 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
113 srvsvc_NetCharDevQEnum
115 static WERROR dcesrv_srvsvc_NetCharDevQEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
116 struct srvsvc_NetCharDevQEnum *r)
118 *r->out.totalentries = 0;
120 switch (r->in.info_ctr->level) {
123 r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr0);
124 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
126 r->out.info_ctr->ctr.ctr0->count = 0;
127 r->out.info_ctr->ctr.ctr0->array = NULL;
129 return WERR_NOT_SUPPORTED;
133 r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr1);
134 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
136 r->out.info_ctr->ctr.ctr1->count = 0;
137 r->out.info_ctr->ctr.ctr1->array = NULL;
139 return WERR_NOT_SUPPORTED;
142 return WERR_UNKNOWN_LEVEL;
145 return WERR_UNKNOWN_LEVEL;
150 srvsvc_NetCharDevQGetInfo
152 static WERROR dcesrv_srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
153 struct srvsvc_NetCharDevQGetInfo *r)
155 ZERO_STRUCTP(r->out.info);
157 switch (r->in.level) {
160 return WERR_NOT_SUPPORTED;
164 return WERR_NOT_SUPPORTED;
167 return WERR_UNKNOWN_LEVEL;
170 return WERR_UNKNOWN_LEVEL;
175 srvsvc_NetCharDevQSetInfo
177 static WERROR dcesrv_srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
178 struct srvsvc_NetCharDevQSetInfo *r)
180 switch (r->in.level) {
183 if (r->in.parm_error) {
184 r->out.parm_error = r->in.parm_error;
186 return WERR_NOT_SUPPORTED;
190 if (r->in.parm_error) {
191 r->out.parm_error = r->in.parm_error;
193 return WERR_NOT_SUPPORTED;
196 return WERR_UNKNOWN_LEVEL;
199 return WERR_UNKNOWN_LEVEL;
204 srvsvc_NetCharDevQPurge
206 static WERROR dcesrv_srvsvc_NetCharDevQPurge(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
207 struct srvsvc_NetCharDevQPurge *r)
209 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
214 srvsvc_NetCharDevQPurgeSelf
216 static WERROR dcesrv_srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
217 struct srvsvc_NetCharDevQPurgeSelf *r)
219 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
226 static WERROR dcesrv_srvsvc_NetConnEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
227 struct srvsvc_NetConnEnum *r)
229 *r->out.totalentries = 0;
231 switch (r->in.info_ctr->level) {
234 r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetConnCtr0);
235 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
237 r->out.info_ctr->ctr.ctr0->count = 0;
238 r->out.info_ctr->ctr.ctr0->array = NULL;
240 return WERR_NOT_SUPPORTED;
244 r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetConnCtr1);
245 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
247 r->out.info_ctr->ctr.ctr1->count = 0;
248 r->out.info_ctr->ctr.ctr1->array = NULL;
250 return WERR_NOT_SUPPORTED;
253 return WERR_UNKNOWN_LEVEL;
256 return WERR_UNKNOWN_LEVEL;
263 static WERROR dcesrv_srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
264 struct srvsvc_NetFileEnum *r)
266 *r->out.totalentries = 0;
268 switch (r->in.info_ctr->level) {
271 r->out.info_ctr->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetFileCtr2);
272 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr2);
274 r->out.info_ctr->ctr.ctr2->count = 0;
275 r->out.info_ctr->ctr.ctr2->array = NULL;
277 return WERR_NOT_SUPPORTED;
281 r->out.info_ctr->ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetFileCtr3);
282 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr3);
284 r->out.info_ctr->ctr.ctr3->count = 0;
285 r->out.info_ctr->ctr.ctr3->array = NULL;
287 return WERR_NOT_SUPPORTED;
290 return WERR_UNKNOWN_LEVEL;
293 return WERR_UNKNOWN_LEVEL;
298 srvsvc_NetFileGetInfo
300 static WERROR dcesrv_srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
301 struct srvsvc_NetFileGetInfo *r)
303 ZERO_STRUCTP(r->out.info);
305 switch (r->in.level) {
308 return WERR_NOT_SUPPORTED;
312 return WERR_NOT_SUPPORTED;
315 return WERR_UNKNOWN_LEVEL;
318 return WERR_UNKNOWN_LEVEL;
325 static WERROR dcesrv_srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
326 struct srvsvc_NetFileClose *r)
328 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
335 static WERROR dcesrv_srvsvc_NetSessEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
336 struct srvsvc_NetSessEnum *r)
338 *r->out.totalentries = 0;
340 switch (r->in.info_ctr->level) {
343 r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetSessCtr0);
344 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
346 r->out.info_ctr->ctr.ctr0->count = 0;
347 r->out.info_ctr->ctr.ctr0->array = NULL;
349 return WERR_NOT_SUPPORTED;
353 r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetSessCtr1);
354 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
356 r->out.info_ctr->ctr.ctr1->count = 0;
357 r->out.info_ctr->ctr.ctr1->array = NULL;
359 return WERR_NOT_SUPPORTED;
363 r->out.info_ctr->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetSessCtr2);
364 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr2);
366 r->out.info_ctr->ctr.ctr2->count = 0;
367 r->out.info_ctr->ctr.ctr2->array = NULL;
369 return WERR_NOT_SUPPORTED;
373 r->out.info_ctr->ctr.ctr10 = talloc(mem_ctx, struct srvsvc_NetSessCtr10);
374 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr10);
376 r->out.info_ctr->ctr.ctr10->count = 0;
377 r->out.info_ctr->ctr.ctr10->array = NULL;
379 return WERR_NOT_SUPPORTED;
383 r->out.info_ctr->ctr.ctr502 = talloc(mem_ctx, struct srvsvc_NetSessCtr502);
384 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr502);
386 r->out.info_ctr->ctr.ctr502->count = 0;
387 r->out.info_ctr->ctr.ctr502->array = NULL;
389 return WERR_NOT_SUPPORTED;
392 return WERR_UNKNOWN_LEVEL;
395 return WERR_UNKNOWN_LEVEL;
402 static WERROR dcesrv_srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
403 struct srvsvc_NetSessDel *r)
405 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
412 static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
413 struct srvsvc_NetShareAdd *r)
415 switch (r->in.level) {
418 if (r->in.parm_error) {
419 r->out.parm_error = r->in.parm_error;
421 return WERR_NOT_SUPPORTED;
425 if (r->in.parm_error) {
426 r->out.parm_error = r->in.parm_error;
428 return WERR_NOT_SUPPORTED;
433 struct share_info *info;
434 struct share_context *sctx;
438 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);
439 if (!NT_STATUS_IS_OK(nterr)) {
440 return ntstatus_to_werror(nterr);
443 /* there are no more than 8 options in struct srvsvc_NetShareInfo2 */
444 info = talloc_array(mem_ctx, struct share_info, count);
445 W_ERROR_HAVE_NO_MEMORY(info);
449 info[i].name = SHARE_TYPE;
450 info[i].type = SHARE_INFO_STRING;
451 switch (r->in.info->info2->type) {
453 info[i].value = talloc_strdup(info, "DISK");
456 info[i].value = talloc_strdup(info, "PRINTER");
459 info[i].value = talloc_strdup(info, "IPC");
462 return WERR_INVALID_PARAM;
464 W_ERROR_HAVE_NO_MEMORY(info[i].value);
467 if (r->in.info->info2->path && r->in.info->info2->path[0]) {
468 info[i].name = SHARE_PATH;
469 info[i].type = SHARE_INFO_STRING;
471 /* Windows will send a path in a form of C:\example\path */
472 if (r->in.info->info2->path[1] == ':') {
473 info[i].value = talloc_strdup(info, &r->in.info->info2->path[2]);
475 /* very strange let's try to set as is */
476 info[i].value = talloc_strdup(info, r->in.info->info2->path);
478 W_ERROR_HAVE_NO_MEMORY(info[i].value);
479 all_string_sub((char *)info[i].value, "\\", "/", 0);
484 if (r->in.info->info2->comment && r->in.info->info2->comment[0]) {
485 info[i].name = SHARE_COMMENT;
486 info[i].type = SHARE_INFO_STRING;
487 info[i].value = talloc_strdup(info, r->in.info->info2->comment);
488 W_ERROR_HAVE_NO_MEMORY(info[i].value);
493 if (r->in.info->info2->password && r->in.info->info2->password[0]) {
494 info[i].name = SHARE_PASSWORD;
495 info[i].type = SHARE_INFO_STRING;
496 info[i].value = talloc_strdup(info, r->in.info->info2->password);
497 W_ERROR_HAVE_NO_MEMORY(info[i].value);
502 info[i].name = SHARE_MAX_CONNECTIONS;
503 info[i].type = SHARE_INFO_INT;
504 info[i].value = talloc(info, int);
505 *((int *)info[i].value) = r->in.info->info2->max_users;
508 /* TODO: security descriptor */
510 nterr = share_create(sctx, r->in.info->info2->name, info, i);
511 if (!NT_STATUS_IS_OK(nterr)) {
512 return ntstatus_to_werror(nterr);
515 if (r->in.parm_error) {
516 r->out.parm_error = r->in.parm_error;
523 if (r->in.parm_error) {
524 r->out.parm_error = r->in.parm_error;
526 return WERR_NOT_SUPPORTED;
531 struct share_info *info;
532 struct share_context *sctx;
536 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);
537 if (!NT_STATUS_IS_OK(nterr)) {
538 return ntstatus_to_werror(nterr);
541 /* there are no more than 10 options in struct srvsvc_NetShareInfo502 */
542 info = talloc_array(mem_ctx, struct share_info, count);
543 W_ERROR_HAVE_NO_MEMORY(info);
547 info[i].name = SHARE_TYPE;
548 info[i].type = SHARE_INFO_STRING;
549 switch (r->in.info->info502->type) {
551 info[i].value = talloc_strdup(info, "DISK");
554 info[i].value = talloc_strdup(info, "PRINTER");
557 info[i].value = talloc_strdup(info, "IPC");
560 return WERR_INVALID_PARAM;
562 W_ERROR_HAVE_NO_MEMORY(info[i].value);
565 if (r->in.info->info502->path && r->in.info->info502->path[0]) {
566 info[i].name = SHARE_PATH;
567 info[i].type = SHARE_INFO_STRING;
569 /* Windows will send a path in a form of C:\example\path */
570 if (r->in.info->info502->path[1] == ':') {
571 info[i].value = talloc_strdup(info, &r->in.info->info502->path[2]);
573 /* very strange let's try to set as is */
574 info[i].value = talloc_strdup(info, r->in.info->info502->path);
576 W_ERROR_HAVE_NO_MEMORY(info[i].value);
577 all_string_sub((char *)info[i].value, "\\", "/", 0);
582 if (r->in.info->info502->comment && r->in.info->info502->comment[0]) {
583 info[i].name = SHARE_COMMENT;
584 info[i].type = SHARE_INFO_STRING;
585 info[i].value = talloc_strdup(info, r->in.info->info502->comment);
586 W_ERROR_HAVE_NO_MEMORY(info[i].value);
591 if (r->in.info->info502->password && r->in.info->info502->password[0]) {
592 info[i].name = SHARE_PASSWORD;
593 info[i].type = SHARE_INFO_STRING;
594 info[i].value = talloc_strdup(info, r->in.info->info502->password);
595 W_ERROR_HAVE_NO_MEMORY(info[i].value);
600 info[i].name = SHARE_MAX_CONNECTIONS;
601 info[i].type = SHARE_INFO_INT;
602 info[i].value = talloc(info, int);
603 *((int *)info[i].value) = r->in.info->info502->max_users;
606 /* TODO: security descriptor */
608 nterr = share_create(sctx, r->in.info->info502->name, info, i);
609 if (!NT_STATUS_IS_OK(nterr)) {
610 return ntstatus_to_werror(nterr);
613 if (r->in.parm_error) {
614 r->out.parm_error = r->in.parm_error;
620 return WERR_UNKNOWN_LEVEL;
623 return WERR_UNKNOWN_LEVEL;
626 static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
627 struct share_config *scfg, uint32_t level,
628 union srvsvc_NetShareInfo *info)
630 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
635 info->info0->name = talloc_strdup(mem_ctx, scfg->name);
636 W_ERROR_HAVE_NO_MEMORY(info->info0->name);
642 info->info1->name = talloc_strdup(mem_ctx, scfg->name);
643 W_ERROR_HAVE_NO_MEMORY(info->info1->name);
644 info->info1->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
645 info->info1->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
646 W_ERROR_HAVE_NO_MEMORY(info->info1->comment);
652 info->info2->name = talloc_strdup(mem_ctx, scfg->name);
653 W_ERROR_HAVE_NO_MEMORY(info->info2->name);
654 info->info2->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
655 info->info2->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
656 W_ERROR_HAVE_NO_MEMORY(info->info2->comment);
657 info->info2->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
658 info->info2->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
659 info->info2->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
660 info->info2->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
661 W_ERROR_HAVE_NO_MEMORY(info->info2->path);
662 info->info2->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
668 info->info501->name = talloc_strdup(mem_ctx, scfg->name);
669 W_ERROR_HAVE_NO_MEMORY(info->info501->name);
670 info->info501->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
671 info->info501->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
672 W_ERROR_HAVE_NO_MEMORY(info->info501->comment);
673 info->info501->csc_policy = share_int_option(scfg, SHARE_CSC_POLICY, SHARE_CSC_POLICY_DEFAULT);
679 info->info502->name = talloc_strdup(mem_ctx, scfg->name);
680 W_ERROR_HAVE_NO_MEMORY(info->info502->name);
681 info->info502->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
682 info->info502->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
683 W_ERROR_HAVE_NO_MEMORY(info->info502->comment);
684 info->info502->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
685 info->info502->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
686 info->info502->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
687 info->info502->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
688 W_ERROR_HAVE_NO_MEMORY(info->info502->path);
689 info->info502->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
690 info->info502->sd_buf.sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, scfg);
696 info->info1005->dfs_flags = dcesrv_common_get_share_dfs_flags(mem_ctx, dce_ctx, scfg);
701 return WERR_UNKNOWN_LEVEL;
704 return WERR_UNKNOWN_LEVEL;
708 srvsvc_NetShareEnumAll
710 static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
711 struct srvsvc_NetShareEnumAll *r)
716 struct share_context *sctx;
717 struct share_config *scfg;
719 *r->out.totalentries = 0;
721 /* TODO: - paging of results
724 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);
725 if (!NT_STATUS_IS_OK(nterr)) {
726 return ntstatus_to_werror(nterr);
729 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
730 if (!NT_STATUS_IS_OK(nterr)) {
731 return ntstatus_to_werror(nterr);
734 switch (r->in.info_ctr->level) {
738 struct srvsvc_NetShareCtr0 *ctr0;
740 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
741 W_ERROR_HAVE_NO_MEMORY(ctr0);
743 ctr0->count = numshares;
746 if (ctr0->count == 0) {
747 r->out.info_ctr->ctr.ctr0 = ctr0;
751 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, ctr0->count);
752 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
754 for (i = 0; i < ctr0->count; i++) {
756 union srvsvc_NetShareInfo info;
758 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
759 if (!NT_STATUS_IS_OK(nterr)) {
760 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
761 return WERR_GENERAL_FAILURE;
763 info.info0 = &ctr0->array[i];
764 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
765 if (!W_ERROR_IS_OK(status)) {
772 r->out.info_ctr->ctr.ctr0 = ctr0;
773 *r->out.totalentries = r->out.info_ctr->ctr.ctr0->count;
779 struct srvsvc_NetShareCtr1 *ctr1;
781 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
782 W_ERROR_HAVE_NO_MEMORY(ctr1);
784 ctr1->count = numshares;
787 if (ctr1->count == 0) {
788 r->out.info_ctr->ctr.ctr1 = ctr1;
792 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, ctr1->count);
793 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
795 for (i=0; i < ctr1->count; i++) {
797 union srvsvc_NetShareInfo info;
799 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
800 if (!NT_STATUS_IS_OK(nterr)) {
801 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
802 return WERR_GENERAL_FAILURE;
804 info.info1 = &ctr1->array[i];
805 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
806 if (!W_ERROR_IS_OK(status)) {
813 r->out.info_ctr->ctr.ctr1 = ctr1;
814 *r->out.totalentries = r->out.info_ctr->ctr.ctr1->count;
821 struct srvsvc_NetShareCtr2 *ctr2;
823 SRVSVC_CHECK_ADMIN_ACCESS;
825 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
826 W_ERROR_HAVE_NO_MEMORY(ctr2);
828 ctr2->count = numshares;
831 if (ctr2->count == 0) {
832 r->out.info_ctr->ctr.ctr2 = ctr2;
836 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, ctr2->count);
837 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
839 for (i=0; i < ctr2->count; i++) {
841 union srvsvc_NetShareInfo info;
843 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
844 if (!NT_STATUS_IS_OK(nterr)) {
845 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
846 return WERR_GENERAL_FAILURE;
848 info.info2 = &ctr2->array[i];
849 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
850 if (!W_ERROR_IS_OK(status)) {
857 r->out.info_ctr->ctr.ctr2 = ctr2;
858 *r->out.totalentries = r->out.info_ctr->ctr.ctr2->count;
865 struct srvsvc_NetShareCtr501 *ctr501;
867 SRVSVC_CHECK_ADMIN_ACCESS;
869 ctr501 = talloc(mem_ctx, struct srvsvc_NetShareCtr501);
870 W_ERROR_HAVE_NO_MEMORY(ctr501);
872 ctr501->count = numshares;
873 ctr501->array = NULL;
875 if (ctr501->count == 0) {
876 r->out.info_ctr->ctr.ctr501 = ctr501;
880 ctr501->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo501, ctr501->count);
881 W_ERROR_HAVE_NO_MEMORY(ctr501->array);
883 for (i=0; i < ctr501->count; i++) {
885 union srvsvc_NetShareInfo info;
887 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
888 if (!NT_STATUS_IS_OK(nterr)) {
889 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
890 return WERR_GENERAL_FAILURE;
892 info.info501 = &ctr501->array[i];
893 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
894 if (!W_ERROR_IS_OK(status)) {
901 r->out.info_ctr->ctr.ctr501 = ctr501;
902 *r->out.totalentries = r->out.info_ctr->ctr.ctr501->count;
909 struct srvsvc_NetShareCtr502 *ctr502;
911 SRVSVC_CHECK_ADMIN_ACCESS;
913 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
914 W_ERROR_HAVE_NO_MEMORY(ctr502);
916 ctr502->count = numshares;
917 ctr502->array = NULL;
919 if (ctr502->count == 0) {
920 r->out.info_ctr->ctr.ctr502 = ctr502;
924 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, ctr502->count);
925 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
927 for (i=0; i < ctr502->count; i++) {
929 union srvsvc_NetShareInfo info;
931 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
932 if (!NT_STATUS_IS_OK(nterr)) {
933 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
934 return WERR_GENERAL_FAILURE;
936 info.info502 = &ctr502->array[i];
937 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
938 if (!W_ERROR_IS_OK(status)) {
945 r->out.info_ctr->ctr.ctr502 = ctr502;
946 *r->out.totalentries = r->out.info_ctr->ctr.ctr502->count;
951 return WERR_UNKNOWN_LEVEL;
954 return WERR_UNKNOWN_LEVEL;
959 srvsvc_NetShareGetInfo
961 static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
962 struct srvsvc_NetShareGetInfo *r)
965 struct share_context *sctx = NULL;
966 struct share_config *scfg = NULL;
968 ZERO_STRUCTP(r->out.info);
970 /* TODO: - access check
973 if (strcmp("", r->in.share_name) == 0) {
974 return WERR_INVALID_PARAM;
977 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);
978 if (!NT_STATUS_IS_OK(nterr)) {
979 return ntstatus_to_werror(nterr);
982 nterr = share_get_config(mem_ctx, sctx, r->in.share_name, &scfg);
983 if (!NT_STATUS_IS_OK(nterr)) {
984 return ntstatus_to_werror(nterr);
987 switch (r->in.level) {
991 union srvsvc_NetShareInfo info;
993 info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0);
994 W_ERROR_HAVE_NO_MEMORY(info.info0);
996 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
997 if (!W_ERROR_IS_OK(status)) {
1001 r->out.info->info0 = info.info0;
1007 union srvsvc_NetShareInfo info;
1009 info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1);
1010 W_ERROR_HAVE_NO_MEMORY(info.info1);
1012 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1013 if (!W_ERROR_IS_OK(status)) {
1017 r->out.info->info1 = info.info1;
1023 union srvsvc_NetShareInfo info;
1025 SRVSVC_CHECK_ADMIN_ACCESS;
1027 info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
1028 W_ERROR_HAVE_NO_MEMORY(info.info2);
1030 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1031 if (!W_ERROR_IS_OK(status)) {
1035 r->out.info->info2 = info.info2;
1041 union srvsvc_NetShareInfo info;
1043 info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501);
1044 W_ERROR_HAVE_NO_MEMORY(info.info501);
1046 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1047 if (!W_ERROR_IS_OK(status)) {
1051 r->out.info->info501 = info.info501;
1057 union srvsvc_NetShareInfo info;
1059 SRVSVC_CHECK_ADMIN_ACCESS;
1061 info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502);
1062 W_ERROR_HAVE_NO_MEMORY(info.info502);
1064 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1065 if (!W_ERROR_IS_OK(status)) {
1069 r->out.info->info502 = info.info502;
1075 union srvsvc_NetShareInfo info;
1077 info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005);
1078 W_ERROR_HAVE_NO_MEMORY(info.info1005);
1080 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1081 if (!W_ERROR_IS_OK(status)) {
1085 r->out.info->info1005 = info.info1005;
1089 return WERR_UNKNOWN_LEVEL;
1092 return WERR_UNKNOWN_LEVEL;
1095 static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count,
1096 const char *share_name, int level,
1099 const char *comment,
1100 const char *password,
1101 enum srvsvc_ShareType type,
1103 uint32_t csc_policy,
1104 struct security_descriptor *sd)
1109 info[i].name = SHARE_CSC_POLICY;
1110 info[i].type = SHARE_INFO_INT;
1111 info[i].value = talloc(info, int);
1112 *((int *)info[i].value) = csc_policy;
1119 /* TODO: check if unknown is csc_policy */
1121 /* TODO: security descriptor */
1124 if (path && path[0]) {
1125 info[i].name = SHARE_PATH;
1126 info[i].type = SHARE_INFO_STRING;
1128 /* Windows will send a path in a form of C:\example\path */
1129 if (path[1] == ':') {
1130 info[i].value = talloc_strdup(info, &path[2]);
1132 /* very strange let's try to set as is */
1133 info[i].value = talloc_strdup(info, path);
1135 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1136 all_string_sub((char *)info[i].value, "\\", "/", 0);
1141 if (password && password[0]) {
1142 info[i].name = SHARE_PASSWORD;
1143 info[i].type = SHARE_INFO_STRING;
1144 info[i].value = talloc_strdup(info, password);
1145 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1150 info[i].name = SHARE_MAX_CONNECTIONS;
1151 info[i].type = SHARE_INFO_INT;
1152 info[i].value = talloc(info, int);
1153 *((int *)info[i].value) = max_users;
1158 info[i].name = SHARE_TYPE;
1159 info[i].type = SHARE_INFO_STRING;
1162 info[i].value = talloc_strdup(info, "DISK");
1165 info[i].value = talloc_strdup(info, "PRINTER");
1168 info[i].value = talloc_strdup(info, "IPC");
1171 return WERR_INVALID_PARAM;
1173 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1178 info[i].name = SHARE_COMMENT;
1179 info[i].type = SHARE_INFO_STRING;
1180 info[i].value = talloc_strdup(info, comment);
1181 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1187 strcasecmp(share_name, name) != 0) {
1188 info[i].name = SHARE_NAME;
1189 info[i].type = SHARE_INFO_STRING;
1190 info[i].value = talloc_strdup(info, name);
1191 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1198 return WERR_UNKNOWN_LEVEL;
1207 srvsvc_NetShareSetInfo
1209 static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1210 struct srvsvc_NetShareSetInfo *r)
1214 struct share_context *sctx = NULL;
1215 struct share_info *info;
1218 /* TODO: - access check
1221 /* there are no more than 10 options in all struct srvsvc_NetShareInfoXXX */
1222 info = talloc_array(mem_ctx, struct share_info, 10);
1223 W_ERROR_HAVE_NO_MEMORY(info);
1225 ZERO_STRUCT(r->out);
1227 if (strcmp("", r->in.share_name) == 0) {
1228 return WERR_INVALID_PARAM;
1231 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);
1232 if (!NT_STATUS_IS_OK(nterr)) {
1233 return ntstatus_to_werror(nterr);
1236 switch (r->in.level) {
1239 status = dcesrv_srvsvc_fill_share_info(info, &count,
1240 r->in.share_name, r->in.level,
1241 r->in.info->info0->name,
1249 if (W_ERROR_EQUAL(status, WERR_OK)) {
1256 status = dcesrv_srvsvc_fill_share_info(info, &count,
1257 r->in.share_name, r->in.level,
1258 r->in.info->info1->name,
1260 r->in.info->info1->comment,
1262 r->in.info->info1->type,
1266 if (W_ERROR_EQUAL(status, WERR_OK)) {
1273 status = dcesrv_srvsvc_fill_share_info(info, &count,
1274 r->in.share_name, r->in.level,
1275 r->in.info->info2->name,
1276 r->in.info->info2->path,
1277 r->in.info->info2->comment,
1278 r->in.info->info2->password,
1279 r->in.info->info2->type,
1280 r->in.info->info2->max_users,
1283 if (W_ERROR_EQUAL(status, WERR_OK)) {
1290 status = dcesrv_srvsvc_fill_share_info(info, &count,
1291 r->in.share_name, r->in.level,
1292 r->in.info->info501->name,
1294 r->in.info->info501->comment,
1296 r->in.info->info501->type,
1298 r->in.info->info501->csc_policy,
1300 if (W_ERROR_EQUAL(status, WERR_OK)) {
1307 status = dcesrv_srvsvc_fill_share_info(info, &count,
1308 r->in.share_name, r->in.level,
1309 r->in.info->info502->name,
1310 r->in.info->info502->path,
1311 r->in.info->info502->comment,
1312 r->in.info->info502->password,
1313 r->in.info->info502->type,
1314 r->in.info->info502->max_users,
1316 r->in.info->info502->sd_buf.sd);
1317 if (W_ERROR_EQUAL(status, WERR_OK)) {
1324 status = dcesrv_srvsvc_fill_share_info(info, &count,
1325 r->in.share_name, r->in.level,
1328 r->in.info->info1004->comment,
1334 if (W_ERROR_EQUAL(status, WERR_OK)) {
1341 /* r->in.info.dfs_flags; */
1343 if (r->in.parm_error) {
1344 r->out.parm_error = r->in.parm_error;
1350 return WERR_UNKNOWN_LEVEL;
1353 nterr = share_set(sctx, r->in.share_name, info, count);
1354 if (!NT_STATUS_IS_OK(nterr)) {
1355 return ntstatus_to_werror(nterr);
1358 if (r->in.parm_error) {
1359 r->out.parm_error = r->in.parm_error;
1367 srvsvc_NetShareDelSticky
1369 static WERROR dcesrv_srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1370 struct srvsvc_NetShareDelSticky *r)
1372 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1377 srvsvc_NetShareCheck
1379 static WERROR dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1380 struct srvsvc_NetShareCheck *r)
1383 struct share_context *sctx = NULL;
1384 struct share_config *scfg = NULL;
1391 /* TODO: - access check
1394 if (strcmp("", r->in.device_name) == 0) {
1395 *r->out.type = STYPE_IPC;
1399 /* copy the path skipping C:\ */
1400 if (strncasecmp(r->in.device_name, "C:", 2) == 0) {
1401 device = talloc_strdup(mem_ctx, &r->in.device_name[2]);
1403 /* no chance we have a share that doesn't start with C:\ */
1404 return WERR_DEVICE_NOT_SHARED;
1406 all_string_sub(device, "\\", "/", 0);
1408 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
1409 if (!NT_STATUS_IS_OK(nterr)) {
1410 return ntstatus_to_werror(nterr);
1413 nterr = share_list_all(mem_ctx, sctx, &count, &names);
1414 if (!NT_STATUS_IS_OK(nterr)) {
1415 return ntstatus_to_werror(nterr);
1418 for (i = 0; i < count; i++) {
1422 nterr = share_get_config(mem_ctx, sctx, names[i], &scfg);
1423 if (!NT_STATUS_IS_OK(nterr)) {
1424 return ntstatus_to_werror(nterr);
1426 path = share_string_option(scfg, SHARE_PATH, NULL);
1427 if (!path) continue;
1429 if (strcmp(device, path) == 0) {
1430 type = share_string_option(scfg, SHARE_TYPE, NULL);
1431 if (!type) continue;
1433 if (strcmp(type, "DISK") == 0) {
1434 *r->out.type = STYPE_DISKTREE;
1438 if (strcmp(type, "IPC") == 0) {
1439 *r->out.type = STYPE_IPC;
1443 if (strcmp(type, "PRINTER") == 0) {
1444 *r->out.type = STYPE_PRINTQ;
1450 return WERR_DEVICE_NOT_SHARED;
1455 srvsvc_NetSrvGetInfo
1457 static WERROR dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1458 struct srvsvc_NetSrvGetInfo *r)
1460 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1462 ZERO_STRUCTP(r->out.info);
1464 switch (r->in.level) {
1467 struct srvsvc_NetSrvInfo100 *info100;
1469 info100 = talloc(mem_ctx, struct srvsvc_NetSrvInfo100);
1470 W_ERROR_HAVE_NO_MEMORY(info100);
1472 info100->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1473 info100->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1474 W_ERROR_HAVE_NO_MEMORY(info100->server_name);
1476 r->out.info->info100 = info100;
1481 struct srvsvc_NetSrvInfo101 *info101;
1483 info101 = talloc(mem_ctx, struct srvsvc_NetSrvInfo101);
1484 W_ERROR_HAVE_NO_MEMORY(info101);
1486 info101->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1487 info101->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1488 W_ERROR_HAVE_NO_MEMORY(info101->server_name);
1490 info101->version_major = dcesrv_common_get_version_major(mem_ctx, dce_ctx->lp_ctx);
1491 info101->version_minor = dcesrv_common_get_version_minor(mem_ctx, dce_ctx->lp_ctx);
1492 info101->server_type = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
1493 info101->comment = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
1494 W_ERROR_HAVE_NO_MEMORY(info101->comment);
1496 r->out.info->info101 = info101;
1501 struct srvsvc_NetSrvInfo102 *info102;
1503 info102 = talloc(mem_ctx, struct srvsvc_NetSrvInfo102);
1504 W_ERROR_HAVE_NO_MEMORY(info102);
1506 info102->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1507 info102->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1508 W_ERROR_HAVE_NO_MEMORY(info102->server_name);
1510 info102->version_major = dcesrv_common_get_version_major(mem_ctx, dce_ctx->lp_ctx);
1511 info102->version_minor = dcesrv_common_get_version_minor(mem_ctx, dce_ctx->lp_ctx);
1512 info102->server_type = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
1513 info102->comment = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
1514 W_ERROR_HAVE_NO_MEMORY(info102->comment);
1516 info102->users = dcesrv_common_get_users(mem_ctx, dce_ctx);
1517 info102->disc = dcesrv_common_get_disc(mem_ctx, dce_ctx);
1518 info102->hidden = dcesrv_common_get_hidden(mem_ctx, dce_ctx);
1519 info102->announce = dcesrv_common_get_announce(mem_ctx, dce_ctx);
1520 info102->anndelta = dcesrv_common_get_anndelta(mem_ctx, dce_ctx);
1521 info102->licenses = dcesrv_common_get_licenses(mem_ctx, dce_ctx);
1522 info102->userpath = dcesrv_common_get_userpath(mem_ctx, dce_ctx);
1523 W_ERROR_HAVE_NO_MEMORY(info102->userpath);
1525 r->out.info->info102 = info102;
1529 return WERR_UNKNOWN_LEVEL;
1532 return WERR_UNKNOWN_LEVEL;
1537 srvsvc_NetSrvSetInfo
1539 static WERROR dcesrv_srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1540 struct srvsvc_NetSrvSetInfo *r)
1542 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1549 static WERROR dcesrv_srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1550 struct srvsvc_NetDiskEnum *r)
1552 r->out.info->disks = NULL;
1553 r->out.info->count = 0;
1554 *r->out.totalentries = 0;
1556 switch (r->in.level) {
1559 /* we can safely hardcode the reply and report we have only one disk (C:) */
1560 /* for some reason Windows wants 2 entries with the second being empty */
1561 r->out.info->disks = talloc_array(mem_ctx, struct srvsvc_NetDiskInfo0, 2);
1562 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks);
1563 r->out.info->count = 2;
1565 r->out.info->disks[0].disk = talloc_strdup(mem_ctx, "C:");
1566 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[0].disk);
1568 r->out.info->disks[1].disk = talloc_strdup(mem_ctx, "");
1569 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[1].disk);
1571 *r->out.totalentries = 1;
1572 r->out.resume_handle = r->in.resume_handle;
1577 return WERR_UNKNOWN_LEVEL;
1580 return WERR_UNKNOWN_LEVEL;
1585 srvsvc_NetServerStatisticsGet
1587 static WERROR dcesrv_srvsvc_NetServerStatisticsGet(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1588 struct srvsvc_NetServerStatisticsGet *r)
1590 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1595 srvsvc_NetTransportAdd
1597 static WERROR dcesrv_srvsvc_NetTransportAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1598 struct srvsvc_NetTransportAdd *r)
1600 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1605 srvsvc_NetTransportEnum
1607 static WERROR dcesrv_srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1608 struct srvsvc_NetTransportEnum *r)
1610 r->out.transports->level = r->in.transports->level;
1611 *r->out.totalentries = 0;
1612 if (r->out.resume_handle) {
1613 *r->out.resume_handle = 0;
1616 switch (r->in.transports->level) {
1619 r->out.transports->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetTransportCtr0);
1620 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr0);
1622 r->out.transports->ctr.ctr0->count = 0;
1623 r->out.transports->ctr.ctr0->array = NULL;
1625 return WERR_NOT_SUPPORTED;
1629 r->out.transports->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetTransportCtr1);
1630 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr1);
1632 r->out.transports->ctr.ctr1->count = 0;
1633 r->out.transports->ctr.ctr1->array = NULL;
1635 return WERR_NOT_SUPPORTED;
1639 r->out.transports->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetTransportCtr2);
1640 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr2);
1642 r->out.transports->ctr.ctr2->count = 0;
1643 r->out.transports->ctr.ctr2->array = NULL;
1645 return WERR_NOT_SUPPORTED;
1649 r->out.transports->ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetTransportCtr3);
1650 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr3);
1652 r->out.transports->ctr.ctr3->count = 0;
1653 r->out.transports->ctr.ctr3->array = NULL;
1655 return WERR_NOT_SUPPORTED;
1658 return WERR_UNKNOWN_LEVEL;
1661 return WERR_UNKNOWN_LEVEL;
1665 srvsvc_NetTransportDel
1667 static WERROR dcesrv_srvsvc_NetTransportDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1668 struct srvsvc_NetTransportDel *r)
1670 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1677 static WERROR dcesrv_srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1678 struct srvsvc_NetRemoteTOD *r)
1680 struct timeval tval;
1683 struct srvsvc_NetRemoteTODInfo *info;
1685 info = talloc(mem_ctx, struct srvsvc_NetRemoteTODInfo);
1686 W_ERROR_HAVE_NO_MEMORY(info);
1688 GetTimeOfDay(&tval);
1694 /* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
1695 info->msecs = (tm.tm_hour*60*60*1000)
1696 + (tm.tm_min*60*1000)
1698 + (tval.tv_usec/1000);
1699 info->hours = tm.tm_hour;
1700 info->mins = tm.tm_min;
1701 info->secs = tm.tm_sec;
1702 info->hunds = tval.tv_usec/10000;
1703 info->timezone = get_time_zone(t)/60;
1704 info->tinterval = 310; /* just return the same as windows */
1705 info->day = tm.tm_mday;
1706 info->month = tm.tm_mon + 1;
1707 info->year = tm.tm_year + 1900;
1708 info->weekday = tm.tm_wday;
1710 *r->out.info = info;
1718 static WERROR dcesrv_srvsvc_NetPathType(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1719 struct srvsvc_NetPathType *r)
1721 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1726 srvsvc_NetPathCanonicalize
1728 static WERROR dcesrv_srvsvc_NetPathCanonicalize(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1729 struct srvsvc_NetPathCanonicalize *r)
1731 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1736 srvsvc_NetPathCompare
1738 static WERROR dcesrv_srvsvc_NetPathCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1739 struct srvsvc_NetPathCompare *r)
1741 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1746 srvsvc_NetNameValidate
1748 static WERROR dcesrv_srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1749 struct srvsvc_NetNameValidate *r)
1753 if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) {
1754 return WERR_INVALID_NAME;
1757 switch (r->in.name_type) {
1766 return WERR_NOT_SUPPORTED;
1768 case 9: /* validate share name */
1770 len = strlen_m(r->in.name);
1771 if ((r->in.flags == 0x0) && (len > 81)) {
1772 return WERR_INVALID_NAME;
1774 if ((r->in.flags == 0x80000000) && (len > 13)) {
1775 return WERR_INVALID_NAME;
1777 if (! dcesrv_common_validate_share_name(mem_ctx, r->in.name)) {
1778 return WERR_INVALID_NAME;
1786 return WERR_NOT_SUPPORTED;
1788 return WERR_INVALID_PARAM;
1791 return WERR_INVALID_PARAM;
1796 srvsvc_NetPRNameCompare
1798 static WERROR dcesrv_srvsvc_NetPRNameCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1799 struct srvsvc_NetPRNameCompare *r)
1801 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1808 static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1809 struct srvsvc_NetShareEnum *r)
1813 const char **snames;
1814 struct share_context *sctx;
1815 struct share_config *scfg;
1816 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1818 r->out.level = r->in.level;
1819 ZERO_STRUCT(r->out.ctr);
1820 r->out.totalentries = 0;
1821 r->out.resume_handle = NULL;
1823 /* TODO: - paging of results
1826 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);
1827 if (!NT_STATUS_IS_OK(nterr)) {
1828 return ntstatus_to_werror(nterr);
1831 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
1832 if (!NT_STATUS_IS_OK(nterr)) {
1833 return ntstatus_to_werror(nterr);
1836 switch (r->in.level) {
1841 struct srvsvc_NetShareCtr0 *ctr0;
1843 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
1844 W_ERROR_HAVE_NO_MEMORY(ctr0);
1847 ctr0->count = count;
1850 if (ctr0->count == 0) {
1851 r->out.ctr.ctr0 = ctr0;
1855 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, count);
1856 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
1858 for (i=0; i < count; i++) {
1860 union srvsvc_NetShareInfo info;
1861 enum srvsvc_ShareType type;
1863 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1864 if (!NT_STATUS_IS_OK(nterr)) {
1865 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1866 return WERR_GENERAL_FAILURE;
1869 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1870 if (type & STYPE_HIDDEN) {
1876 info.info0 = &ctr0->array[y];
1877 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1878 W_ERROR_NOT_OK_RETURN(status);
1882 talloc_free(snames);
1884 r->out.ctr.ctr0 = ctr0;
1885 r->out.totalentries = r->out.ctr.ctr0->count;
1892 struct srvsvc_NetShareCtr1 *ctr1;
1894 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
1895 W_ERROR_HAVE_NO_MEMORY(ctr1);
1898 ctr1->count = count;
1901 if (ctr1->count == 0) {
1902 r->out.ctr.ctr1 = ctr1;
1906 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, count);
1907 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
1909 for (i=0; i < count; i++) {
1911 union srvsvc_NetShareInfo info;
1912 enum srvsvc_ShareType type;
1914 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1915 if (!NT_STATUS_IS_OK(nterr)) {
1916 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1917 return WERR_GENERAL_FAILURE;
1920 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1921 if (type & STYPE_HIDDEN) {
1927 info.info1 = &ctr1->array[y];
1928 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1929 W_ERROR_NOT_OK_RETURN(status);
1933 talloc_free(snames);
1935 r->out.ctr.ctr1 = ctr1;
1936 r->out.totalentries = r->out.ctr.ctr1->count;
1943 struct srvsvc_NetShareCtr2 *ctr2;
1945 SRVSVC_CHECK_ADMIN_ACCESS;
1947 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
1948 W_ERROR_HAVE_NO_MEMORY(ctr2);
1951 ctr2->count = count;
1954 if (ctr2->count == 0) {
1955 r->out.ctr.ctr2 = ctr2;
1959 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, count);
1960 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
1962 for (i=0; i < count; i++) {
1964 union srvsvc_NetShareInfo info;
1965 enum srvsvc_ShareType type;
1967 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1968 if (!NT_STATUS_IS_OK(nterr)) {
1969 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1970 return WERR_GENERAL_FAILURE;
1973 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1974 if (type & STYPE_HIDDEN) {
1980 info.info2 = &ctr2->array[y];
1981 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1982 W_ERROR_NOT_OK_RETURN(status);
1986 talloc_free(snames);
1988 r->out.ctr.ctr2 = ctr2;
1989 r->out.totalentries = r->out.ctr.ctr2->count;
1996 struct srvsvc_NetShareCtr502 *ctr502;
1998 SRVSVC_CHECK_ADMIN_ACCESS;
2000 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
2001 W_ERROR_HAVE_NO_MEMORY(ctr502);
2004 ctr502->count = count;
2005 ctr502->array = NULL;
2007 if (ctr502->count == 0) {
2008 r->out.ctr.ctr502 = ctr502;
2012 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, count);
2013 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
2015 for (i=0; i < count; i++) {
2017 union srvsvc_NetShareInfo info;
2018 enum srvsvc_ShareType type;
2020 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
2021 if (!NT_STATUS_IS_OK(nterr)) {
2022 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
2023 return WERR_GENERAL_FAILURE;
2026 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
2027 if (type & STYPE_HIDDEN) {
2033 info.info502 = &ctr502->array[y];
2034 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
2035 W_ERROR_NOT_OK_RETURN(status);
2039 talloc_free(snames);
2041 r->out.ctr.ctr502 = ctr502;
2042 r->out.totalentries = r->out.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"