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.level = r->in.level;
339 r->out.totalentries = 0;
340 r->out.resume_handle = NULL;
342 switch (r->in.level) {
345 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetSessCtr0);
346 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
348 r->out.ctr.ctr0->count = 0;
349 r->out.ctr.ctr0->array = NULL;
351 return WERR_NOT_SUPPORTED;
355 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetSessCtr1);
356 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
358 r->out.ctr.ctr1->count = 0;
359 r->out.ctr.ctr1->array = NULL;
361 return WERR_NOT_SUPPORTED;
365 r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetSessCtr2);
366 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
368 r->out.ctr.ctr2->count = 0;
369 r->out.ctr.ctr2->array = NULL;
371 return WERR_NOT_SUPPORTED;
375 r->out.ctr.ctr10 = talloc(mem_ctx, struct srvsvc_NetSessCtr10);
376 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr10);
378 r->out.ctr.ctr2->count = 0;
379 r->out.ctr.ctr2->array = NULL;
381 return WERR_NOT_SUPPORTED;
385 r->out.ctr.ctr502 = talloc(mem_ctx, struct srvsvc_NetSessCtr502);
386 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr502);
388 r->out.ctr.ctr2->count = 0;
389 r->out.ctr.ctr2->array = NULL;
391 return WERR_NOT_SUPPORTED;
394 return WERR_UNKNOWN_LEVEL;
397 return WERR_UNKNOWN_LEVEL;
404 static WERROR dcesrv_srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
405 struct srvsvc_NetSessDel *r)
407 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
414 static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
415 struct srvsvc_NetShareAdd *r)
417 switch (r->in.level) {
420 if (r->in.parm_error) {
421 r->out.parm_error = r->in.parm_error;
423 return WERR_NOT_SUPPORTED;
427 if (r->in.parm_error) {
428 r->out.parm_error = r->in.parm_error;
430 return WERR_NOT_SUPPORTED;
435 struct share_info *info;
436 struct share_context *sctx;
440 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);
441 if (!NT_STATUS_IS_OK(nterr)) {
442 return ntstatus_to_werror(nterr);
445 /* there are no more than 8 options in struct srvsvc_NetShareInfo2 */
446 info = talloc_array(mem_ctx, struct share_info, count);
447 W_ERROR_HAVE_NO_MEMORY(info);
451 info[i].name = SHARE_TYPE;
452 info[i].type = SHARE_INFO_STRING;
453 switch (r->in.info->info2->type) {
455 info[i].value = talloc_strdup(info, "DISK");
458 info[i].value = talloc_strdup(info, "PRINTER");
461 info[i].value = talloc_strdup(info, "IPC");
464 return WERR_INVALID_PARAM;
466 W_ERROR_HAVE_NO_MEMORY(info[i].value);
469 if (r->in.info->info2->path && r->in.info->info2->path[0]) {
470 info[i].name = SHARE_PATH;
471 info[i].type = SHARE_INFO_STRING;
473 /* Windows will send a path in a form of C:\example\path */
474 if (r->in.info->info2->path[1] == ':') {
475 info[i].value = talloc_strdup(info, &r->in.info->info2->path[2]);
477 /* very strange let's try to set as is */
478 info[i].value = talloc_strdup(info, r->in.info->info2->path);
480 W_ERROR_HAVE_NO_MEMORY(info[i].value);
481 all_string_sub((char *)info[i].value, "\\", "/", 0);
486 if (r->in.info->info2->comment && r->in.info->info2->comment[0]) {
487 info[i].name = SHARE_COMMENT;
488 info[i].type = SHARE_INFO_STRING;
489 info[i].value = talloc_strdup(info, r->in.info->info2->comment);
490 W_ERROR_HAVE_NO_MEMORY(info[i].value);
495 if (r->in.info->info2->password && r->in.info->info2->password[0]) {
496 info[i].name = SHARE_PASSWORD;
497 info[i].type = SHARE_INFO_STRING;
498 info[i].value = talloc_strdup(info, r->in.info->info2->password);
499 W_ERROR_HAVE_NO_MEMORY(info[i].value);
504 info[i].name = SHARE_MAX_CONNECTIONS;
505 info[i].type = SHARE_INFO_INT;
506 info[i].value = talloc(info, int);
507 *((int *)info[i].value) = r->in.info->info2->max_users;
510 /* TODO: security descriptor */
512 nterr = share_create(sctx, r->in.info->info2->name, info, i);
513 if (!NT_STATUS_IS_OK(nterr)) {
514 return ntstatus_to_werror(nterr);
517 if (r->in.parm_error) {
518 r->out.parm_error = r->in.parm_error;
525 if (r->in.parm_error) {
526 r->out.parm_error = r->in.parm_error;
528 return WERR_NOT_SUPPORTED;
533 struct share_info *info;
534 struct share_context *sctx;
538 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);
539 if (!NT_STATUS_IS_OK(nterr)) {
540 return ntstatus_to_werror(nterr);
543 /* there are no more than 10 options in struct srvsvc_NetShareInfo502 */
544 info = talloc_array(mem_ctx, struct share_info, count);
545 W_ERROR_HAVE_NO_MEMORY(info);
549 info[i].name = SHARE_TYPE;
550 info[i].type = SHARE_INFO_STRING;
551 switch (r->in.info->info502->type) {
553 info[i].value = talloc_strdup(info, "DISK");
556 info[i].value = talloc_strdup(info, "PRINTER");
559 info[i].value = talloc_strdup(info, "IPC");
562 return WERR_INVALID_PARAM;
564 W_ERROR_HAVE_NO_MEMORY(info[i].value);
567 if (r->in.info->info502->path && r->in.info->info502->path[0]) {
568 info[i].name = SHARE_PATH;
569 info[i].type = SHARE_INFO_STRING;
571 /* Windows will send a path in a form of C:\example\path */
572 if (r->in.info->info502->path[1] == ':') {
573 info[i].value = talloc_strdup(info, &r->in.info->info502->path[2]);
575 /* very strange let's try to set as is */
576 info[i].value = talloc_strdup(info, r->in.info->info502->path);
578 W_ERROR_HAVE_NO_MEMORY(info[i].value);
579 all_string_sub((char *)info[i].value, "\\", "/", 0);
584 if (r->in.info->info502->comment && r->in.info->info502->comment[0]) {
585 info[i].name = SHARE_COMMENT;
586 info[i].type = SHARE_INFO_STRING;
587 info[i].value = talloc_strdup(info, r->in.info->info502->comment);
588 W_ERROR_HAVE_NO_MEMORY(info[i].value);
593 if (r->in.info->info502->password && r->in.info->info502->password[0]) {
594 info[i].name = SHARE_PASSWORD;
595 info[i].type = SHARE_INFO_STRING;
596 info[i].value = talloc_strdup(info, r->in.info->info502->password);
597 W_ERROR_HAVE_NO_MEMORY(info[i].value);
602 info[i].name = SHARE_MAX_CONNECTIONS;
603 info[i].type = SHARE_INFO_INT;
604 info[i].value = talloc(info, int);
605 *((int *)info[i].value) = r->in.info->info502->max_users;
608 /* TODO: security descriptor */
610 nterr = share_create(sctx, r->in.info->info502->name, info, i);
611 if (!NT_STATUS_IS_OK(nterr)) {
612 return ntstatus_to_werror(nterr);
615 if (r->in.parm_error) {
616 r->out.parm_error = r->in.parm_error;
622 return WERR_UNKNOWN_LEVEL;
625 return WERR_UNKNOWN_LEVEL;
628 static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
629 struct share_config *scfg, uint32_t level,
630 union srvsvc_NetShareInfo *info)
632 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
637 info->info0->name = talloc_strdup(mem_ctx, scfg->name);
638 W_ERROR_HAVE_NO_MEMORY(info->info0->name);
644 info->info1->name = talloc_strdup(mem_ctx, scfg->name);
645 W_ERROR_HAVE_NO_MEMORY(info->info1->name);
646 info->info1->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
647 info->info1->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
648 W_ERROR_HAVE_NO_MEMORY(info->info1->comment);
654 info->info2->name = talloc_strdup(mem_ctx, scfg->name);
655 W_ERROR_HAVE_NO_MEMORY(info->info2->name);
656 info->info2->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
657 info->info2->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
658 W_ERROR_HAVE_NO_MEMORY(info->info2->comment);
659 info->info2->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
660 info->info2->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
661 info->info2->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
662 info->info2->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
663 W_ERROR_HAVE_NO_MEMORY(info->info2->path);
664 info->info2->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
670 info->info501->name = talloc_strdup(mem_ctx, scfg->name);
671 W_ERROR_HAVE_NO_MEMORY(info->info501->name);
672 info->info501->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
673 info->info501->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
674 W_ERROR_HAVE_NO_MEMORY(info->info501->comment);
675 info->info501->csc_policy = share_int_option(scfg, SHARE_CSC_POLICY, SHARE_CSC_POLICY_DEFAULT);
681 info->info502->name = talloc_strdup(mem_ctx, scfg->name);
682 W_ERROR_HAVE_NO_MEMORY(info->info502->name);
683 info->info502->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
684 info->info502->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
685 W_ERROR_HAVE_NO_MEMORY(info->info502->comment);
686 info->info502->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
687 info->info502->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
688 info->info502->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
689 info->info502->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
690 W_ERROR_HAVE_NO_MEMORY(info->info502->path);
691 info->info502->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
692 info->info502->sd_buf.sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, scfg);
698 info->info1005->dfs_flags = dcesrv_common_get_share_dfs_flags(mem_ctx, dce_ctx, scfg);
703 return WERR_UNKNOWN_LEVEL;
706 return WERR_UNKNOWN_LEVEL;
710 srvsvc_NetShareEnumAll
712 static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
713 struct srvsvc_NetShareEnumAll *r)
718 struct share_context *sctx;
719 struct share_config *scfg;
721 r->out.level = r->in.level;
722 ZERO_STRUCT(r->out.ctr);
723 r->out.totalentries = 0;
724 r->out.resume_handle = NULL;
726 /* TODO: - paging of results
729 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);
730 if (!NT_STATUS_IS_OK(nterr)) {
731 return ntstatus_to_werror(nterr);
734 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
735 if (!NT_STATUS_IS_OK(nterr)) {
736 return ntstatus_to_werror(nterr);
739 switch (r->in.level) {
743 struct srvsvc_NetShareCtr0 *ctr0;
745 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
746 W_ERROR_HAVE_NO_MEMORY(ctr0);
748 ctr0->count = numshares;
751 if (ctr0->count == 0) {
752 r->out.ctr.ctr0 = ctr0;
756 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, ctr0->count);
757 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
759 for (i = 0; i < ctr0->count; i++) {
761 union srvsvc_NetShareInfo info;
763 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
764 if (!NT_STATUS_IS_OK(nterr)) {
765 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
766 return WERR_GENERAL_FAILURE;
768 info.info0 = &ctr0->array[i];
769 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
770 if (!W_ERROR_IS_OK(status)) {
777 r->out.ctr.ctr0 = ctr0;
778 r->out.totalentries = r->out.ctr.ctr0->count;
784 struct srvsvc_NetShareCtr1 *ctr1;
786 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
787 W_ERROR_HAVE_NO_MEMORY(ctr1);
789 ctr1->count = numshares;
792 if (ctr1->count == 0) {
793 r->out.ctr.ctr1 = ctr1;
797 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, ctr1->count);
798 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
800 for (i=0; i < ctr1->count; i++) {
802 union srvsvc_NetShareInfo info;
804 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
805 if (!NT_STATUS_IS_OK(nterr)) {
806 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
807 return WERR_GENERAL_FAILURE;
809 info.info1 = &ctr1->array[i];
810 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
811 if (!W_ERROR_IS_OK(status)) {
818 r->out.ctr.ctr1 = ctr1;
819 r->out.totalentries = r->out.ctr.ctr1->count;
825 struct srvsvc_NetShareCtr2 *ctr2;
827 SRVSVC_CHECK_ADMIN_ACCESS;
829 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
830 W_ERROR_HAVE_NO_MEMORY(ctr2);
832 ctr2->count = numshares;
835 if (ctr2->count == 0) {
836 r->out.ctr.ctr2 = ctr2;
840 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, ctr2->count);
841 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
843 for (i=0; i < ctr2->count; i++) {
845 union srvsvc_NetShareInfo info;
847 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
848 if (!NT_STATUS_IS_OK(nterr)) {
849 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
850 return WERR_GENERAL_FAILURE;
852 info.info2 = &ctr2->array[i];
853 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
854 if (!W_ERROR_IS_OK(status)) {
861 r->out.ctr.ctr2 = ctr2;
862 r->out.totalentries = r->out.ctr.ctr2->count;
868 struct srvsvc_NetShareCtr501 *ctr501;
870 SRVSVC_CHECK_ADMIN_ACCESS;
872 ctr501 = talloc(mem_ctx, struct srvsvc_NetShareCtr501);
873 W_ERROR_HAVE_NO_MEMORY(ctr501);
875 ctr501->count = numshares;
876 ctr501->array = NULL;
878 if (ctr501->count == 0) {
879 r->out.ctr.ctr501 = ctr501;
883 ctr501->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo501, ctr501->count);
884 W_ERROR_HAVE_NO_MEMORY(ctr501->array);
886 for (i=0; i < ctr501->count; i++) {
888 union srvsvc_NetShareInfo info;
890 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
891 if (!NT_STATUS_IS_OK(nterr)) {
892 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
893 return WERR_GENERAL_FAILURE;
895 info.info501 = &ctr501->array[i];
896 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
897 if (!W_ERROR_IS_OK(status)) {
904 r->out.ctr.ctr501 = ctr501;
905 r->out.totalentries = r->out.ctr.ctr501->count;
911 struct srvsvc_NetShareCtr502 *ctr502;
913 SRVSVC_CHECK_ADMIN_ACCESS;
915 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
916 W_ERROR_HAVE_NO_MEMORY(ctr502);
918 ctr502->count = numshares;
919 ctr502->array = NULL;
921 if (ctr502->count == 0) {
922 r->out.ctr.ctr502 = ctr502;
926 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, ctr502->count);
927 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
929 for (i=0; i < ctr502->count; i++) {
931 union srvsvc_NetShareInfo info;
933 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
934 if (!NT_STATUS_IS_OK(nterr)) {
935 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
936 return WERR_GENERAL_FAILURE;
938 info.info502 = &ctr502->array[i];
939 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
940 if (!W_ERROR_IS_OK(status)) {
947 r->out.ctr.ctr502 = ctr502;
948 r->out.totalentries = r->out.ctr.ctr502->count;
952 return WERR_UNKNOWN_LEVEL;
955 return WERR_UNKNOWN_LEVEL;
960 srvsvc_NetShareGetInfo
962 static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
963 struct srvsvc_NetShareGetInfo *r)
966 struct share_context *sctx = NULL;
967 struct share_config *scfg = NULL;
969 ZERO_STRUCTP(r->out.info);
971 /* TODO: - access check
974 if (strcmp("", r->in.share_name) == 0) {
975 return WERR_INVALID_PARAM;
978 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);
979 if (!NT_STATUS_IS_OK(nterr)) {
980 return ntstatus_to_werror(nterr);
983 nterr = share_get_config(mem_ctx, sctx, r->in.share_name, &scfg);
984 if (!NT_STATUS_IS_OK(nterr)) {
985 return ntstatus_to_werror(nterr);
988 switch (r->in.level) {
992 union srvsvc_NetShareInfo info;
994 info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0);
995 W_ERROR_HAVE_NO_MEMORY(info.info0);
997 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
998 if (!W_ERROR_IS_OK(status)) {
1002 r->out.info->info0 = info.info0;
1008 union srvsvc_NetShareInfo info;
1010 info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1);
1011 W_ERROR_HAVE_NO_MEMORY(info.info1);
1013 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1014 if (!W_ERROR_IS_OK(status)) {
1018 r->out.info->info1 = info.info1;
1024 union srvsvc_NetShareInfo info;
1026 SRVSVC_CHECK_ADMIN_ACCESS;
1028 info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
1029 W_ERROR_HAVE_NO_MEMORY(info.info2);
1031 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1032 if (!W_ERROR_IS_OK(status)) {
1036 r->out.info->info2 = info.info2;
1042 union srvsvc_NetShareInfo info;
1044 info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501);
1045 W_ERROR_HAVE_NO_MEMORY(info.info501);
1047 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1048 if (!W_ERROR_IS_OK(status)) {
1052 r->out.info->info501 = info.info501;
1058 union srvsvc_NetShareInfo info;
1060 SRVSVC_CHECK_ADMIN_ACCESS;
1062 info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502);
1063 W_ERROR_HAVE_NO_MEMORY(info.info502);
1065 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1066 if (!W_ERROR_IS_OK(status)) {
1070 r->out.info->info502 = info.info502;
1076 union srvsvc_NetShareInfo info;
1078 info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005);
1079 W_ERROR_HAVE_NO_MEMORY(info.info1005);
1081 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1082 if (!W_ERROR_IS_OK(status)) {
1086 r->out.info->info1005 = info.info1005;
1090 return WERR_UNKNOWN_LEVEL;
1093 return WERR_UNKNOWN_LEVEL;
1096 static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count,
1097 const char *share_name, int level,
1100 const char *comment,
1101 const char *password,
1102 enum srvsvc_ShareType type,
1104 uint32_t csc_policy,
1105 struct security_descriptor *sd)
1110 info[i].name = SHARE_CSC_POLICY;
1111 info[i].type = SHARE_INFO_INT;
1112 info[i].value = talloc(info, int);
1113 *((int *)info[i].value) = csc_policy;
1120 /* TODO: check if unknown is csc_policy */
1122 /* TODO: security descriptor */
1125 if (path && path[0]) {
1126 info[i].name = SHARE_PATH;
1127 info[i].type = SHARE_INFO_STRING;
1129 /* Windows will send a path in a form of C:\example\path */
1130 if (path[1] == ':') {
1131 info[i].value = talloc_strdup(info, &path[2]);
1133 /* very strange let's try to set as is */
1134 info[i].value = talloc_strdup(info, path);
1136 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1137 all_string_sub((char *)info[i].value, "\\", "/", 0);
1142 if (password && password[0]) {
1143 info[i].name = SHARE_PASSWORD;
1144 info[i].type = SHARE_INFO_STRING;
1145 info[i].value = talloc_strdup(info, password);
1146 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1151 info[i].name = SHARE_MAX_CONNECTIONS;
1152 info[i].type = SHARE_INFO_INT;
1153 info[i].value = talloc(info, int);
1154 *((int *)info[i].value) = max_users;
1159 info[i].name = SHARE_TYPE;
1160 info[i].type = SHARE_INFO_STRING;
1163 info[i].value = talloc_strdup(info, "DISK");
1166 info[i].value = talloc_strdup(info, "PRINTER");
1169 info[i].value = talloc_strdup(info, "IPC");
1172 return WERR_INVALID_PARAM;
1174 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1179 info[i].name = SHARE_COMMENT;
1180 info[i].type = SHARE_INFO_STRING;
1181 info[i].value = talloc_strdup(info, comment);
1182 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1188 strcasecmp(share_name, name) != 0) {
1189 info[i].name = SHARE_NAME;
1190 info[i].type = SHARE_INFO_STRING;
1191 info[i].value = talloc_strdup(info, name);
1192 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1199 return WERR_UNKNOWN_LEVEL;
1208 srvsvc_NetShareSetInfo
1210 static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1211 struct srvsvc_NetShareSetInfo *r)
1215 struct share_context *sctx = NULL;
1216 struct share_info *info;
1219 /* TODO: - access check
1222 /* there are no more than 10 options in all struct srvsvc_NetShareInfoXXX */
1223 info = talloc_array(mem_ctx, struct share_info, 10);
1224 W_ERROR_HAVE_NO_MEMORY(info);
1226 ZERO_STRUCT(r->out);
1228 if (strcmp("", r->in.share_name) == 0) {
1229 return WERR_INVALID_PARAM;
1232 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);
1233 if (!NT_STATUS_IS_OK(nterr)) {
1234 return ntstatus_to_werror(nterr);
1237 switch (r->in.level) {
1240 status = dcesrv_srvsvc_fill_share_info(info, &count,
1241 r->in.share_name, r->in.level,
1242 r->in.info->info0->name,
1250 if (W_ERROR_EQUAL(status, WERR_OK)) {
1257 status = dcesrv_srvsvc_fill_share_info(info, &count,
1258 r->in.share_name, r->in.level,
1259 r->in.info->info1->name,
1261 r->in.info->info1->comment,
1263 r->in.info->info1->type,
1267 if (W_ERROR_EQUAL(status, WERR_OK)) {
1274 status = dcesrv_srvsvc_fill_share_info(info, &count,
1275 r->in.share_name, r->in.level,
1276 r->in.info->info2->name,
1277 r->in.info->info2->path,
1278 r->in.info->info2->comment,
1279 r->in.info->info2->password,
1280 r->in.info->info2->type,
1281 r->in.info->info2->max_users,
1284 if (W_ERROR_EQUAL(status, WERR_OK)) {
1291 status = dcesrv_srvsvc_fill_share_info(info, &count,
1292 r->in.share_name, r->in.level,
1293 r->in.info->info501->name,
1295 r->in.info->info501->comment,
1297 r->in.info->info501->type,
1299 r->in.info->info501->csc_policy,
1301 if (W_ERROR_EQUAL(status, WERR_OK)) {
1308 status = dcesrv_srvsvc_fill_share_info(info, &count,
1309 r->in.share_name, r->in.level,
1310 r->in.info->info502->name,
1311 r->in.info->info502->path,
1312 r->in.info->info502->comment,
1313 r->in.info->info502->password,
1314 r->in.info->info502->type,
1315 r->in.info->info502->max_users,
1317 r->in.info->info502->sd_buf.sd);
1318 if (W_ERROR_EQUAL(status, WERR_OK)) {
1325 status = dcesrv_srvsvc_fill_share_info(info, &count,
1326 r->in.share_name, r->in.level,
1329 r->in.info->info1004->comment,
1335 if (W_ERROR_EQUAL(status, WERR_OK)) {
1342 /* r->in.info.dfs_flags; */
1344 if (r->in.parm_error) {
1345 r->out.parm_error = r->in.parm_error;
1351 return WERR_UNKNOWN_LEVEL;
1354 nterr = share_set(sctx, r->in.share_name, info, count);
1355 if (!NT_STATUS_IS_OK(nterr)) {
1356 return ntstatus_to_werror(nterr);
1359 if (r->in.parm_error) {
1360 r->out.parm_error = r->in.parm_error;
1368 srvsvc_NetShareDelSticky
1370 static WERROR dcesrv_srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1371 struct srvsvc_NetShareDelSticky *r)
1373 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1378 srvsvc_NetShareCheck
1380 static WERROR dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1381 struct srvsvc_NetShareCheck *r)
1384 struct share_context *sctx = NULL;
1385 struct share_config *scfg = NULL;
1392 /* TODO: - access check
1395 if (strcmp("", r->in.device_name) == 0) {
1396 *r->out.type = STYPE_IPC;
1400 /* copy the path skipping C:\ */
1401 if (strncasecmp(r->in.device_name, "C:", 2) == 0) {
1402 device = talloc_strdup(mem_ctx, &r->in.device_name[2]);
1404 /* no chance we have a share that doesn't start with C:\ */
1405 return WERR_DEVICE_NOT_SHARED;
1407 all_string_sub(device, "\\", "/", 0);
1409 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);
1410 if (!NT_STATUS_IS_OK(nterr)) {
1411 return ntstatus_to_werror(nterr);
1414 nterr = share_list_all(mem_ctx, sctx, &count, &names);
1415 if (!NT_STATUS_IS_OK(nterr)) {
1416 return ntstatus_to_werror(nterr);
1419 for (i = 0; i < count; i++) {
1423 nterr = share_get_config(mem_ctx, sctx, names[i], &scfg);
1424 if (!NT_STATUS_IS_OK(nterr)) {
1425 return ntstatus_to_werror(nterr);
1427 path = share_string_option(scfg, SHARE_PATH, NULL);
1428 if (!path) continue;
1430 if (strcmp(device, path) == 0) {
1431 type = share_string_option(scfg, SHARE_TYPE, NULL);
1432 if (!type) continue;
1434 if (strcmp(type, "DISK") == 0) {
1435 *r->out.type = STYPE_DISKTREE;
1439 if (strcmp(type, "IPC") == 0) {
1440 *r->out.type = STYPE_IPC;
1444 if (strcmp(type, "PRINTER") == 0) {
1445 *r->out.type = STYPE_PRINTQ;
1451 return WERR_DEVICE_NOT_SHARED;
1456 srvsvc_NetSrvGetInfo
1458 static WERROR dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1459 struct srvsvc_NetSrvGetInfo *r)
1461 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1463 ZERO_STRUCTP(r->out.info);
1465 switch (r->in.level) {
1468 struct srvsvc_NetSrvInfo100 *info100;
1470 info100 = talloc(mem_ctx, struct srvsvc_NetSrvInfo100);
1471 W_ERROR_HAVE_NO_MEMORY(info100);
1473 info100->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1474 info100->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1475 W_ERROR_HAVE_NO_MEMORY(info100->server_name);
1477 r->out.info->info100 = info100;
1482 struct srvsvc_NetSrvInfo101 *info101;
1484 info101 = talloc(mem_ctx, struct srvsvc_NetSrvInfo101);
1485 W_ERROR_HAVE_NO_MEMORY(info101);
1487 info101->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1488 info101->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1489 W_ERROR_HAVE_NO_MEMORY(info101->server_name);
1491 info101->version_major = dcesrv_common_get_version_major(mem_ctx, dce_ctx->lp_ctx);
1492 info101->version_minor = dcesrv_common_get_version_minor(mem_ctx, dce_ctx->lp_ctx);
1493 info101->server_type = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
1494 info101->comment = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
1495 W_ERROR_HAVE_NO_MEMORY(info101->comment);
1497 r->out.info->info101 = info101;
1502 struct srvsvc_NetSrvInfo102 *info102;
1504 info102 = talloc(mem_ctx, struct srvsvc_NetSrvInfo102);
1505 W_ERROR_HAVE_NO_MEMORY(info102);
1507 info102->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1508 info102->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1509 W_ERROR_HAVE_NO_MEMORY(info102->server_name);
1511 info102->version_major = dcesrv_common_get_version_major(mem_ctx, dce_ctx->lp_ctx);
1512 info102->version_minor = dcesrv_common_get_version_minor(mem_ctx, dce_ctx->lp_ctx);
1513 info102->server_type = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
1514 info102->comment = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
1515 W_ERROR_HAVE_NO_MEMORY(info102->comment);
1517 info102->users = dcesrv_common_get_users(mem_ctx, dce_ctx);
1518 info102->disc = dcesrv_common_get_disc(mem_ctx, dce_ctx);
1519 info102->hidden = dcesrv_common_get_hidden(mem_ctx, dce_ctx);
1520 info102->announce = dcesrv_common_get_announce(mem_ctx, dce_ctx);
1521 info102->anndelta = dcesrv_common_get_anndelta(mem_ctx, dce_ctx);
1522 info102->licenses = dcesrv_common_get_licenses(mem_ctx, dce_ctx);
1523 info102->userpath = dcesrv_common_get_userpath(mem_ctx, dce_ctx);
1524 W_ERROR_HAVE_NO_MEMORY(info102->userpath);
1526 r->out.info->info102 = info102;
1530 return WERR_UNKNOWN_LEVEL;
1533 return WERR_UNKNOWN_LEVEL;
1538 srvsvc_NetSrvSetInfo
1540 static WERROR dcesrv_srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1541 struct srvsvc_NetSrvSetInfo *r)
1543 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1550 static WERROR dcesrv_srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1551 struct srvsvc_NetDiskEnum *r)
1553 r->out.info->disks = NULL;
1554 r->out.info->count = 0;
1555 *r->out.totalentries = 0;
1557 switch (r->in.level) {
1560 /* we can safely hardcode the reply and report we have only one disk (C:) */
1561 /* for some reason Windows wants 2 entries with the second being empty */
1562 r->out.info->disks = talloc_array(mem_ctx, struct srvsvc_NetDiskInfo0, 2);
1563 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks);
1564 r->out.info->count = 2;
1566 r->out.info->disks[0].disk = talloc_strdup(mem_ctx, "C:");
1567 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[0].disk);
1569 r->out.info->disks[1].disk = talloc_strdup(mem_ctx, "");
1570 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[1].disk);
1572 *r->out.totalentries = 1;
1573 r->out.resume_handle = r->in.resume_handle;
1578 return WERR_UNKNOWN_LEVEL;
1581 return WERR_UNKNOWN_LEVEL;
1586 srvsvc_NetServerStatisticsGet
1588 static WERROR dcesrv_srvsvc_NetServerStatisticsGet(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1589 struct srvsvc_NetServerStatisticsGet *r)
1591 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1596 srvsvc_NetTransportAdd
1598 static WERROR dcesrv_srvsvc_NetTransportAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1599 struct srvsvc_NetTransportAdd *r)
1601 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1606 srvsvc_NetTransportEnum
1608 static WERROR dcesrv_srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1609 struct srvsvc_NetTransportEnum *r)
1611 r->out.transports->level = r->in.transports->level;
1612 *r->out.totalentries = 0;
1613 if (r->out.resume_handle) {
1614 *r->out.resume_handle = 0;
1617 switch (r->in.transports->level) {
1620 r->out.transports->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetTransportCtr0);
1621 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr0);
1623 r->out.transports->ctr.ctr0->count = 0;
1624 r->out.transports->ctr.ctr0->array = NULL;
1626 return WERR_NOT_SUPPORTED;
1630 r->out.transports->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetTransportCtr1);
1631 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr1);
1633 r->out.transports->ctr.ctr1->count = 0;
1634 r->out.transports->ctr.ctr1->array = NULL;
1636 return WERR_NOT_SUPPORTED;
1640 r->out.transports->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetTransportCtr2);
1641 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr2);
1643 r->out.transports->ctr.ctr2->count = 0;
1644 r->out.transports->ctr.ctr2->array = NULL;
1646 return WERR_NOT_SUPPORTED;
1650 r->out.transports->ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetTransportCtr3);
1651 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr3);
1653 r->out.transports->ctr.ctr3->count = 0;
1654 r->out.transports->ctr.ctr3->array = NULL;
1656 return WERR_NOT_SUPPORTED;
1659 return WERR_UNKNOWN_LEVEL;
1662 return WERR_UNKNOWN_LEVEL;
1666 srvsvc_NetTransportDel
1668 static WERROR dcesrv_srvsvc_NetTransportDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1669 struct srvsvc_NetTransportDel *r)
1671 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1678 static WERROR dcesrv_srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1679 struct srvsvc_NetRemoteTOD *r)
1681 struct timeval tval;
1684 struct srvsvc_NetRemoteTODInfo *info;
1686 info = talloc(mem_ctx, struct srvsvc_NetRemoteTODInfo);
1687 W_ERROR_HAVE_NO_MEMORY(info);
1689 GetTimeOfDay(&tval);
1695 /* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
1696 info->msecs = (tm.tm_hour*60*60*1000)
1697 + (tm.tm_min*60*1000)
1699 + (tval.tv_usec/1000);
1700 info->hours = tm.tm_hour;
1701 info->mins = tm.tm_min;
1702 info->secs = tm.tm_sec;
1703 info->hunds = tval.tv_usec/10000;
1704 info->timezone = get_time_zone(t)/60;
1705 info->tinterval = 310; /* just return the same as windows */
1706 info->day = tm.tm_mday;
1707 info->month = tm.tm_mon + 1;
1708 info->year = tm.tm_year + 1900;
1709 info->weekday = tm.tm_wday;
1711 *r->out.info = info;
1719 static WERROR dcesrv_srvsvc_NetPathType(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1720 struct srvsvc_NetPathType *r)
1722 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1727 srvsvc_NetPathCanonicalize
1729 static WERROR dcesrv_srvsvc_NetPathCanonicalize(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1730 struct srvsvc_NetPathCanonicalize *r)
1732 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1737 srvsvc_NetPathCompare
1739 static WERROR dcesrv_srvsvc_NetPathCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1740 struct srvsvc_NetPathCompare *r)
1742 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1747 srvsvc_NetNameValidate
1749 static WERROR dcesrv_srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1750 struct srvsvc_NetNameValidate *r)
1754 if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) {
1755 return WERR_INVALID_NAME;
1758 switch (r->in.name_type) {
1767 return WERR_NOT_SUPPORTED;
1769 case 9: /* validate share name */
1771 len = strlen_m(r->in.name);
1772 if ((r->in.flags == 0x0) && (len > 81)) {
1773 return WERR_INVALID_NAME;
1775 if ((r->in.flags == 0x80000000) && (len > 13)) {
1776 return WERR_INVALID_NAME;
1778 if (! dcesrv_common_validate_share_name(mem_ctx, r->in.name)) {
1779 return WERR_INVALID_NAME;
1787 return WERR_NOT_SUPPORTED;
1789 return WERR_INVALID_PARAM;
1792 return WERR_INVALID_PARAM;
1797 srvsvc_NetPRNameCompare
1799 static WERROR dcesrv_srvsvc_NetPRNameCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1800 struct srvsvc_NetPRNameCompare *r)
1802 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1809 static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1810 struct srvsvc_NetShareEnum *r)
1814 const char **snames;
1815 struct share_context *sctx;
1816 struct share_config *scfg;
1817 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1819 r->out.level = r->in.level;
1820 ZERO_STRUCT(r->out.ctr);
1821 r->out.totalentries = 0;
1822 r->out.resume_handle = NULL;
1824 /* TODO: - paging of results
1827 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);
1828 if (!NT_STATUS_IS_OK(nterr)) {
1829 return ntstatus_to_werror(nterr);
1832 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
1833 if (!NT_STATUS_IS_OK(nterr)) {
1834 return ntstatus_to_werror(nterr);
1837 switch (r->in.level) {
1842 struct srvsvc_NetShareCtr0 *ctr0;
1844 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
1845 W_ERROR_HAVE_NO_MEMORY(ctr0);
1848 ctr0->count = count;
1851 if (ctr0->count == 0) {
1852 r->out.ctr.ctr0 = ctr0;
1856 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, count);
1857 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
1859 for (i=0; i < count; i++) {
1861 union srvsvc_NetShareInfo info;
1862 enum srvsvc_ShareType type;
1864 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1865 if (!NT_STATUS_IS_OK(nterr)) {
1866 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1867 return WERR_GENERAL_FAILURE;
1870 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1871 if (type & STYPE_HIDDEN) {
1877 info.info0 = &ctr0->array[y];
1878 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1879 W_ERROR_NOT_OK_RETURN(status);
1883 talloc_free(snames);
1885 r->out.ctr.ctr0 = ctr0;
1886 r->out.totalentries = r->out.ctr.ctr0->count;
1893 struct srvsvc_NetShareCtr1 *ctr1;
1895 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
1896 W_ERROR_HAVE_NO_MEMORY(ctr1);
1899 ctr1->count = count;
1902 if (ctr1->count == 0) {
1903 r->out.ctr.ctr1 = ctr1;
1907 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, count);
1908 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
1910 for (i=0; i < count; i++) {
1912 union srvsvc_NetShareInfo info;
1913 enum srvsvc_ShareType type;
1915 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1916 if (!NT_STATUS_IS_OK(nterr)) {
1917 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1918 return WERR_GENERAL_FAILURE;
1921 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1922 if (type & STYPE_HIDDEN) {
1928 info.info1 = &ctr1->array[y];
1929 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1930 W_ERROR_NOT_OK_RETURN(status);
1934 talloc_free(snames);
1936 r->out.ctr.ctr1 = ctr1;
1937 r->out.totalentries = r->out.ctr.ctr1->count;
1944 struct srvsvc_NetShareCtr2 *ctr2;
1946 SRVSVC_CHECK_ADMIN_ACCESS;
1948 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
1949 W_ERROR_HAVE_NO_MEMORY(ctr2);
1952 ctr2->count = count;
1955 if (ctr2->count == 0) {
1956 r->out.ctr.ctr2 = ctr2;
1960 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, count);
1961 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
1963 for (i=0; i < count; i++) {
1965 union srvsvc_NetShareInfo info;
1966 enum srvsvc_ShareType type;
1968 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1969 if (!NT_STATUS_IS_OK(nterr)) {
1970 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1971 return WERR_GENERAL_FAILURE;
1974 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1975 if (type & STYPE_HIDDEN) {
1981 info.info2 = &ctr2->array[y];
1982 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1983 W_ERROR_NOT_OK_RETURN(status);
1987 talloc_free(snames);
1989 r->out.ctr.ctr2 = ctr2;
1990 r->out.totalentries = r->out.ctr.ctr2->count;
1997 struct srvsvc_NetShareCtr502 *ctr502;
1999 SRVSVC_CHECK_ADMIN_ACCESS;
2001 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
2002 W_ERROR_HAVE_NO_MEMORY(ctr502);
2005 ctr502->count = count;
2006 ctr502->array = NULL;
2008 if (ctr502->count == 0) {
2009 r->out.ctr.ctr502 = ctr502;
2013 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, count);
2014 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
2016 for (i=0; i < count; i++) {
2018 union srvsvc_NetShareInfo info;
2019 enum srvsvc_ShareType type;
2021 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
2022 if (!NT_STATUS_IS_OK(nterr)) {
2023 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
2024 return WERR_GENERAL_FAILURE;
2027 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
2028 if (type & STYPE_HIDDEN) {
2034 info.info502 = &ctr502->array[y];
2035 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
2036 W_ERROR_NOT_OK_RETURN(status);
2040 talloc_free(snames);
2042 r->out.ctr.ctr502 = ctr502;
2043 r->out.totalentries = r->out.ctr.ctr502->count;
2047 return WERR_UNKNOWN_LEVEL;
2050 return WERR_UNKNOWN_LEVEL;
2055 srvsvc_NetShareDelStart
2057 static WERROR dcesrv_srvsvc_NetShareDelStart(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2058 struct srvsvc_NetShareDelStart *r)
2060 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2065 srvsvc_NetShareDelCommit
2067 static WERROR dcesrv_srvsvc_NetShareDelCommit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2068 struct srvsvc_NetShareDelCommit *r)
2070 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2075 srvsvc_NetGetFileSecurity
2077 static WERROR dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2078 struct srvsvc_NetGetFileSecurity *r)
2080 struct sec_desc_buf *sd_buf;
2081 struct ntvfs_context *ntvfs_ctx = NULL;
2082 struct ntvfs_request *ntvfs_req;
2083 union smb_fileinfo *io;
2086 nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
2087 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2089 ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
2090 dce_call->conn->auth_state.session_info,
2094 W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
2096 sd_buf = talloc(mem_ctx, struct sec_desc_buf);
2097 W_ERROR_HAVE_NO_MEMORY(sd_buf);
2099 io = talloc(mem_ctx, union smb_fileinfo);
2100 W_ERROR_HAVE_NO_MEMORY(io);
2102 io->query_secdesc.level = RAW_FILEINFO_SEC_DESC;
2103 io->query_secdesc.in.file.path = r->in.file;
2104 io->query_secdesc.in.secinfo_flags = r->in.securityinformation;
2106 nt_status = ntvfs_qpathinfo(ntvfs_req, io);
2107 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2109 sd_buf->sd = io->query_secdesc.out.sd;
2111 *r->out.sd_buf = sd_buf;
2117 srvsvc_NetSetFileSecurity
2119 static WERROR dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2120 struct srvsvc_NetSetFileSecurity *r)
2122 struct ntvfs_context *ntvfs_ctx;
2123 struct ntvfs_request *ntvfs_req;
2124 union smb_setfileinfo *io;
2127 nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
2128 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2130 ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
2131 dce_call->conn->auth_state.session_info,
2135 W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
2137 io = talloc(mem_ctx, union smb_setfileinfo);
2138 W_ERROR_HAVE_NO_MEMORY(io);
2140 io->set_secdesc.level = RAW_FILEINFO_SEC_DESC;
2141 io->set_secdesc.in.file.path = r->in.file;
2142 io->set_secdesc.in.secinfo_flags = r->in.securityinformation;
2143 io->set_secdesc.in.sd = r->in.sd_buf->sd;
2145 nt_status = ntvfs_setpathinfo(ntvfs_req, io);
2146 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2153 srvsvc_NetServerTransportAddEx
2155 static WERROR dcesrv_srvsvc_NetServerTransportAddEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2156 struct srvsvc_NetServerTransportAddEx *r)
2158 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2163 srvsvc_NetServerSetServiceBitsEx
2165 static WERROR dcesrv_srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2166 struct srvsvc_NetServerSetServiceBitsEx *r)
2168 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2173 srvsvc_NETRDFSGETVERSION
2175 static WERROR dcesrv_srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2176 struct srvsvc_NETRDFSGETVERSION *r)
2178 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2183 srvsvc_NETRDFSCREATELOCALPARTITION
2185 static WERROR dcesrv_srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2186 struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
2188 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2193 srvsvc_NETRDFSDELETELOCALPARTITION
2195 static WERROR dcesrv_srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2196 struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
2198 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2203 srvsvc_NETRDFSSETLOCALVOLUMESTATE
2205 static WERROR dcesrv_srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2206 struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
2208 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2213 srvsvc_NETRDFSSETSERVERINFO
2215 static WERROR dcesrv_srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2216 struct srvsvc_NETRDFSSETSERVERINFO *r)
2218 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2223 srvsvc_NETRDFSCREATEEXITPOINT
2225 static WERROR dcesrv_srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2226 struct srvsvc_NETRDFSCREATEEXITPOINT *r)
2228 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2233 srvsvc_NETRDFSDELETEEXITPOINT
2235 static WERROR dcesrv_srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2236 struct srvsvc_NETRDFSDELETEEXITPOINT *r)
2238 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2243 srvsvc_NETRDFSMODIFYPREFIX
2245 static WERROR dcesrv_srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2246 struct srvsvc_NETRDFSMODIFYPREFIX *r)
2248 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2253 srvsvc_NETRDFSFIXLOCALVOLUME
2255 static WERROR dcesrv_srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2256 struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
2258 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2263 srvsvc_NETRDFSMANAGERREPORTSITEINFO
2265 static WERROR dcesrv_srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2266 struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
2268 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2273 srvsvc_NETRSERVERTRANSPORTDELEX
2275 static WERROR dcesrv_srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2276 struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
2278 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2284 static WERROR dcesrv_srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2285 struct srvsvc_NetShareDel *r)
2288 struct share_context *sctx;
2290 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);
2291 if (!NT_STATUS_IS_OK(nterr)) {
2292 return ntstatus_to_werror(nterr);
2295 nterr = share_remove(sctx, r->in.share_name);
2296 if (!NT_STATUS_IS_OK(nterr)) {
2297 return ntstatus_to_werror(nterr);
2304 srvsvc_NetSetServiceBits
2306 static WERROR dcesrv_srvsvc_NetSetServiceBits(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2307 struct srvsvc_NetSetServiceBits *r)
2309 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2313 srvsvc_NETRPRNAMECANONICALIZE
2315 static WERROR dcesrv_srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2316 struct srvsvc_NETRPRNAMECANONICALIZE *r)
2318 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2321 /* include the generated boilerplate */
2322 #include "librpc/gen_ndr/ndr_srvsvc_s.c"