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.level = r->in.level;
119 r->out.totalentries = 0;
120 r->out.resume_handle = NULL;
122 switch (r->in.level) {
125 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr0);
126 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
128 r->out.ctr.ctr0->count = 0;
129 r->out.ctr.ctr0->array = NULL;
131 return WERR_NOT_SUPPORTED;
135 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr1);
136 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
138 r->out.ctr.ctr1->count = 0;
139 r->out.ctr.ctr1->array = NULL;
141 return WERR_NOT_SUPPORTED;
144 return WERR_UNKNOWN_LEVEL;
147 return WERR_UNKNOWN_LEVEL;
152 srvsvc_NetCharDevQGetInfo
154 static WERROR dcesrv_srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
155 struct srvsvc_NetCharDevQGetInfo *r)
157 ZERO_STRUCTP(r->out.info);
159 switch (r->in.level) {
162 return WERR_NOT_SUPPORTED;
166 return WERR_NOT_SUPPORTED;
169 return WERR_UNKNOWN_LEVEL;
172 return WERR_UNKNOWN_LEVEL;
177 srvsvc_NetCharDevQSetInfo
179 static WERROR dcesrv_srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
180 struct srvsvc_NetCharDevQSetInfo *r)
182 switch (r->in.level) {
185 if (r->in.parm_error) {
186 r->out.parm_error = r->in.parm_error;
188 return WERR_NOT_SUPPORTED;
192 if (r->in.parm_error) {
193 r->out.parm_error = r->in.parm_error;
195 return WERR_NOT_SUPPORTED;
198 return WERR_UNKNOWN_LEVEL;
201 return WERR_UNKNOWN_LEVEL;
206 srvsvc_NetCharDevQPurge
208 static WERROR dcesrv_srvsvc_NetCharDevQPurge(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
209 struct srvsvc_NetCharDevQPurge *r)
211 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
216 srvsvc_NetCharDevQPurgeSelf
218 static WERROR dcesrv_srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
219 struct srvsvc_NetCharDevQPurgeSelf *r)
221 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
228 static WERROR dcesrv_srvsvc_NetConnEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
229 struct srvsvc_NetConnEnum *r)
231 r->out.level = r->in.level;
232 r->out.totalentries = 0;
233 r->out.resume_handle = NULL;
235 switch (r->in.level) {
238 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetConnCtr0);
239 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
241 r->out.ctr.ctr0->count = 0;
242 r->out.ctr.ctr0->array = NULL;
244 return WERR_NOT_SUPPORTED;
248 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetConnCtr1);
249 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
251 r->out.ctr.ctr1->count = 0;
252 r->out.ctr.ctr1->array = NULL;
254 return WERR_NOT_SUPPORTED;
257 return WERR_UNKNOWN_LEVEL;
260 return WERR_UNKNOWN_LEVEL;
267 static WERROR dcesrv_srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
268 struct srvsvc_NetFileEnum *r)
270 r->out.level = r->in.level;
271 r->out.totalentries = 0;
272 r->out.resume_handle = NULL;
274 switch (r->in.level) {
277 r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetFileCtr2);
278 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
280 r->out.ctr.ctr2->count = 0;
281 r->out.ctr.ctr2->array = NULL;
283 return WERR_NOT_SUPPORTED;
287 r->out.ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetFileCtr3);
288 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr3);
290 r->out.ctr.ctr3->count = 0;
291 r->out.ctr.ctr3->array = NULL;
293 return WERR_NOT_SUPPORTED;
296 return WERR_UNKNOWN_LEVEL;
299 return WERR_UNKNOWN_LEVEL;
304 srvsvc_NetFileGetInfo
306 static WERROR dcesrv_srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
307 struct srvsvc_NetFileGetInfo *r)
309 ZERO_STRUCTP(r->out.info);
311 switch (r->in.level) {
314 return WERR_NOT_SUPPORTED;
318 return WERR_NOT_SUPPORTED;
321 return WERR_UNKNOWN_LEVEL;
324 return WERR_UNKNOWN_LEVEL;
331 static WERROR dcesrv_srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
332 struct srvsvc_NetFileClose *r)
334 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
341 static WERROR dcesrv_srvsvc_NetSessEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
342 struct srvsvc_NetSessEnum *r)
344 r->out.level = r->in.level;
345 r->out.totalentries = 0;
346 r->out.resume_handle = NULL;
348 switch (r->in.level) {
351 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetSessCtr0);
352 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
354 r->out.ctr.ctr0->count = 0;
355 r->out.ctr.ctr0->array = NULL;
357 return WERR_NOT_SUPPORTED;
361 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetSessCtr1);
362 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
364 r->out.ctr.ctr1->count = 0;
365 r->out.ctr.ctr1->array = NULL;
367 return WERR_NOT_SUPPORTED;
371 r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetSessCtr2);
372 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
374 r->out.ctr.ctr2->count = 0;
375 r->out.ctr.ctr2->array = NULL;
377 return WERR_NOT_SUPPORTED;
381 r->out.ctr.ctr10 = talloc(mem_ctx, struct srvsvc_NetSessCtr10);
382 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr10);
384 r->out.ctr.ctr2->count = 0;
385 r->out.ctr.ctr2->array = NULL;
387 return WERR_NOT_SUPPORTED;
391 r->out.ctr.ctr502 = talloc(mem_ctx, struct srvsvc_NetSessCtr502);
392 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr502);
394 r->out.ctr.ctr2->count = 0;
395 r->out.ctr.ctr2->array = NULL;
397 return WERR_NOT_SUPPORTED;
400 return WERR_UNKNOWN_LEVEL;
403 return WERR_UNKNOWN_LEVEL;
410 static WERROR dcesrv_srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
411 struct srvsvc_NetSessDel *r)
413 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
420 static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
421 struct srvsvc_NetShareAdd *r)
423 switch (r->in.level) {
426 if (r->in.parm_error) {
427 r->out.parm_error = r->in.parm_error;
429 return WERR_NOT_SUPPORTED;
433 if (r->in.parm_error) {
434 r->out.parm_error = r->in.parm_error;
436 return WERR_NOT_SUPPORTED;
441 struct share_info *info;
442 struct share_context *sctx;
446 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);
447 if (!NT_STATUS_IS_OK(nterr)) {
448 return ntstatus_to_werror(nterr);
451 /* there are no more than 8 options in struct srvsvc_NetShareInfo2 */
452 info = talloc_array(mem_ctx, struct share_info, count);
453 W_ERROR_HAVE_NO_MEMORY(info);
457 info[i].name = SHARE_TYPE;
458 info[i].type = SHARE_INFO_STRING;
459 switch (r->in.info->info2->type) {
461 info[i].value = talloc_strdup(info, "DISK");
464 info[i].value = talloc_strdup(info, "PRINTER");
467 info[i].value = talloc_strdup(info, "IPC");
470 return WERR_INVALID_PARAM;
472 W_ERROR_HAVE_NO_MEMORY(info[i].value);
475 if (r->in.info->info2->path && r->in.info->info2->path[0]) {
476 info[i].name = SHARE_PATH;
477 info[i].type = SHARE_INFO_STRING;
479 /* Windows will send a path in a form of C:\example\path */
480 if (r->in.info->info2->path[1] == ':') {
481 info[i].value = talloc_strdup(info, &r->in.info->info2->path[2]);
483 /* very strange let's try to set as is */
484 info[i].value = talloc_strdup(info, r->in.info->info2->path);
486 W_ERROR_HAVE_NO_MEMORY(info[i].value);
487 all_string_sub((char *)info[i].value, "\\", "/", 0);
492 if (r->in.info->info2->comment && r->in.info->info2->comment[0]) {
493 info[i].name = SHARE_COMMENT;
494 info[i].type = SHARE_INFO_STRING;
495 info[i].value = talloc_strdup(info, r->in.info->info2->comment);
496 W_ERROR_HAVE_NO_MEMORY(info[i].value);
501 if (r->in.info->info2->password && r->in.info->info2->password[0]) {
502 info[i].name = SHARE_PASSWORD;
503 info[i].type = SHARE_INFO_STRING;
504 info[i].value = talloc_strdup(info, r->in.info->info2->password);
505 W_ERROR_HAVE_NO_MEMORY(info[i].value);
510 info[i].name = SHARE_MAX_CONNECTIONS;
511 info[i].type = SHARE_INFO_INT;
512 info[i].value = talloc(info, int);
513 *((int *)info[i].value) = r->in.info->info2->max_users;
516 /* TODO: security descriptor */
518 nterr = share_create(sctx, r->in.info->info2->name, info, i);
519 if (!NT_STATUS_IS_OK(nterr)) {
520 return ntstatus_to_werror(nterr);
523 if (r->in.parm_error) {
524 r->out.parm_error = r->in.parm_error;
531 if (r->in.parm_error) {
532 r->out.parm_error = r->in.parm_error;
534 return WERR_NOT_SUPPORTED;
539 struct share_info *info;
540 struct share_context *sctx;
544 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);
545 if (!NT_STATUS_IS_OK(nterr)) {
546 return ntstatus_to_werror(nterr);
549 /* there are no more than 10 options in struct srvsvc_NetShareInfo502 */
550 info = talloc_array(mem_ctx, struct share_info, count);
551 W_ERROR_HAVE_NO_MEMORY(info);
555 info[i].name = SHARE_TYPE;
556 info[i].type = SHARE_INFO_STRING;
557 switch (r->in.info->info502->type) {
559 info[i].value = talloc_strdup(info, "DISK");
562 info[i].value = talloc_strdup(info, "PRINTER");
565 info[i].value = talloc_strdup(info, "IPC");
568 return WERR_INVALID_PARAM;
570 W_ERROR_HAVE_NO_MEMORY(info[i].value);
573 if (r->in.info->info502->path && r->in.info->info502->path[0]) {
574 info[i].name = SHARE_PATH;
575 info[i].type = SHARE_INFO_STRING;
577 /* Windows will send a path in a form of C:\example\path */
578 if (r->in.info->info502->path[1] == ':') {
579 info[i].value = talloc_strdup(info, &r->in.info->info502->path[2]);
581 /* very strange let's try to set as is */
582 info[i].value = talloc_strdup(info, r->in.info->info502->path);
584 W_ERROR_HAVE_NO_MEMORY(info[i].value);
585 all_string_sub((char *)info[i].value, "\\", "/", 0);
590 if (r->in.info->info502->comment && r->in.info->info502->comment[0]) {
591 info[i].name = SHARE_COMMENT;
592 info[i].type = SHARE_INFO_STRING;
593 info[i].value = talloc_strdup(info, r->in.info->info502->comment);
594 W_ERROR_HAVE_NO_MEMORY(info[i].value);
599 if (r->in.info->info502->password && r->in.info->info502->password[0]) {
600 info[i].name = SHARE_PASSWORD;
601 info[i].type = SHARE_INFO_STRING;
602 info[i].value = talloc_strdup(info, r->in.info->info502->password);
603 W_ERROR_HAVE_NO_MEMORY(info[i].value);
608 info[i].name = SHARE_MAX_CONNECTIONS;
609 info[i].type = SHARE_INFO_INT;
610 info[i].value = talloc(info, int);
611 *((int *)info[i].value) = r->in.info->info502->max_users;
614 /* TODO: security descriptor */
616 nterr = share_create(sctx, r->in.info->info502->name, info, i);
617 if (!NT_STATUS_IS_OK(nterr)) {
618 return ntstatus_to_werror(nterr);
621 if (r->in.parm_error) {
622 r->out.parm_error = r->in.parm_error;
628 return WERR_UNKNOWN_LEVEL;
631 return WERR_UNKNOWN_LEVEL;
634 static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
635 struct share_config *scfg, uint32_t level,
636 union srvsvc_NetShareInfo *info)
638 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
643 info->info0->name = talloc_strdup(mem_ctx, scfg->name);
644 W_ERROR_HAVE_NO_MEMORY(info->info0->name);
650 info->info1->name = talloc_strdup(mem_ctx, scfg->name);
651 W_ERROR_HAVE_NO_MEMORY(info->info1->name);
652 info->info1->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
653 info->info1->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
654 W_ERROR_HAVE_NO_MEMORY(info->info1->comment);
660 info->info2->name = talloc_strdup(mem_ctx, scfg->name);
661 W_ERROR_HAVE_NO_MEMORY(info->info2->name);
662 info->info2->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
663 info->info2->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
664 W_ERROR_HAVE_NO_MEMORY(info->info2->comment);
665 info->info2->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
666 info->info2->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
667 info->info2->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
668 info->info2->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
669 W_ERROR_HAVE_NO_MEMORY(info->info2->path);
670 info->info2->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
676 info->info501->name = talloc_strdup(mem_ctx, scfg->name);
677 W_ERROR_HAVE_NO_MEMORY(info->info501->name);
678 info->info501->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
679 info->info501->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
680 W_ERROR_HAVE_NO_MEMORY(info->info501->comment);
681 info->info501->csc_policy = share_int_option(scfg, SHARE_CSC_POLICY, SHARE_CSC_POLICY_DEFAULT);
687 info->info502->name = talloc_strdup(mem_ctx, scfg->name);
688 W_ERROR_HAVE_NO_MEMORY(info->info502->name);
689 info->info502->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
690 info->info502->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
691 W_ERROR_HAVE_NO_MEMORY(info->info502->comment);
692 info->info502->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
693 info->info502->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
694 info->info502->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
695 info->info502->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
696 W_ERROR_HAVE_NO_MEMORY(info->info502->path);
697 info->info502->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
698 info->info502->sd_buf.sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, scfg);
704 info->info1005->dfs_flags = dcesrv_common_get_share_dfs_flags(mem_ctx, dce_ctx, scfg);
709 return WERR_UNKNOWN_LEVEL;
712 return WERR_UNKNOWN_LEVEL;
716 srvsvc_NetShareEnumAll
718 static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
719 struct srvsvc_NetShareEnumAll *r)
724 struct share_context *sctx;
725 struct share_config *scfg;
727 r->out.level = r->in.level;
728 ZERO_STRUCT(r->out.ctr);
729 r->out.totalentries = 0;
730 r->out.resume_handle = NULL;
732 /* TODO: - paging of results
735 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);
736 if (!NT_STATUS_IS_OK(nterr)) {
737 return ntstatus_to_werror(nterr);
740 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
741 if (!NT_STATUS_IS_OK(nterr)) {
742 return ntstatus_to_werror(nterr);
745 switch (r->in.level) {
749 struct srvsvc_NetShareCtr0 *ctr0;
751 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
752 W_ERROR_HAVE_NO_MEMORY(ctr0);
754 ctr0->count = numshares;
757 if (ctr0->count == 0) {
758 r->out.ctr.ctr0 = ctr0;
762 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, ctr0->count);
763 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
765 for (i = 0; i < ctr0->count; i++) {
767 union srvsvc_NetShareInfo info;
769 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
770 if (!NT_STATUS_IS_OK(nterr)) {
771 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
772 return WERR_GENERAL_FAILURE;
774 info.info0 = &ctr0->array[i];
775 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
776 if (!W_ERROR_IS_OK(status)) {
783 r->out.ctr.ctr0 = ctr0;
784 r->out.totalentries = r->out.ctr.ctr0->count;
790 struct srvsvc_NetShareCtr1 *ctr1;
792 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
793 W_ERROR_HAVE_NO_MEMORY(ctr1);
795 ctr1->count = numshares;
798 if (ctr1->count == 0) {
799 r->out.ctr.ctr1 = ctr1;
803 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, ctr1->count);
804 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
806 for (i=0; i < ctr1->count; i++) {
808 union srvsvc_NetShareInfo info;
810 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
811 if (!NT_STATUS_IS_OK(nterr)) {
812 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
813 return WERR_GENERAL_FAILURE;
815 info.info1 = &ctr1->array[i];
816 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
817 if (!W_ERROR_IS_OK(status)) {
824 r->out.ctr.ctr1 = ctr1;
825 r->out.totalentries = r->out.ctr.ctr1->count;
831 struct srvsvc_NetShareCtr2 *ctr2;
833 SRVSVC_CHECK_ADMIN_ACCESS;
835 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
836 W_ERROR_HAVE_NO_MEMORY(ctr2);
838 ctr2->count = numshares;
841 if (ctr2->count == 0) {
842 r->out.ctr.ctr2 = ctr2;
846 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, ctr2->count);
847 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
849 for (i=0; i < ctr2->count; i++) {
851 union srvsvc_NetShareInfo info;
853 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
854 if (!NT_STATUS_IS_OK(nterr)) {
855 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
856 return WERR_GENERAL_FAILURE;
858 info.info2 = &ctr2->array[i];
859 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
860 if (!W_ERROR_IS_OK(status)) {
867 r->out.ctr.ctr2 = ctr2;
868 r->out.totalentries = r->out.ctr.ctr2->count;
874 struct srvsvc_NetShareCtr501 *ctr501;
876 SRVSVC_CHECK_ADMIN_ACCESS;
878 ctr501 = talloc(mem_ctx, struct srvsvc_NetShareCtr501);
879 W_ERROR_HAVE_NO_MEMORY(ctr501);
881 ctr501->count = numshares;
882 ctr501->array = NULL;
884 if (ctr501->count == 0) {
885 r->out.ctr.ctr501 = ctr501;
889 ctr501->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo501, ctr501->count);
890 W_ERROR_HAVE_NO_MEMORY(ctr501->array);
892 for (i=0; i < ctr501->count; i++) {
894 union srvsvc_NetShareInfo info;
896 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
897 if (!NT_STATUS_IS_OK(nterr)) {
898 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
899 return WERR_GENERAL_FAILURE;
901 info.info501 = &ctr501->array[i];
902 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
903 if (!W_ERROR_IS_OK(status)) {
910 r->out.ctr.ctr501 = ctr501;
911 r->out.totalentries = r->out.ctr.ctr501->count;
917 struct srvsvc_NetShareCtr502 *ctr502;
919 SRVSVC_CHECK_ADMIN_ACCESS;
921 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
922 W_ERROR_HAVE_NO_MEMORY(ctr502);
924 ctr502->count = numshares;
925 ctr502->array = NULL;
927 if (ctr502->count == 0) {
928 r->out.ctr.ctr502 = ctr502;
932 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, ctr502->count);
933 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
935 for (i=0; i < ctr502->count; i++) {
937 union srvsvc_NetShareInfo info;
939 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
940 if (!NT_STATUS_IS_OK(nterr)) {
941 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
942 return WERR_GENERAL_FAILURE;
944 info.info502 = &ctr502->array[i];
945 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
946 if (!W_ERROR_IS_OK(status)) {
953 r->out.ctr.ctr502 = ctr502;
954 r->out.totalentries = r->out.ctr.ctr502->count;
958 return WERR_UNKNOWN_LEVEL;
961 return WERR_UNKNOWN_LEVEL;
966 srvsvc_NetShareGetInfo
968 static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
969 struct srvsvc_NetShareGetInfo *r)
972 struct share_context *sctx = NULL;
973 struct share_config *scfg = NULL;
975 ZERO_STRUCTP(r->out.info);
977 /* TODO: - access check
980 if (strcmp("", r->in.share_name) == 0) {
981 return WERR_INVALID_PARAM;
984 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);
985 if (!NT_STATUS_IS_OK(nterr)) {
986 return ntstatus_to_werror(nterr);
989 nterr = share_get_config(mem_ctx, sctx, r->in.share_name, &scfg);
990 if (!NT_STATUS_IS_OK(nterr)) {
991 return ntstatus_to_werror(nterr);
994 switch (r->in.level) {
998 union srvsvc_NetShareInfo info;
1000 info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0);
1001 W_ERROR_HAVE_NO_MEMORY(info.info0);
1003 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1004 if (!W_ERROR_IS_OK(status)) {
1008 r->out.info->info0 = info.info0;
1014 union srvsvc_NetShareInfo info;
1016 info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1);
1017 W_ERROR_HAVE_NO_MEMORY(info.info1);
1019 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1020 if (!W_ERROR_IS_OK(status)) {
1024 r->out.info->info1 = info.info1;
1030 union srvsvc_NetShareInfo info;
1032 SRVSVC_CHECK_ADMIN_ACCESS;
1034 info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
1035 W_ERROR_HAVE_NO_MEMORY(info.info2);
1037 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1038 if (!W_ERROR_IS_OK(status)) {
1042 r->out.info->info2 = info.info2;
1048 union srvsvc_NetShareInfo info;
1050 info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501);
1051 W_ERROR_HAVE_NO_MEMORY(info.info501);
1053 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1054 if (!W_ERROR_IS_OK(status)) {
1058 r->out.info->info501 = info.info501;
1064 union srvsvc_NetShareInfo info;
1066 SRVSVC_CHECK_ADMIN_ACCESS;
1068 info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502);
1069 W_ERROR_HAVE_NO_MEMORY(info.info502);
1071 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1072 if (!W_ERROR_IS_OK(status)) {
1076 r->out.info->info502 = info.info502;
1082 union srvsvc_NetShareInfo info;
1084 info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005);
1085 W_ERROR_HAVE_NO_MEMORY(info.info1005);
1087 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1088 if (!W_ERROR_IS_OK(status)) {
1092 r->out.info->info1005 = info.info1005;
1096 return WERR_UNKNOWN_LEVEL;
1099 return WERR_UNKNOWN_LEVEL;
1102 static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count,
1103 const char *share_name, int level,
1106 const char *comment,
1107 const char *password,
1108 enum srvsvc_ShareType type,
1110 uint32_t csc_policy,
1111 struct security_descriptor *sd)
1116 info[i].name = SHARE_CSC_POLICY;
1117 info[i].type = SHARE_INFO_INT;
1118 info[i].value = talloc(info, int);
1119 *((int *)info[i].value) = csc_policy;
1126 /* TODO: check if unknown is csc_policy */
1128 /* TODO: security descriptor */
1131 if (path && path[0]) {
1132 info[i].name = SHARE_PATH;
1133 info[i].type = SHARE_INFO_STRING;
1135 /* Windows will send a path in a form of C:\example\path */
1136 if (path[1] == ':') {
1137 info[i].value = talloc_strdup(info, &path[2]);
1139 /* very strange let's try to set as is */
1140 info[i].value = talloc_strdup(info, path);
1142 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1143 all_string_sub((char *)info[i].value, "\\", "/", 0);
1148 if (password && password[0]) {
1149 info[i].name = SHARE_PASSWORD;
1150 info[i].type = SHARE_INFO_STRING;
1151 info[i].value = talloc_strdup(info, password);
1152 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1157 info[i].name = SHARE_MAX_CONNECTIONS;
1158 info[i].type = SHARE_INFO_INT;
1159 info[i].value = talloc(info, int);
1160 *((int *)info[i].value) = max_users;
1165 info[i].name = SHARE_TYPE;
1166 info[i].type = SHARE_INFO_STRING;
1169 info[i].value = talloc_strdup(info, "DISK");
1172 info[i].value = talloc_strdup(info, "PRINTER");
1175 info[i].value = talloc_strdup(info, "IPC");
1178 return WERR_INVALID_PARAM;
1180 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1185 info[i].name = SHARE_COMMENT;
1186 info[i].type = SHARE_INFO_STRING;
1187 info[i].value = talloc_strdup(info, comment);
1188 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1194 strcasecmp(share_name, name) != 0) {
1195 info[i].name = SHARE_NAME;
1196 info[i].type = SHARE_INFO_STRING;
1197 info[i].value = talloc_strdup(info, name);
1198 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1205 return WERR_UNKNOWN_LEVEL;
1214 srvsvc_NetShareSetInfo
1216 static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1217 struct srvsvc_NetShareSetInfo *r)
1221 struct share_context *sctx = NULL;
1222 struct share_info *info;
1225 /* TODO: - access check
1228 /* there are no more than 10 options in all struct srvsvc_NetShareInfoXXX */
1229 info = talloc_array(mem_ctx, struct share_info, 10);
1230 W_ERROR_HAVE_NO_MEMORY(info);
1232 ZERO_STRUCT(r->out);
1234 if (strcmp("", r->in.share_name) == 0) {
1235 return WERR_INVALID_PARAM;
1238 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);
1239 if (!NT_STATUS_IS_OK(nterr)) {
1240 return ntstatus_to_werror(nterr);
1243 switch (r->in.level) {
1246 status = dcesrv_srvsvc_fill_share_info(info, &count,
1247 r->in.share_name, r->in.level,
1248 r->in.info->info0->name,
1256 if (W_ERROR_EQUAL(status, WERR_OK)) {
1263 status = dcesrv_srvsvc_fill_share_info(info, &count,
1264 r->in.share_name, r->in.level,
1265 r->in.info->info1->name,
1267 r->in.info->info1->comment,
1269 r->in.info->info1->type,
1273 if (W_ERROR_EQUAL(status, WERR_OK)) {
1280 status = dcesrv_srvsvc_fill_share_info(info, &count,
1281 r->in.share_name, r->in.level,
1282 r->in.info->info2->name,
1283 r->in.info->info2->path,
1284 r->in.info->info2->comment,
1285 r->in.info->info2->password,
1286 r->in.info->info2->type,
1287 r->in.info->info2->max_users,
1290 if (W_ERROR_EQUAL(status, WERR_OK)) {
1297 status = dcesrv_srvsvc_fill_share_info(info, &count,
1298 r->in.share_name, r->in.level,
1299 r->in.info->info501->name,
1301 r->in.info->info501->comment,
1303 r->in.info->info501->type,
1305 r->in.info->info501->csc_policy,
1307 if (W_ERROR_EQUAL(status, WERR_OK)) {
1314 status = dcesrv_srvsvc_fill_share_info(info, &count,
1315 r->in.share_name, r->in.level,
1316 r->in.info->info502->name,
1317 r->in.info->info502->path,
1318 r->in.info->info502->comment,
1319 r->in.info->info502->password,
1320 r->in.info->info502->type,
1321 r->in.info->info502->max_users,
1323 r->in.info->info502->sd_buf.sd);
1324 if (W_ERROR_EQUAL(status, WERR_OK)) {
1331 status = dcesrv_srvsvc_fill_share_info(info, &count,
1332 r->in.share_name, r->in.level,
1335 r->in.info->info1004->comment,
1341 if (W_ERROR_EQUAL(status, WERR_OK)) {
1348 /* r->in.info.dfs_flags; */
1350 if (r->in.parm_error) {
1351 r->out.parm_error = r->in.parm_error;
1357 return WERR_UNKNOWN_LEVEL;
1360 nterr = share_set(sctx, r->in.share_name, info, count);
1361 if (!NT_STATUS_IS_OK(nterr)) {
1362 return ntstatus_to_werror(nterr);
1365 if (r->in.parm_error) {
1366 r->out.parm_error = r->in.parm_error;
1374 srvsvc_NetShareDelSticky
1376 static WERROR dcesrv_srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1377 struct srvsvc_NetShareDelSticky *r)
1379 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1384 srvsvc_NetShareCheck
1386 static WERROR dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1387 struct srvsvc_NetShareCheck *r)
1390 struct share_context *sctx = NULL;
1391 struct share_config *scfg = NULL;
1398 /* TODO: - access check
1401 if (strcmp("", r->in.device_name) == 0) {
1402 *r->out.type = STYPE_IPC;
1406 /* copy the path skipping C:\ */
1407 if (strncasecmp(r->in.device_name, "C:", 2) == 0) {
1408 device = talloc_strdup(mem_ctx, &r->in.device_name[2]);
1410 /* no chance we have a share that doesn't start with C:\ */
1411 return WERR_DEVICE_NOT_SHARED;
1413 all_string_sub(device, "\\", "/", 0);
1415 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);
1416 if (!NT_STATUS_IS_OK(nterr)) {
1417 return ntstatus_to_werror(nterr);
1420 nterr = share_list_all(mem_ctx, sctx, &count, &names);
1421 if (!NT_STATUS_IS_OK(nterr)) {
1422 return ntstatus_to_werror(nterr);
1425 for (i = 0; i < count; i++) {
1429 nterr = share_get_config(mem_ctx, sctx, names[i], &scfg);
1430 if (!NT_STATUS_IS_OK(nterr)) {
1431 return ntstatus_to_werror(nterr);
1433 path = share_string_option(scfg, SHARE_PATH, NULL);
1434 if (!path) continue;
1436 if (strcmp(device, path) == 0) {
1437 type = share_string_option(scfg, SHARE_TYPE, NULL);
1438 if (!type) continue;
1440 if (strcmp(type, "DISK") == 0) {
1441 *r->out.type = STYPE_DISKTREE;
1445 if (strcmp(type, "IPC") == 0) {
1446 *r->out.type = STYPE_IPC;
1450 if (strcmp(type, "PRINTER") == 0) {
1451 *r->out.type = STYPE_PRINTQ;
1457 return WERR_DEVICE_NOT_SHARED;
1462 srvsvc_NetSrvGetInfo
1464 static WERROR dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1465 struct srvsvc_NetSrvGetInfo *r)
1467 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1469 ZERO_STRUCTP(r->out.info);
1471 switch (r->in.level) {
1474 struct srvsvc_NetSrvInfo100 *info100;
1476 info100 = talloc(mem_ctx, struct srvsvc_NetSrvInfo100);
1477 W_ERROR_HAVE_NO_MEMORY(info100);
1479 info100->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1480 info100->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1481 W_ERROR_HAVE_NO_MEMORY(info100->server_name);
1483 r->out.info->info100 = info100;
1488 struct srvsvc_NetSrvInfo101 *info101;
1490 info101 = talloc(mem_ctx, struct srvsvc_NetSrvInfo101);
1491 W_ERROR_HAVE_NO_MEMORY(info101);
1493 info101->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1494 info101->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1495 W_ERROR_HAVE_NO_MEMORY(info101->server_name);
1497 info101->version_major = dcesrv_common_get_version_major(mem_ctx, dce_ctx->lp_ctx);
1498 info101->version_minor = dcesrv_common_get_version_minor(mem_ctx, dce_ctx->lp_ctx);
1499 info101->server_type = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
1500 info101->comment = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
1501 W_ERROR_HAVE_NO_MEMORY(info101->comment);
1503 r->out.info->info101 = info101;
1508 struct srvsvc_NetSrvInfo102 *info102;
1510 info102 = talloc(mem_ctx, struct srvsvc_NetSrvInfo102);
1511 W_ERROR_HAVE_NO_MEMORY(info102);
1513 info102->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1514 info102->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1515 W_ERROR_HAVE_NO_MEMORY(info102->server_name);
1517 info102->version_major = dcesrv_common_get_version_major(mem_ctx, dce_ctx->lp_ctx);
1518 info102->version_minor = dcesrv_common_get_version_minor(mem_ctx, dce_ctx->lp_ctx);
1519 info102->server_type = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
1520 info102->comment = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
1521 W_ERROR_HAVE_NO_MEMORY(info102->comment);
1523 info102->users = dcesrv_common_get_users(mem_ctx, dce_ctx);
1524 info102->disc = dcesrv_common_get_disc(mem_ctx, dce_ctx);
1525 info102->hidden = dcesrv_common_get_hidden(mem_ctx, dce_ctx);
1526 info102->announce = dcesrv_common_get_announce(mem_ctx, dce_ctx);
1527 info102->anndelta = dcesrv_common_get_anndelta(mem_ctx, dce_ctx);
1528 info102->licenses = dcesrv_common_get_licenses(mem_ctx, dce_ctx);
1529 info102->userpath = dcesrv_common_get_userpath(mem_ctx, dce_ctx);
1530 W_ERROR_HAVE_NO_MEMORY(info102->userpath);
1532 r->out.info->info102 = info102;
1536 return WERR_UNKNOWN_LEVEL;
1539 return WERR_UNKNOWN_LEVEL;
1544 srvsvc_NetSrvSetInfo
1546 static WERROR dcesrv_srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1547 struct srvsvc_NetSrvSetInfo *r)
1549 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1556 static WERROR dcesrv_srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1557 struct srvsvc_NetDiskEnum *r)
1559 r->out.info->disks = NULL;
1560 r->out.info->count = 0;
1561 *r->out.totalentries = 0;
1563 switch (r->in.level) {
1566 /* we can safely hardcode the reply and report we have only one disk (C:) */
1567 /* for some reason Windows wants 2 entries with the second being empty */
1568 r->out.info->disks = talloc_array(mem_ctx, struct srvsvc_NetDiskInfo0, 2);
1569 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks);
1570 r->out.info->count = 2;
1572 r->out.info->disks[0].disk = talloc_strdup(mem_ctx, "C:");
1573 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[0].disk);
1575 r->out.info->disks[1].disk = talloc_strdup(mem_ctx, "");
1576 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[1].disk);
1578 *r->out.totalentries = 1;
1579 r->out.resume_handle = r->in.resume_handle;
1584 return WERR_UNKNOWN_LEVEL;
1587 return WERR_UNKNOWN_LEVEL;
1592 srvsvc_NetServerStatisticsGet
1594 static WERROR dcesrv_srvsvc_NetServerStatisticsGet(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1595 struct srvsvc_NetServerStatisticsGet *r)
1597 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1602 srvsvc_NetTransportAdd
1604 static WERROR dcesrv_srvsvc_NetTransportAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1605 struct srvsvc_NetTransportAdd *r)
1607 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1612 srvsvc_NetTransportEnum
1614 static WERROR dcesrv_srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1615 struct srvsvc_NetTransportEnum *r)
1617 r->out.transports->level = r->in.transports->level;
1618 *r->out.totalentries = 0;
1619 if (r->out.resume_handle) {
1620 *r->out.resume_handle = 0;
1623 switch (r->in.transports->level) {
1626 r->out.transports->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetTransportCtr0);
1627 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr0);
1629 r->out.transports->ctr.ctr0->count = 0;
1630 r->out.transports->ctr.ctr0->array = NULL;
1632 return WERR_NOT_SUPPORTED;
1636 r->out.transports->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetTransportCtr1);
1637 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr1);
1639 r->out.transports->ctr.ctr1->count = 0;
1640 r->out.transports->ctr.ctr1->array = NULL;
1642 return WERR_NOT_SUPPORTED;
1646 r->out.transports->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetTransportCtr2);
1647 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr2);
1649 r->out.transports->ctr.ctr2->count = 0;
1650 r->out.transports->ctr.ctr2->array = NULL;
1652 return WERR_NOT_SUPPORTED;
1656 r->out.transports->ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetTransportCtr3);
1657 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr3);
1659 r->out.transports->ctr.ctr3->count = 0;
1660 r->out.transports->ctr.ctr3->array = NULL;
1662 return WERR_NOT_SUPPORTED;
1665 return WERR_UNKNOWN_LEVEL;
1668 return WERR_UNKNOWN_LEVEL;
1672 srvsvc_NetTransportDel
1674 static WERROR dcesrv_srvsvc_NetTransportDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1675 struct srvsvc_NetTransportDel *r)
1677 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1684 static WERROR dcesrv_srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1685 struct srvsvc_NetRemoteTOD *r)
1687 struct timeval tval;
1690 struct srvsvc_NetRemoteTODInfo *info;
1692 info = talloc(mem_ctx, struct srvsvc_NetRemoteTODInfo);
1693 W_ERROR_HAVE_NO_MEMORY(info);
1695 GetTimeOfDay(&tval);
1701 /* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
1702 info->msecs = (tm.tm_hour*60*60*1000)
1703 + (tm.tm_min*60*1000)
1705 + (tval.tv_usec/1000);
1706 info->hours = tm.tm_hour;
1707 info->mins = tm.tm_min;
1708 info->secs = tm.tm_sec;
1709 info->hunds = tval.tv_usec/10000;
1710 info->timezone = get_time_zone(t)/60;
1711 info->tinterval = 310; /* just return the same as windows */
1712 info->day = tm.tm_mday;
1713 info->month = tm.tm_mon + 1;
1714 info->year = tm.tm_year + 1900;
1715 info->weekday = tm.tm_wday;
1717 *r->out.info = info;
1725 static WERROR dcesrv_srvsvc_NetPathType(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1726 struct srvsvc_NetPathType *r)
1728 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1733 srvsvc_NetPathCanonicalize
1735 static WERROR dcesrv_srvsvc_NetPathCanonicalize(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1736 struct srvsvc_NetPathCanonicalize *r)
1738 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1743 srvsvc_NetPathCompare
1745 static WERROR dcesrv_srvsvc_NetPathCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1746 struct srvsvc_NetPathCompare *r)
1748 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1753 srvsvc_NetNameValidate
1755 static WERROR dcesrv_srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1756 struct srvsvc_NetNameValidate *r)
1760 if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) {
1761 return WERR_INVALID_NAME;
1764 switch (r->in.name_type) {
1773 return WERR_NOT_SUPPORTED;
1775 case 9: /* validate share name */
1777 len = strlen_m(r->in.name);
1778 if ((r->in.flags == 0x0) && (len > 81)) {
1779 return WERR_INVALID_NAME;
1781 if ((r->in.flags == 0x80000000) && (len > 13)) {
1782 return WERR_INVALID_NAME;
1784 if (! dcesrv_common_validate_share_name(mem_ctx, r->in.name)) {
1785 return WERR_INVALID_NAME;
1793 return WERR_NOT_SUPPORTED;
1795 return WERR_INVALID_PARAM;
1798 return WERR_INVALID_PARAM;
1803 srvsvc_NetPRNameCompare
1805 static WERROR dcesrv_srvsvc_NetPRNameCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1806 struct srvsvc_NetPRNameCompare *r)
1808 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1815 static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1816 struct srvsvc_NetShareEnum *r)
1820 const char **snames;
1821 struct share_context *sctx;
1822 struct share_config *scfg;
1823 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1825 r->out.level = r->in.level;
1826 ZERO_STRUCT(r->out.ctr);
1827 r->out.totalentries = 0;
1828 r->out.resume_handle = NULL;
1830 /* TODO: - paging of results
1833 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);
1834 if (!NT_STATUS_IS_OK(nterr)) {
1835 return ntstatus_to_werror(nterr);
1838 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
1839 if (!NT_STATUS_IS_OK(nterr)) {
1840 return ntstatus_to_werror(nterr);
1843 switch (r->in.level) {
1848 struct srvsvc_NetShareCtr0 *ctr0;
1850 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
1851 W_ERROR_HAVE_NO_MEMORY(ctr0);
1854 ctr0->count = count;
1857 if (ctr0->count == 0) {
1858 r->out.ctr.ctr0 = ctr0;
1862 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, count);
1863 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
1865 for (i=0; i < count; i++) {
1867 union srvsvc_NetShareInfo info;
1868 enum srvsvc_ShareType type;
1870 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1871 if (!NT_STATUS_IS_OK(nterr)) {
1872 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1873 return WERR_GENERAL_FAILURE;
1876 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1877 if (type & STYPE_HIDDEN) {
1883 info.info0 = &ctr0->array[y];
1884 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1885 W_ERROR_NOT_OK_RETURN(status);
1889 talloc_free(snames);
1891 r->out.ctr.ctr0 = ctr0;
1892 r->out.totalentries = r->out.ctr.ctr0->count;
1899 struct srvsvc_NetShareCtr1 *ctr1;
1901 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
1902 W_ERROR_HAVE_NO_MEMORY(ctr1);
1905 ctr1->count = count;
1908 if (ctr1->count == 0) {
1909 r->out.ctr.ctr1 = ctr1;
1913 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, count);
1914 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
1916 for (i=0; i < count; i++) {
1918 union srvsvc_NetShareInfo info;
1919 enum srvsvc_ShareType type;
1921 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1922 if (!NT_STATUS_IS_OK(nterr)) {
1923 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1924 return WERR_GENERAL_FAILURE;
1927 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1928 if (type & STYPE_HIDDEN) {
1934 info.info1 = &ctr1->array[y];
1935 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1936 W_ERROR_NOT_OK_RETURN(status);
1940 talloc_free(snames);
1942 r->out.ctr.ctr1 = ctr1;
1943 r->out.totalentries = r->out.ctr.ctr1->count;
1950 struct srvsvc_NetShareCtr2 *ctr2;
1952 SRVSVC_CHECK_ADMIN_ACCESS;
1954 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
1955 W_ERROR_HAVE_NO_MEMORY(ctr2);
1958 ctr2->count = count;
1961 if (ctr2->count == 0) {
1962 r->out.ctr.ctr2 = ctr2;
1966 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, count);
1967 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
1969 for (i=0; i < count; i++) {
1971 union srvsvc_NetShareInfo info;
1972 enum srvsvc_ShareType type;
1974 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1975 if (!NT_STATUS_IS_OK(nterr)) {
1976 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1977 return WERR_GENERAL_FAILURE;
1980 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1981 if (type & STYPE_HIDDEN) {
1987 info.info2 = &ctr2->array[y];
1988 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1989 W_ERROR_NOT_OK_RETURN(status);
1993 talloc_free(snames);
1995 r->out.ctr.ctr2 = ctr2;
1996 r->out.totalentries = r->out.ctr.ctr2->count;
2003 struct srvsvc_NetShareCtr502 *ctr502;
2005 SRVSVC_CHECK_ADMIN_ACCESS;
2007 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
2008 W_ERROR_HAVE_NO_MEMORY(ctr502);
2011 ctr502->count = count;
2012 ctr502->array = NULL;
2014 if (ctr502->count == 0) {
2015 r->out.ctr.ctr502 = ctr502;
2019 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, count);
2020 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
2022 for (i=0; i < count; i++) {
2024 union srvsvc_NetShareInfo info;
2025 enum srvsvc_ShareType type;
2027 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
2028 if (!NT_STATUS_IS_OK(nterr)) {
2029 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
2030 return WERR_GENERAL_FAILURE;
2033 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
2034 if (type & STYPE_HIDDEN) {
2040 info.info502 = &ctr502->array[y];
2041 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
2042 W_ERROR_NOT_OK_RETURN(status);
2046 talloc_free(snames);
2048 r->out.ctr.ctr502 = ctr502;
2049 r->out.totalentries = r->out.ctr.ctr502->count;
2053 return WERR_UNKNOWN_LEVEL;
2056 return WERR_UNKNOWN_LEVEL;
2061 srvsvc_NetShareDelStart
2063 static WERROR dcesrv_srvsvc_NetShareDelStart(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2064 struct srvsvc_NetShareDelStart *r)
2066 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2071 srvsvc_NetShareDelCommit
2073 static WERROR dcesrv_srvsvc_NetShareDelCommit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2074 struct srvsvc_NetShareDelCommit *r)
2076 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2081 srvsvc_NetGetFileSecurity
2083 static WERROR dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2084 struct srvsvc_NetGetFileSecurity *r)
2086 struct sec_desc_buf *sd_buf;
2087 struct ntvfs_context *ntvfs_ctx = NULL;
2088 struct ntvfs_request *ntvfs_req;
2089 union smb_fileinfo *io;
2092 nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
2093 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2095 ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
2096 dce_call->conn->auth_state.session_info,
2100 W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
2102 sd_buf = talloc(mem_ctx, struct sec_desc_buf);
2103 W_ERROR_HAVE_NO_MEMORY(sd_buf);
2105 io = talloc(mem_ctx, union smb_fileinfo);
2106 W_ERROR_HAVE_NO_MEMORY(io);
2108 io->query_secdesc.level = RAW_FILEINFO_SEC_DESC;
2109 io->query_secdesc.in.file.path = r->in.file;
2110 io->query_secdesc.in.secinfo_flags = r->in.securityinformation;
2112 nt_status = ntvfs_qpathinfo(ntvfs_req, io);
2113 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2115 sd_buf->sd = io->query_secdesc.out.sd;
2117 *r->out.sd_buf = sd_buf;
2123 srvsvc_NetSetFileSecurity
2125 static WERROR dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2126 struct srvsvc_NetSetFileSecurity *r)
2128 struct ntvfs_context *ntvfs_ctx;
2129 struct ntvfs_request *ntvfs_req;
2130 union smb_setfileinfo *io;
2133 nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
2134 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2136 ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
2137 dce_call->conn->auth_state.session_info,
2141 W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
2143 io = talloc(mem_ctx, union smb_setfileinfo);
2144 W_ERROR_HAVE_NO_MEMORY(io);
2146 io->set_secdesc.level = RAW_FILEINFO_SEC_DESC;
2147 io->set_secdesc.in.file.path = r->in.file;
2148 io->set_secdesc.in.secinfo_flags = r->in.securityinformation;
2149 io->set_secdesc.in.sd = r->in.sd_buf->sd;
2151 nt_status = ntvfs_setpathinfo(ntvfs_req, io);
2152 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2159 srvsvc_NetServerTransportAddEx
2161 static WERROR dcesrv_srvsvc_NetServerTransportAddEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2162 struct srvsvc_NetServerTransportAddEx *r)
2164 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2169 srvsvc_NetServerSetServiceBitsEx
2171 static WERROR dcesrv_srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2172 struct srvsvc_NetServerSetServiceBitsEx *r)
2174 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2179 srvsvc_NETRDFSGETVERSION
2181 static WERROR dcesrv_srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2182 struct srvsvc_NETRDFSGETVERSION *r)
2184 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2189 srvsvc_NETRDFSCREATELOCALPARTITION
2191 static WERROR dcesrv_srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2192 struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
2194 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2199 srvsvc_NETRDFSDELETELOCALPARTITION
2201 static WERROR dcesrv_srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2202 struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
2204 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2209 srvsvc_NETRDFSSETLOCALVOLUMESTATE
2211 static WERROR dcesrv_srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2212 struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
2214 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2219 srvsvc_NETRDFSSETSERVERINFO
2221 static WERROR dcesrv_srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2222 struct srvsvc_NETRDFSSETSERVERINFO *r)
2224 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2229 srvsvc_NETRDFSCREATEEXITPOINT
2231 static WERROR dcesrv_srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2232 struct srvsvc_NETRDFSCREATEEXITPOINT *r)
2234 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2239 srvsvc_NETRDFSDELETEEXITPOINT
2241 static WERROR dcesrv_srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2242 struct srvsvc_NETRDFSDELETEEXITPOINT *r)
2244 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2249 srvsvc_NETRDFSMODIFYPREFIX
2251 static WERROR dcesrv_srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2252 struct srvsvc_NETRDFSMODIFYPREFIX *r)
2254 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2259 srvsvc_NETRDFSFIXLOCALVOLUME
2261 static WERROR dcesrv_srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2262 struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
2264 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2269 srvsvc_NETRDFSMANAGERREPORTSITEINFO
2271 static WERROR dcesrv_srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2272 struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
2274 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2279 srvsvc_NETRSERVERTRANSPORTDELEX
2281 static WERROR dcesrv_srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2282 struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
2284 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2290 static WERROR dcesrv_srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2291 struct srvsvc_NetShareDel *r)
2294 struct share_context *sctx;
2296 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);
2297 if (!NT_STATUS_IS_OK(nterr)) {
2298 return ntstatus_to_werror(nterr);
2301 nterr = share_remove(sctx, r->in.share_name);
2302 if (!NT_STATUS_IS_OK(nterr)) {
2303 return ntstatus_to_werror(nterr);
2310 srvsvc_NetSetServiceBits
2312 static WERROR dcesrv_srvsvc_NetSetServiceBits(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2313 struct srvsvc_NetSetServiceBits *r)
2315 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2319 srvsvc_NETRPRNAMECANONICALIZE
2321 static WERROR dcesrv_srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2322 struct srvsvc_NETRPRNAMECANONICALIZE *r)
2324 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2327 /* include the generated boilerplate */
2328 #include "librpc/gen_ndr/ndr_srvsvc_s.c"