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.level = r->in.level;
230 r->out.totalentries = 0;
231 r->out.resume_handle = NULL;
233 switch (r->in.level) {
236 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetConnCtr0);
237 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
239 r->out.ctr.ctr0->count = 0;
240 r->out.ctr.ctr0->array = NULL;
242 return WERR_NOT_SUPPORTED;
246 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetConnCtr1);
247 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
249 r->out.ctr.ctr1->count = 0;
250 r->out.ctr.ctr1->array = NULL;
252 return WERR_NOT_SUPPORTED;
255 return WERR_UNKNOWN_LEVEL;
258 return WERR_UNKNOWN_LEVEL;
265 static WERROR dcesrv_srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
266 struct srvsvc_NetFileEnum *r)
268 r->out.level = r->in.level;
269 r->out.totalentries = 0;
270 r->out.resume_handle = NULL;
272 switch (r->in.level) {
275 r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetFileCtr2);
276 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
278 r->out.ctr.ctr2->count = 0;
279 r->out.ctr.ctr2->array = NULL;
281 return WERR_NOT_SUPPORTED;
285 r->out.ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetFileCtr3);
286 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr3);
288 r->out.ctr.ctr3->count = 0;
289 r->out.ctr.ctr3->array = NULL;
291 return WERR_NOT_SUPPORTED;
294 return WERR_UNKNOWN_LEVEL;
297 return WERR_UNKNOWN_LEVEL;
302 srvsvc_NetFileGetInfo
304 static WERROR dcesrv_srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
305 struct srvsvc_NetFileGetInfo *r)
307 ZERO_STRUCTP(r->out.info);
309 switch (r->in.level) {
312 return WERR_NOT_SUPPORTED;
316 return WERR_NOT_SUPPORTED;
319 return WERR_UNKNOWN_LEVEL;
322 return WERR_UNKNOWN_LEVEL;
329 static WERROR dcesrv_srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
330 struct srvsvc_NetFileClose *r)
332 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
339 static WERROR dcesrv_srvsvc_NetSessEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
340 struct srvsvc_NetSessEnum *r)
342 r->out.level = r->in.level;
343 r->out.totalentries = 0;
344 r->out.resume_handle = NULL;
346 switch (r->in.level) {
349 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetSessCtr0);
350 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
352 r->out.ctr.ctr0->count = 0;
353 r->out.ctr.ctr0->array = NULL;
355 return WERR_NOT_SUPPORTED;
359 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetSessCtr1);
360 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
362 r->out.ctr.ctr1->count = 0;
363 r->out.ctr.ctr1->array = NULL;
365 return WERR_NOT_SUPPORTED;
369 r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetSessCtr2);
370 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
372 r->out.ctr.ctr2->count = 0;
373 r->out.ctr.ctr2->array = NULL;
375 return WERR_NOT_SUPPORTED;
379 r->out.ctr.ctr10 = talloc(mem_ctx, struct srvsvc_NetSessCtr10);
380 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr10);
382 r->out.ctr.ctr2->count = 0;
383 r->out.ctr.ctr2->array = NULL;
385 return WERR_NOT_SUPPORTED;
389 r->out.ctr.ctr502 = talloc(mem_ctx, struct srvsvc_NetSessCtr502);
390 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr502);
392 r->out.ctr.ctr2->count = 0;
393 r->out.ctr.ctr2->array = NULL;
395 return WERR_NOT_SUPPORTED;
398 return WERR_UNKNOWN_LEVEL;
401 return WERR_UNKNOWN_LEVEL;
408 static WERROR dcesrv_srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
409 struct srvsvc_NetSessDel *r)
411 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
418 static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
419 struct srvsvc_NetShareAdd *r)
421 switch (r->in.level) {
424 if (r->in.parm_error) {
425 r->out.parm_error = r->in.parm_error;
427 return WERR_NOT_SUPPORTED;
431 if (r->in.parm_error) {
432 r->out.parm_error = r->in.parm_error;
434 return WERR_NOT_SUPPORTED;
439 struct share_info *info;
440 struct share_context *sctx;
444 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);
445 if (!NT_STATUS_IS_OK(nterr)) {
446 return ntstatus_to_werror(nterr);
449 /* there are no more than 8 options in struct srvsvc_NetShareInfo2 */
450 info = talloc_array(mem_ctx, struct share_info, count);
451 W_ERROR_HAVE_NO_MEMORY(info);
455 info[i].name = SHARE_TYPE;
456 info[i].type = SHARE_INFO_STRING;
457 switch (r->in.info->info2->type) {
459 info[i].value = talloc_strdup(info, "DISK");
462 info[i].value = talloc_strdup(info, "PRINTER");
465 info[i].value = talloc_strdup(info, "IPC");
468 return WERR_INVALID_PARAM;
470 W_ERROR_HAVE_NO_MEMORY(info[i].value);
473 if (r->in.info->info2->path && r->in.info->info2->path[0]) {
474 info[i].name = SHARE_PATH;
475 info[i].type = SHARE_INFO_STRING;
477 /* Windows will send a path in a form of C:\example\path */
478 if (r->in.info->info2->path[1] == ':') {
479 info[i].value = talloc_strdup(info, &r->in.info->info2->path[2]);
481 /* very strange let's try to set as is */
482 info[i].value = talloc_strdup(info, r->in.info->info2->path);
484 W_ERROR_HAVE_NO_MEMORY(info[i].value);
485 all_string_sub((char *)info[i].value, "\\", "/", 0);
490 if (r->in.info->info2->comment && r->in.info->info2->comment[0]) {
491 info[i].name = SHARE_COMMENT;
492 info[i].type = SHARE_INFO_STRING;
493 info[i].value = talloc_strdup(info, r->in.info->info2->comment);
494 W_ERROR_HAVE_NO_MEMORY(info[i].value);
499 if (r->in.info->info2->password && r->in.info->info2->password[0]) {
500 info[i].name = SHARE_PASSWORD;
501 info[i].type = SHARE_INFO_STRING;
502 info[i].value = talloc_strdup(info, r->in.info->info2->password);
503 W_ERROR_HAVE_NO_MEMORY(info[i].value);
508 info[i].name = SHARE_MAX_CONNECTIONS;
509 info[i].type = SHARE_INFO_INT;
510 info[i].value = talloc(info, int);
511 *((int *)info[i].value) = r->in.info->info2->max_users;
514 /* TODO: security descriptor */
516 nterr = share_create(sctx, r->in.info->info2->name, info, i);
517 if (!NT_STATUS_IS_OK(nterr)) {
518 return ntstatus_to_werror(nterr);
521 if (r->in.parm_error) {
522 r->out.parm_error = r->in.parm_error;
529 if (r->in.parm_error) {
530 r->out.parm_error = r->in.parm_error;
532 return WERR_NOT_SUPPORTED;
537 struct share_info *info;
538 struct share_context *sctx;
542 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);
543 if (!NT_STATUS_IS_OK(nterr)) {
544 return ntstatus_to_werror(nterr);
547 /* there are no more than 10 options in struct srvsvc_NetShareInfo502 */
548 info = talloc_array(mem_ctx, struct share_info, count);
549 W_ERROR_HAVE_NO_MEMORY(info);
553 info[i].name = SHARE_TYPE;
554 info[i].type = SHARE_INFO_STRING;
555 switch (r->in.info->info502->type) {
557 info[i].value = talloc_strdup(info, "DISK");
560 info[i].value = talloc_strdup(info, "PRINTER");
563 info[i].value = talloc_strdup(info, "IPC");
566 return WERR_INVALID_PARAM;
568 W_ERROR_HAVE_NO_MEMORY(info[i].value);
571 if (r->in.info->info502->path && r->in.info->info502->path[0]) {
572 info[i].name = SHARE_PATH;
573 info[i].type = SHARE_INFO_STRING;
575 /* Windows will send a path in a form of C:\example\path */
576 if (r->in.info->info502->path[1] == ':') {
577 info[i].value = talloc_strdup(info, &r->in.info->info502->path[2]);
579 /* very strange let's try to set as is */
580 info[i].value = talloc_strdup(info, r->in.info->info502->path);
582 W_ERROR_HAVE_NO_MEMORY(info[i].value);
583 all_string_sub((char *)info[i].value, "\\", "/", 0);
588 if (r->in.info->info502->comment && r->in.info->info502->comment[0]) {
589 info[i].name = SHARE_COMMENT;
590 info[i].type = SHARE_INFO_STRING;
591 info[i].value = talloc_strdup(info, r->in.info->info502->comment);
592 W_ERROR_HAVE_NO_MEMORY(info[i].value);
597 if (r->in.info->info502->password && r->in.info->info502->password[0]) {
598 info[i].name = SHARE_PASSWORD;
599 info[i].type = SHARE_INFO_STRING;
600 info[i].value = talloc_strdup(info, r->in.info->info502->password);
601 W_ERROR_HAVE_NO_MEMORY(info[i].value);
606 info[i].name = SHARE_MAX_CONNECTIONS;
607 info[i].type = SHARE_INFO_INT;
608 info[i].value = talloc(info, int);
609 *((int *)info[i].value) = r->in.info->info502->max_users;
612 /* TODO: security descriptor */
614 nterr = share_create(sctx, r->in.info->info502->name, info, i);
615 if (!NT_STATUS_IS_OK(nterr)) {
616 return ntstatus_to_werror(nterr);
619 if (r->in.parm_error) {
620 r->out.parm_error = r->in.parm_error;
626 return WERR_UNKNOWN_LEVEL;
629 return WERR_UNKNOWN_LEVEL;
632 static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
633 struct share_config *scfg, uint32_t level,
634 union srvsvc_NetShareInfo *info)
636 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
641 info->info0->name = talloc_strdup(mem_ctx, scfg->name);
642 W_ERROR_HAVE_NO_MEMORY(info->info0->name);
648 info->info1->name = talloc_strdup(mem_ctx, scfg->name);
649 W_ERROR_HAVE_NO_MEMORY(info->info1->name);
650 info->info1->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
651 info->info1->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
652 W_ERROR_HAVE_NO_MEMORY(info->info1->comment);
658 info->info2->name = talloc_strdup(mem_ctx, scfg->name);
659 W_ERROR_HAVE_NO_MEMORY(info->info2->name);
660 info->info2->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
661 info->info2->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
662 W_ERROR_HAVE_NO_MEMORY(info->info2->comment);
663 info->info2->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
664 info->info2->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
665 info->info2->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
666 info->info2->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
667 W_ERROR_HAVE_NO_MEMORY(info->info2->path);
668 info->info2->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
674 info->info501->name = talloc_strdup(mem_ctx, scfg->name);
675 W_ERROR_HAVE_NO_MEMORY(info->info501->name);
676 info->info501->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
677 info->info501->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
678 W_ERROR_HAVE_NO_MEMORY(info->info501->comment);
679 info->info501->csc_policy = share_int_option(scfg, SHARE_CSC_POLICY, SHARE_CSC_POLICY_DEFAULT);
685 info->info502->name = talloc_strdup(mem_ctx, scfg->name);
686 W_ERROR_HAVE_NO_MEMORY(info->info502->name);
687 info->info502->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
688 info->info502->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
689 W_ERROR_HAVE_NO_MEMORY(info->info502->comment);
690 info->info502->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
691 info->info502->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
692 info->info502->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
693 info->info502->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
694 W_ERROR_HAVE_NO_MEMORY(info->info502->path);
695 info->info502->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
696 info->info502->sd_buf.sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, scfg);
702 info->info1005->dfs_flags = dcesrv_common_get_share_dfs_flags(mem_ctx, dce_ctx, scfg);
707 return WERR_UNKNOWN_LEVEL;
710 return WERR_UNKNOWN_LEVEL;
714 srvsvc_NetShareEnumAll
716 static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
717 struct srvsvc_NetShareEnumAll *r)
722 struct share_context *sctx;
723 struct share_config *scfg;
725 r->out.level = r->in.level;
726 ZERO_STRUCT(r->out.ctr);
727 r->out.totalentries = 0;
728 r->out.resume_handle = NULL;
730 /* TODO: - paging of results
733 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);
734 if (!NT_STATUS_IS_OK(nterr)) {
735 return ntstatus_to_werror(nterr);
738 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
739 if (!NT_STATUS_IS_OK(nterr)) {
740 return ntstatus_to_werror(nterr);
743 switch (r->in.level) {
747 struct srvsvc_NetShareCtr0 *ctr0;
749 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
750 W_ERROR_HAVE_NO_MEMORY(ctr0);
752 ctr0->count = numshares;
755 if (ctr0->count == 0) {
756 r->out.ctr.ctr0 = ctr0;
760 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, ctr0->count);
761 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
763 for (i = 0; i < ctr0->count; i++) {
765 union srvsvc_NetShareInfo info;
767 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
768 if (!NT_STATUS_IS_OK(nterr)) {
769 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
770 return WERR_GENERAL_FAILURE;
772 info.info0 = &ctr0->array[i];
773 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
774 if (!W_ERROR_IS_OK(status)) {
781 r->out.ctr.ctr0 = ctr0;
782 r->out.totalentries = r->out.ctr.ctr0->count;
788 struct srvsvc_NetShareCtr1 *ctr1;
790 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
791 W_ERROR_HAVE_NO_MEMORY(ctr1);
793 ctr1->count = numshares;
796 if (ctr1->count == 0) {
797 r->out.ctr.ctr1 = ctr1;
801 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, ctr1->count);
802 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
804 for (i=0; i < ctr1->count; i++) {
806 union srvsvc_NetShareInfo info;
808 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
809 if (!NT_STATUS_IS_OK(nterr)) {
810 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
811 return WERR_GENERAL_FAILURE;
813 info.info1 = &ctr1->array[i];
814 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
815 if (!W_ERROR_IS_OK(status)) {
822 r->out.ctr.ctr1 = ctr1;
823 r->out.totalentries = r->out.ctr.ctr1->count;
829 struct srvsvc_NetShareCtr2 *ctr2;
831 SRVSVC_CHECK_ADMIN_ACCESS;
833 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
834 W_ERROR_HAVE_NO_MEMORY(ctr2);
836 ctr2->count = numshares;
839 if (ctr2->count == 0) {
840 r->out.ctr.ctr2 = ctr2;
844 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, ctr2->count);
845 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
847 for (i=0; i < ctr2->count; i++) {
849 union srvsvc_NetShareInfo info;
851 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
852 if (!NT_STATUS_IS_OK(nterr)) {
853 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
854 return WERR_GENERAL_FAILURE;
856 info.info2 = &ctr2->array[i];
857 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
858 if (!W_ERROR_IS_OK(status)) {
865 r->out.ctr.ctr2 = ctr2;
866 r->out.totalentries = r->out.ctr.ctr2->count;
872 struct srvsvc_NetShareCtr501 *ctr501;
874 SRVSVC_CHECK_ADMIN_ACCESS;
876 ctr501 = talloc(mem_ctx, struct srvsvc_NetShareCtr501);
877 W_ERROR_HAVE_NO_MEMORY(ctr501);
879 ctr501->count = numshares;
880 ctr501->array = NULL;
882 if (ctr501->count == 0) {
883 r->out.ctr.ctr501 = ctr501;
887 ctr501->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo501, ctr501->count);
888 W_ERROR_HAVE_NO_MEMORY(ctr501->array);
890 for (i=0; i < ctr501->count; i++) {
892 union srvsvc_NetShareInfo info;
894 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
895 if (!NT_STATUS_IS_OK(nterr)) {
896 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
897 return WERR_GENERAL_FAILURE;
899 info.info501 = &ctr501->array[i];
900 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
901 if (!W_ERROR_IS_OK(status)) {
908 r->out.ctr.ctr501 = ctr501;
909 r->out.totalentries = r->out.ctr.ctr501->count;
915 struct srvsvc_NetShareCtr502 *ctr502;
917 SRVSVC_CHECK_ADMIN_ACCESS;
919 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
920 W_ERROR_HAVE_NO_MEMORY(ctr502);
922 ctr502->count = numshares;
923 ctr502->array = NULL;
925 if (ctr502->count == 0) {
926 r->out.ctr.ctr502 = ctr502;
930 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, ctr502->count);
931 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
933 for (i=0; i < ctr502->count; i++) {
935 union srvsvc_NetShareInfo info;
937 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
938 if (!NT_STATUS_IS_OK(nterr)) {
939 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
940 return WERR_GENERAL_FAILURE;
942 info.info502 = &ctr502->array[i];
943 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
944 if (!W_ERROR_IS_OK(status)) {
951 r->out.ctr.ctr502 = ctr502;
952 r->out.totalentries = r->out.ctr.ctr502->count;
956 return WERR_UNKNOWN_LEVEL;
959 return WERR_UNKNOWN_LEVEL;
964 srvsvc_NetShareGetInfo
966 static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
967 struct srvsvc_NetShareGetInfo *r)
970 struct share_context *sctx = NULL;
971 struct share_config *scfg = NULL;
973 ZERO_STRUCTP(r->out.info);
975 /* TODO: - access check
978 if (strcmp("", r->in.share_name) == 0) {
979 return WERR_INVALID_PARAM;
982 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);
983 if (!NT_STATUS_IS_OK(nterr)) {
984 return ntstatus_to_werror(nterr);
987 nterr = share_get_config(mem_ctx, sctx, r->in.share_name, &scfg);
988 if (!NT_STATUS_IS_OK(nterr)) {
989 return ntstatus_to_werror(nterr);
992 switch (r->in.level) {
996 union srvsvc_NetShareInfo info;
998 info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0);
999 W_ERROR_HAVE_NO_MEMORY(info.info0);
1001 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1002 if (!W_ERROR_IS_OK(status)) {
1006 r->out.info->info0 = info.info0;
1012 union srvsvc_NetShareInfo info;
1014 info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1);
1015 W_ERROR_HAVE_NO_MEMORY(info.info1);
1017 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1018 if (!W_ERROR_IS_OK(status)) {
1022 r->out.info->info1 = info.info1;
1028 union srvsvc_NetShareInfo info;
1030 SRVSVC_CHECK_ADMIN_ACCESS;
1032 info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
1033 W_ERROR_HAVE_NO_MEMORY(info.info2);
1035 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1036 if (!W_ERROR_IS_OK(status)) {
1040 r->out.info->info2 = info.info2;
1046 union srvsvc_NetShareInfo info;
1048 info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501);
1049 W_ERROR_HAVE_NO_MEMORY(info.info501);
1051 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1052 if (!W_ERROR_IS_OK(status)) {
1056 r->out.info->info501 = info.info501;
1062 union srvsvc_NetShareInfo info;
1064 SRVSVC_CHECK_ADMIN_ACCESS;
1066 info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502);
1067 W_ERROR_HAVE_NO_MEMORY(info.info502);
1069 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1070 if (!W_ERROR_IS_OK(status)) {
1074 r->out.info->info502 = info.info502;
1080 union srvsvc_NetShareInfo info;
1082 info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005);
1083 W_ERROR_HAVE_NO_MEMORY(info.info1005);
1085 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1086 if (!W_ERROR_IS_OK(status)) {
1090 r->out.info->info1005 = info.info1005;
1094 return WERR_UNKNOWN_LEVEL;
1097 return WERR_UNKNOWN_LEVEL;
1100 static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count,
1101 const char *share_name, int level,
1104 const char *comment,
1105 const char *password,
1106 enum srvsvc_ShareType type,
1108 uint32_t csc_policy,
1109 struct security_descriptor *sd)
1114 info[i].name = SHARE_CSC_POLICY;
1115 info[i].type = SHARE_INFO_INT;
1116 info[i].value = talloc(info, int);
1117 *((int *)info[i].value) = csc_policy;
1124 /* TODO: check if unknown is csc_policy */
1126 /* TODO: security descriptor */
1129 if (path && path[0]) {
1130 info[i].name = SHARE_PATH;
1131 info[i].type = SHARE_INFO_STRING;
1133 /* Windows will send a path in a form of C:\example\path */
1134 if (path[1] == ':') {
1135 info[i].value = talloc_strdup(info, &path[2]);
1137 /* very strange let's try to set as is */
1138 info[i].value = talloc_strdup(info, path);
1140 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1141 all_string_sub((char *)info[i].value, "\\", "/", 0);
1146 if (password && password[0]) {
1147 info[i].name = SHARE_PASSWORD;
1148 info[i].type = SHARE_INFO_STRING;
1149 info[i].value = talloc_strdup(info, password);
1150 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1155 info[i].name = SHARE_MAX_CONNECTIONS;
1156 info[i].type = SHARE_INFO_INT;
1157 info[i].value = talloc(info, int);
1158 *((int *)info[i].value) = max_users;
1163 info[i].name = SHARE_TYPE;
1164 info[i].type = SHARE_INFO_STRING;
1167 info[i].value = talloc_strdup(info, "DISK");
1170 info[i].value = talloc_strdup(info, "PRINTER");
1173 info[i].value = talloc_strdup(info, "IPC");
1176 return WERR_INVALID_PARAM;
1178 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1183 info[i].name = SHARE_COMMENT;
1184 info[i].type = SHARE_INFO_STRING;
1185 info[i].value = talloc_strdup(info, comment);
1186 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1192 strcasecmp(share_name, name) != 0) {
1193 info[i].name = SHARE_NAME;
1194 info[i].type = SHARE_INFO_STRING;
1195 info[i].value = talloc_strdup(info, name);
1196 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1203 return WERR_UNKNOWN_LEVEL;
1212 srvsvc_NetShareSetInfo
1214 static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1215 struct srvsvc_NetShareSetInfo *r)
1219 struct share_context *sctx = NULL;
1220 struct share_info *info;
1223 /* TODO: - access check
1226 /* there are no more than 10 options in all struct srvsvc_NetShareInfoXXX */
1227 info = talloc_array(mem_ctx, struct share_info, 10);
1228 W_ERROR_HAVE_NO_MEMORY(info);
1230 ZERO_STRUCT(r->out);
1232 if (strcmp("", r->in.share_name) == 0) {
1233 return WERR_INVALID_PARAM;
1236 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);
1237 if (!NT_STATUS_IS_OK(nterr)) {
1238 return ntstatus_to_werror(nterr);
1241 switch (r->in.level) {
1244 status = dcesrv_srvsvc_fill_share_info(info, &count,
1245 r->in.share_name, r->in.level,
1246 r->in.info->info0->name,
1254 if (W_ERROR_EQUAL(status, WERR_OK)) {
1261 status = dcesrv_srvsvc_fill_share_info(info, &count,
1262 r->in.share_name, r->in.level,
1263 r->in.info->info1->name,
1265 r->in.info->info1->comment,
1267 r->in.info->info1->type,
1271 if (W_ERROR_EQUAL(status, WERR_OK)) {
1278 status = dcesrv_srvsvc_fill_share_info(info, &count,
1279 r->in.share_name, r->in.level,
1280 r->in.info->info2->name,
1281 r->in.info->info2->path,
1282 r->in.info->info2->comment,
1283 r->in.info->info2->password,
1284 r->in.info->info2->type,
1285 r->in.info->info2->max_users,
1288 if (W_ERROR_EQUAL(status, WERR_OK)) {
1295 status = dcesrv_srvsvc_fill_share_info(info, &count,
1296 r->in.share_name, r->in.level,
1297 r->in.info->info501->name,
1299 r->in.info->info501->comment,
1301 r->in.info->info501->type,
1303 r->in.info->info501->csc_policy,
1305 if (W_ERROR_EQUAL(status, WERR_OK)) {
1312 status = dcesrv_srvsvc_fill_share_info(info, &count,
1313 r->in.share_name, r->in.level,
1314 r->in.info->info502->name,
1315 r->in.info->info502->path,
1316 r->in.info->info502->comment,
1317 r->in.info->info502->password,
1318 r->in.info->info502->type,
1319 r->in.info->info502->max_users,
1321 r->in.info->info502->sd_buf.sd);
1322 if (W_ERROR_EQUAL(status, WERR_OK)) {
1329 status = dcesrv_srvsvc_fill_share_info(info, &count,
1330 r->in.share_name, r->in.level,
1333 r->in.info->info1004->comment,
1339 if (W_ERROR_EQUAL(status, WERR_OK)) {
1346 /* r->in.info.dfs_flags; */
1348 if (r->in.parm_error) {
1349 r->out.parm_error = r->in.parm_error;
1355 return WERR_UNKNOWN_LEVEL;
1358 nterr = share_set(sctx, r->in.share_name, info, count);
1359 if (!NT_STATUS_IS_OK(nterr)) {
1360 return ntstatus_to_werror(nterr);
1363 if (r->in.parm_error) {
1364 r->out.parm_error = r->in.parm_error;
1372 srvsvc_NetShareDelSticky
1374 static WERROR dcesrv_srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1375 struct srvsvc_NetShareDelSticky *r)
1377 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1382 srvsvc_NetShareCheck
1384 static WERROR dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1385 struct srvsvc_NetShareCheck *r)
1388 struct share_context *sctx = NULL;
1389 struct share_config *scfg = NULL;
1396 /* TODO: - access check
1399 if (strcmp("", r->in.device_name) == 0) {
1400 *r->out.type = STYPE_IPC;
1404 /* copy the path skipping C:\ */
1405 if (strncasecmp(r->in.device_name, "C:", 2) == 0) {
1406 device = talloc_strdup(mem_ctx, &r->in.device_name[2]);
1408 /* no chance we have a share that doesn't start with C:\ */
1409 return WERR_DEVICE_NOT_SHARED;
1411 all_string_sub(device, "\\", "/", 0);
1413 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);
1414 if (!NT_STATUS_IS_OK(nterr)) {
1415 return ntstatus_to_werror(nterr);
1418 nterr = share_list_all(mem_ctx, sctx, &count, &names);
1419 if (!NT_STATUS_IS_OK(nterr)) {
1420 return ntstatus_to_werror(nterr);
1423 for (i = 0; i < count; i++) {
1427 nterr = share_get_config(mem_ctx, sctx, names[i], &scfg);
1428 if (!NT_STATUS_IS_OK(nterr)) {
1429 return ntstatus_to_werror(nterr);
1431 path = share_string_option(scfg, SHARE_PATH, NULL);
1432 if (!path) continue;
1434 if (strcmp(device, path) == 0) {
1435 type = share_string_option(scfg, SHARE_TYPE, NULL);
1436 if (!type) continue;
1438 if (strcmp(type, "DISK") == 0) {
1439 *r->out.type = STYPE_DISKTREE;
1443 if (strcmp(type, "IPC") == 0) {
1444 *r->out.type = STYPE_IPC;
1448 if (strcmp(type, "PRINTER") == 0) {
1449 *r->out.type = STYPE_PRINTQ;
1455 return WERR_DEVICE_NOT_SHARED;
1460 srvsvc_NetSrvGetInfo
1462 static WERROR dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1463 struct srvsvc_NetSrvGetInfo *r)
1465 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1467 ZERO_STRUCTP(r->out.info);
1469 switch (r->in.level) {
1472 struct srvsvc_NetSrvInfo100 *info100;
1474 info100 = talloc(mem_ctx, struct srvsvc_NetSrvInfo100);
1475 W_ERROR_HAVE_NO_MEMORY(info100);
1477 info100->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1478 info100->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1479 W_ERROR_HAVE_NO_MEMORY(info100->server_name);
1481 r->out.info->info100 = info100;
1486 struct srvsvc_NetSrvInfo101 *info101;
1488 info101 = talloc(mem_ctx, struct srvsvc_NetSrvInfo101);
1489 W_ERROR_HAVE_NO_MEMORY(info101);
1491 info101->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1492 info101->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1493 W_ERROR_HAVE_NO_MEMORY(info101->server_name);
1495 info101->version_major = dcesrv_common_get_version_major(mem_ctx, dce_ctx->lp_ctx);
1496 info101->version_minor = dcesrv_common_get_version_minor(mem_ctx, dce_ctx->lp_ctx);
1497 info101->server_type = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
1498 info101->comment = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
1499 W_ERROR_HAVE_NO_MEMORY(info101->comment);
1501 r->out.info->info101 = info101;
1506 struct srvsvc_NetSrvInfo102 *info102;
1508 info102 = talloc(mem_ctx, struct srvsvc_NetSrvInfo102);
1509 W_ERROR_HAVE_NO_MEMORY(info102);
1511 info102->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1512 info102->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1513 W_ERROR_HAVE_NO_MEMORY(info102->server_name);
1515 info102->version_major = dcesrv_common_get_version_major(mem_ctx, dce_ctx->lp_ctx);
1516 info102->version_minor = dcesrv_common_get_version_minor(mem_ctx, dce_ctx->lp_ctx);
1517 info102->server_type = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
1518 info102->comment = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
1519 W_ERROR_HAVE_NO_MEMORY(info102->comment);
1521 info102->users = dcesrv_common_get_users(mem_ctx, dce_ctx);
1522 info102->disc = dcesrv_common_get_disc(mem_ctx, dce_ctx);
1523 info102->hidden = dcesrv_common_get_hidden(mem_ctx, dce_ctx);
1524 info102->announce = dcesrv_common_get_announce(mem_ctx, dce_ctx);
1525 info102->anndelta = dcesrv_common_get_anndelta(mem_ctx, dce_ctx);
1526 info102->licenses = dcesrv_common_get_licenses(mem_ctx, dce_ctx);
1527 info102->userpath = dcesrv_common_get_userpath(mem_ctx, dce_ctx);
1528 W_ERROR_HAVE_NO_MEMORY(info102->userpath);
1530 r->out.info->info102 = info102;
1534 return WERR_UNKNOWN_LEVEL;
1537 return WERR_UNKNOWN_LEVEL;
1542 srvsvc_NetSrvSetInfo
1544 static WERROR dcesrv_srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1545 struct srvsvc_NetSrvSetInfo *r)
1547 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1554 static WERROR dcesrv_srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1555 struct srvsvc_NetDiskEnum *r)
1557 r->out.info->disks = NULL;
1558 r->out.info->count = 0;
1559 *r->out.totalentries = 0;
1561 switch (r->in.level) {
1564 /* we can safely hardcode the reply and report we have only one disk (C:) */
1565 /* for some reason Windows wants 2 entries with the second being empty */
1566 r->out.info->disks = talloc_array(mem_ctx, struct srvsvc_NetDiskInfo0, 2);
1567 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks);
1568 r->out.info->count = 2;
1570 r->out.info->disks[0].disk = talloc_strdup(mem_ctx, "C:");
1571 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[0].disk);
1573 r->out.info->disks[1].disk = talloc_strdup(mem_ctx, "");
1574 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[1].disk);
1576 *r->out.totalentries = 1;
1577 r->out.resume_handle = r->in.resume_handle;
1582 return WERR_UNKNOWN_LEVEL;
1585 return WERR_UNKNOWN_LEVEL;
1590 srvsvc_NetServerStatisticsGet
1592 static WERROR dcesrv_srvsvc_NetServerStatisticsGet(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1593 struct srvsvc_NetServerStatisticsGet *r)
1595 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1600 srvsvc_NetTransportAdd
1602 static WERROR dcesrv_srvsvc_NetTransportAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1603 struct srvsvc_NetTransportAdd *r)
1605 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1610 srvsvc_NetTransportEnum
1612 static WERROR dcesrv_srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1613 struct srvsvc_NetTransportEnum *r)
1615 r->out.transports->level = r->in.transports->level;
1616 *r->out.totalentries = 0;
1617 if (r->out.resume_handle) {
1618 *r->out.resume_handle = 0;
1621 switch (r->in.transports->level) {
1624 r->out.transports->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetTransportCtr0);
1625 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr0);
1627 r->out.transports->ctr.ctr0->count = 0;
1628 r->out.transports->ctr.ctr0->array = NULL;
1630 return WERR_NOT_SUPPORTED;
1634 r->out.transports->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetTransportCtr1);
1635 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr1);
1637 r->out.transports->ctr.ctr1->count = 0;
1638 r->out.transports->ctr.ctr1->array = NULL;
1640 return WERR_NOT_SUPPORTED;
1644 r->out.transports->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetTransportCtr2);
1645 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr2);
1647 r->out.transports->ctr.ctr2->count = 0;
1648 r->out.transports->ctr.ctr2->array = NULL;
1650 return WERR_NOT_SUPPORTED;
1654 r->out.transports->ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetTransportCtr3);
1655 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr3);
1657 r->out.transports->ctr.ctr3->count = 0;
1658 r->out.transports->ctr.ctr3->array = NULL;
1660 return WERR_NOT_SUPPORTED;
1663 return WERR_UNKNOWN_LEVEL;
1666 return WERR_UNKNOWN_LEVEL;
1670 srvsvc_NetTransportDel
1672 static WERROR dcesrv_srvsvc_NetTransportDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1673 struct srvsvc_NetTransportDel *r)
1675 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1682 static WERROR dcesrv_srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1683 struct srvsvc_NetRemoteTOD *r)
1685 struct timeval tval;
1688 struct srvsvc_NetRemoteTODInfo *info;
1690 info = talloc(mem_ctx, struct srvsvc_NetRemoteTODInfo);
1691 W_ERROR_HAVE_NO_MEMORY(info);
1693 GetTimeOfDay(&tval);
1699 /* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
1700 info->msecs = (tm.tm_hour*60*60*1000)
1701 + (tm.tm_min*60*1000)
1703 + (tval.tv_usec/1000);
1704 info->hours = tm.tm_hour;
1705 info->mins = tm.tm_min;
1706 info->secs = tm.tm_sec;
1707 info->hunds = tval.tv_usec/10000;
1708 info->timezone = get_time_zone(t)/60;
1709 info->tinterval = 310; /* just return the same as windows */
1710 info->day = tm.tm_mday;
1711 info->month = tm.tm_mon + 1;
1712 info->year = tm.tm_year + 1900;
1713 info->weekday = tm.tm_wday;
1715 *r->out.info = info;
1723 static WERROR dcesrv_srvsvc_NetPathType(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1724 struct srvsvc_NetPathType *r)
1726 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1731 srvsvc_NetPathCanonicalize
1733 static WERROR dcesrv_srvsvc_NetPathCanonicalize(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1734 struct srvsvc_NetPathCanonicalize *r)
1736 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1741 srvsvc_NetPathCompare
1743 static WERROR dcesrv_srvsvc_NetPathCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1744 struct srvsvc_NetPathCompare *r)
1746 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1751 srvsvc_NetNameValidate
1753 static WERROR dcesrv_srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1754 struct srvsvc_NetNameValidate *r)
1758 if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) {
1759 return WERR_INVALID_NAME;
1762 switch (r->in.name_type) {
1771 return WERR_NOT_SUPPORTED;
1773 case 9: /* validate share name */
1775 len = strlen_m(r->in.name);
1776 if ((r->in.flags == 0x0) && (len > 81)) {
1777 return WERR_INVALID_NAME;
1779 if ((r->in.flags == 0x80000000) && (len > 13)) {
1780 return WERR_INVALID_NAME;
1782 if (! dcesrv_common_validate_share_name(mem_ctx, r->in.name)) {
1783 return WERR_INVALID_NAME;
1791 return WERR_NOT_SUPPORTED;
1793 return WERR_INVALID_PARAM;
1796 return WERR_INVALID_PARAM;
1801 srvsvc_NetPRNameCompare
1803 static WERROR dcesrv_srvsvc_NetPRNameCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1804 struct srvsvc_NetPRNameCompare *r)
1806 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1813 static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1814 struct srvsvc_NetShareEnum *r)
1818 const char **snames;
1819 struct share_context *sctx;
1820 struct share_config *scfg;
1821 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1823 r->out.level = r->in.level;
1824 ZERO_STRUCT(r->out.ctr);
1825 r->out.totalentries = 0;
1826 r->out.resume_handle = NULL;
1828 /* TODO: - paging of results
1831 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);
1832 if (!NT_STATUS_IS_OK(nterr)) {
1833 return ntstatus_to_werror(nterr);
1836 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
1837 if (!NT_STATUS_IS_OK(nterr)) {
1838 return ntstatus_to_werror(nterr);
1841 switch (r->in.level) {
1846 struct srvsvc_NetShareCtr0 *ctr0;
1848 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
1849 W_ERROR_HAVE_NO_MEMORY(ctr0);
1852 ctr0->count = count;
1855 if (ctr0->count == 0) {
1856 r->out.ctr.ctr0 = ctr0;
1860 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, count);
1861 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
1863 for (i=0; i < count; i++) {
1865 union srvsvc_NetShareInfo info;
1866 enum srvsvc_ShareType type;
1868 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1869 if (!NT_STATUS_IS_OK(nterr)) {
1870 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1871 return WERR_GENERAL_FAILURE;
1874 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1875 if (type & STYPE_HIDDEN) {
1881 info.info0 = &ctr0->array[y];
1882 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1883 W_ERROR_NOT_OK_RETURN(status);
1887 talloc_free(snames);
1889 r->out.ctr.ctr0 = ctr0;
1890 r->out.totalentries = r->out.ctr.ctr0->count;
1897 struct srvsvc_NetShareCtr1 *ctr1;
1899 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
1900 W_ERROR_HAVE_NO_MEMORY(ctr1);
1903 ctr1->count = count;
1906 if (ctr1->count == 0) {
1907 r->out.ctr.ctr1 = ctr1;
1911 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, count);
1912 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
1914 for (i=0; i < count; i++) {
1916 union srvsvc_NetShareInfo info;
1917 enum srvsvc_ShareType type;
1919 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1920 if (!NT_STATUS_IS_OK(nterr)) {
1921 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1922 return WERR_GENERAL_FAILURE;
1925 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1926 if (type & STYPE_HIDDEN) {
1932 info.info1 = &ctr1->array[y];
1933 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1934 W_ERROR_NOT_OK_RETURN(status);
1938 talloc_free(snames);
1940 r->out.ctr.ctr1 = ctr1;
1941 r->out.totalentries = r->out.ctr.ctr1->count;
1948 struct srvsvc_NetShareCtr2 *ctr2;
1950 SRVSVC_CHECK_ADMIN_ACCESS;
1952 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
1953 W_ERROR_HAVE_NO_MEMORY(ctr2);
1956 ctr2->count = count;
1959 if (ctr2->count == 0) {
1960 r->out.ctr.ctr2 = ctr2;
1964 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, count);
1965 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
1967 for (i=0; i < count; i++) {
1969 union srvsvc_NetShareInfo info;
1970 enum srvsvc_ShareType type;
1972 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1973 if (!NT_STATUS_IS_OK(nterr)) {
1974 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1975 return WERR_GENERAL_FAILURE;
1978 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1979 if (type & STYPE_HIDDEN) {
1985 info.info2 = &ctr2->array[y];
1986 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1987 W_ERROR_NOT_OK_RETURN(status);
1991 talloc_free(snames);
1993 r->out.ctr.ctr2 = ctr2;
1994 r->out.totalentries = r->out.ctr.ctr2->count;
2001 struct srvsvc_NetShareCtr502 *ctr502;
2003 SRVSVC_CHECK_ADMIN_ACCESS;
2005 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
2006 W_ERROR_HAVE_NO_MEMORY(ctr502);
2009 ctr502->count = count;
2010 ctr502->array = NULL;
2012 if (ctr502->count == 0) {
2013 r->out.ctr.ctr502 = ctr502;
2017 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, count);
2018 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
2020 for (i=0; i < count; i++) {
2022 union srvsvc_NetShareInfo info;
2023 enum srvsvc_ShareType type;
2025 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
2026 if (!NT_STATUS_IS_OK(nterr)) {
2027 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
2028 return WERR_GENERAL_FAILURE;
2031 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
2032 if (type & STYPE_HIDDEN) {
2038 info.info502 = &ctr502->array[y];
2039 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
2040 W_ERROR_NOT_OK_RETURN(status);
2044 talloc_free(snames);
2046 r->out.ctr.ctr502 = ctr502;
2047 r->out.totalentries = r->out.ctr.ctr502->count;
2051 return WERR_UNKNOWN_LEVEL;
2054 return WERR_UNKNOWN_LEVEL;
2059 srvsvc_NetShareDelStart
2061 static WERROR dcesrv_srvsvc_NetShareDelStart(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2062 struct srvsvc_NetShareDelStart *r)
2064 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2069 srvsvc_NetShareDelCommit
2071 static WERROR dcesrv_srvsvc_NetShareDelCommit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2072 struct srvsvc_NetShareDelCommit *r)
2074 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2079 srvsvc_NetGetFileSecurity
2081 static WERROR dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2082 struct srvsvc_NetGetFileSecurity *r)
2084 struct sec_desc_buf *sd_buf;
2085 struct ntvfs_context *ntvfs_ctx = NULL;
2086 struct ntvfs_request *ntvfs_req;
2087 union smb_fileinfo *io;
2090 nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
2091 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2093 ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
2094 dce_call->conn->auth_state.session_info,
2098 W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
2100 sd_buf = talloc(mem_ctx, struct sec_desc_buf);
2101 W_ERROR_HAVE_NO_MEMORY(sd_buf);
2103 io = talloc(mem_ctx, union smb_fileinfo);
2104 W_ERROR_HAVE_NO_MEMORY(io);
2106 io->query_secdesc.level = RAW_FILEINFO_SEC_DESC;
2107 io->query_secdesc.in.file.path = r->in.file;
2108 io->query_secdesc.in.secinfo_flags = r->in.securityinformation;
2110 nt_status = ntvfs_qpathinfo(ntvfs_req, io);
2111 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2113 sd_buf->sd = io->query_secdesc.out.sd;
2115 *r->out.sd_buf = sd_buf;
2121 srvsvc_NetSetFileSecurity
2123 static WERROR dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2124 struct srvsvc_NetSetFileSecurity *r)
2126 struct ntvfs_context *ntvfs_ctx;
2127 struct ntvfs_request *ntvfs_req;
2128 union smb_setfileinfo *io;
2131 nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
2132 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2134 ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
2135 dce_call->conn->auth_state.session_info,
2139 W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
2141 io = talloc(mem_ctx, union smb_setfileinfo);
2142 W_ERROR_HAVE_NO_MEMORY(io);
2144 io->set_secdesc.level = RAW_FILEINFO_SEC_DESC;
2145 io->set_secdesc.in.file.path = r->in.file;
2146 io->set_secdesc.in.secinfo_flags = r->in.securityinformation;
2147 io->set_secdesc.in.sd = r->in.sd_buf->sd;
2149 nt_status = ntvfs_setpathinfo(ntvfs_req, io);
2150 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2157 srvsvc_NetServerTransportAddEx
2159 static WERROR dcesrv_srvsvc_NetServerTransportAddEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2160 struct srvsvc_NetServerTransportAddEx *r)
2162 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2167 srvsvc_NetServerSetServiceBitsEx
2169 static WERROR dcesrv_srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2170 struct srvsvc_NetServerSetServiceBitsEx *r)
2172 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2177 srvsvc_NETRDFSGETVERSION
2179 static WERROR dcesrv_srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2180 struct srvsvc_NETRDFSGETVERSION *r)
2182 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2187 srvsvc_NETRDFSCREATELOCALPARTITION
2189 static WERROR dcesrv_srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2190 struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
2192 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2197 srvsvc_NETRDFSDELETELOCALPARTITION
2199 static WERROR dcesrv_srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2200 struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
2202 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2207 srvsvc_NETRDFSSETLOCALVOLUMESTATE
2209 static WERROR dcesrv_srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2210 struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
2212 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2217 srvsvc_NETRDFSSETSERVERINFO
2219 static WERROR dcesrv_srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2220 struct srvsvc_NETRDFSSETSERVERINFO *r)
2222 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2227 srvsvc_NETRDFSCREATEEXITPOINT
2229 static WERROR dcesrv_srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2230 struct srvsvc_NETRDFSCREATEEXITPOINT *r)
2232 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2237 srvsvc_NETRDFSDELETEEXITPOINT
2239 static WERROR dcesrv_srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2240 struct srvsvc_NETRDFSDELETEEXITPOINT *r)
2242 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2247 srvsvc_NETRDFSMODIFYPREFIX
2249 static WERROR dcesrv_srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2250 struct srvsvc_NETRDFSMODIFYPREFIX *r)
2252 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2257 srvsvc_NETRDFSFIXLOCALVOLUME
2259 static WERROR dcesrv_srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2260 struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
2262 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2267 srvsvc_NETRDFSMANAGERREPORTSITEINFO
2269 static WERROR dcesrv_srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2270 struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
2272 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2277 srvsvc_NETRSERVERTRANSPORTDELEX
2279 static WERROR dcesrv_srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2280 struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
2282 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2288 static WERROR dcesrv_srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2289 struct srvsvc_NetShareDel *r)
2292 struct share_context *sctx;
2294 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);
2295 if (!NT_STATUS_IS_OK(nterr)) {
2296 return ntstatus_to_werror(nterr);
2299 nterr = share_remove(sctx, r->in.share_name);
2300 if (!NT_STATUS_IS_OK(nterr)) {
2301 return ntstatus_to_werror(nterr);
2308 srvsvc_NetSetServiceBits
2310 static WERROR dcesrv_srvsvc_NetSetServiceBits(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2311 struct srvsvc_NetSetServiceBits *r)
2313 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2317 srvsvc_NETRPRNAMECANONICALIZE
2319 static WERROR dcesrv_srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2320 struct srvsvc_NETRPRNAMECANONICALIZE *r)
2322 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2325 /* include the generated boilerplate */
2326 #include "librpc/gen_ndr/ndr_srvsvc_s.c"