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 2 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, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "ntvfs/ntvfs.h"
25 #include "rpc_server/dcerpc_server.h"
26 #include "librpc/gen_ndr/ndr_srvsvc.h"
27 #include "rpc_server/common/common.h"
28 #include "auth/auth.h"
29 #include "libcli/security/security.h"
30 #include "system/time.h"
31 #include "rpc_server/srvsvc/proto.h"
33 #define SRVSVC_CHECK_ADMIN_ACCESS do { \
34 struct security_token *t = dce_call->conn->auth_state.session_info->security_token; \
35 if (!security_token_has_builtin_administrators(t) && \
36 !security_token_has_sid_string(t, SID_BUILTIN_SERVER_OPERATORS)) { \
37 return WERR_ACCESS_DENIED; \
44 static WERROR srvsvc_NetCharDevEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
45 struct srvsvc_NetCharDevEnum *r)
47 r->out.level = r->in.level;
48 r->out.totalentries = 0;
49 r->out.resume_handle = NULL;
51 switch (r->in.level) {
53 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr0);
54 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
56 r->out.ctr.ctr0->count = 0;
57 r->out.ctr.ctr0->array = NULL;
59 return WERR_NOT_SUPPORTED;
62 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr1);
63 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
65 r->out.ctr.ctr1->count = 0;
66 r->out.ctr.ctr1->array = NULL;
68 return WERR_NOT_SUPPORTED;
71 return WERR_UNKNOWN_LEVEL;
79 srvsvc_NetCharDevGetInfo
81 static WERROR srvsvc_NetCharDevGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
82 struct srvsvc_NetCharDevGetInfo *r)
86 switch (r->in.level) {
89 return WERR_NOT_SUPPORTED;
93 return WERR_NOT_SUPPORTED;
96 return WERR_UNKNOWN_LEVEL;
99 return WERR_UNKNOWN_LEVEL;
104 srvsvc_NetCharDevControl
106 static WERROR srvsvc_NetCharDevControl(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
107 struct srvsvc_NetCharDevControl *r)
109 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
114 srvsvc_NetCharDevQEnum
116 static WERROR srvsvc_NetCharDevQEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
117 struct srvsvc_NetCharDevQEnum *r)
119 r->out.level = r->in.level;
120 r->out.totalentries = 0;
121 r->out.resume_handle = NULL;
123 switch (r->in.level) {
126 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr0);
127 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
129 r->out.ctr.ctr0->count = 0;
130 r->out.ctr.ctr0->array = NULL;
132 return WERR_NOT_SUPPORTED;
136 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr1);
137 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
139 r->out.ctr.ctr1->count = 0;
140 r->out.ctr.ctr1->array = NULL;
142 return WERR_NOT_SUPPORTED;
145 return WERR_UNKNOWN_LEVEL;
148 return WERR_UNKNOWN_LEVEL;
153 srvsvc_NetCharDevQGetInfo
155 static WERROR srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
156 struct srvsvc_NetCharDevQGetInfo *r)
160 switch (r->in.level) {
163 return WERR_NOT_SUPPORTED;
167 return WERR_NOT_SUPPORTED;
170 return WERR_UNKNOWN_LEVEL;
173 return WERR_UNKNOWN_LEVEL;
178 srvsvc_NetCharDevQSetInfo
180 static WERROR srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
181 struct srvsvc_NetCharDevQSetInfo *r)
183 switch (r->in.level) {
186 if (r->in.parm_error) {
187 r->out.parm_error = r->in.parm_error;
189 return WERR_NOT_SUPPORTED;
193 if (r->in.parm_error) {
194 r->out.parm_error = r->in.parm_error;
196 return WERR_NOT_SUPPORTED;
199 return WERR_UNKNOWN_LEVEL;
202 return WERR_UNKNOWN_LEVEL;
207 srvsvc_NetCharDevQPurge
209 static WERROR srvsvc_NetCharDevQPurge(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
210 struct srvsvc_NetCharDevQPurge *r)
212 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
217 srvsvc_NetCharDevQPurgeSelf
219 static WERROR srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
220 struct srvsvc_NetCharDevQPurgeSelf *r)
222 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
229 static WERROR srvsvc_NetConnEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
230 struct srvsvc_NetConnEnum *r)
232 r->out.level = r->in.level;
233 r->out.totalentries = 0;
234 r->out.resume_handle = NULL;
236 switch (r->in.level) {
239 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetConnCtr0);
240 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
242 r->out.ctr.ctr0->count = 0;
243 r->out.ctr.ctr0->array = NULL;
245 return WERR_NOT_SUPPORTED;
249 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetConnCtr1);
250 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
252 r->out.ctr.ctr1->count = 0;
253 r->out.ctr.ctr1->array = NULL;
255 return WERR_NOT_SUPPORTED;
258 return WERR_UNKNOWN_LEVEL;
261 return WERR_UNKNOWN_LEVEL;
268 static WERROR srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
269 struct srvsvc_NetFileEnum *r)
271 r->out.level = r->in.level;
272 r->out.totalentries = 0;
273 r->out.resume_handle = NULL;
275 switch (r->in.level) {
278 r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetFileCtr2);
279 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
281 r->out.ctr.ctr2->count = 0;
282 r->out.ctr.ctr2->array = NULL;
284 return WERR_NOT_SUPPORTED;
288 r->out.ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetFileCtr3);
289 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr3);
291 r->out.ctr.ctr3->count = 0;
292 r->out.ctr.ctr3->array = NULL;
294 return WERR_NOT_SUPPORTED;
297 return WERR_UNKNOWN_LEVEL;
300 return WERR_UNKNOWN_LEVEL;
305 srvsvc_NetFileGetInfo
307 static WERROR srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
308 struct srvsvc_NetFileGetInfo *r)
312 switch (r->in.level) {
315 return WERR_NOT_SUPPORTED;
319 return WERR_NOT_SUPPORTED;
322 return WERR_UNKNOWN_LEVEL;
325 return WERR_UNKNOWN_LEVEL;
332 static WERROR srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
333 struct srvsvc_NetFileClose *r)
335 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
342 static WERROR srvsvc_NetSessEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
343 struct srvsvc_NetSessEnum *r)
345 r->out.level = r->in.level;
346 r->out.totalentries = 0;
347 r->out.resume_handle = NULL;
349 switch (r->in.level) {
352 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetSessCtr0);
353 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
355 r->out.ctr.ctr0->count = 0;
356 r->out.ctr.ctr0->array = NULL;
358 return WERR_NOT_SUPPORTED;
362 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetSessCtr1);
363 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
365 r->out.ctr.ctr1->count = 0;
366 r->out.ctr.ctr1->array = NULL;
368 return WERR_NOT_SUPPORTED;
372 r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetSessCtr2);
373 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
375 r->out.ctr.ctr2->count = 0;
376 r->out.ctr.ctr2->array = NULL;
378 return WERR_NOT_SUPPORTED;
382 r->out.ctr.ctr10 = talloc(mem_ctx, struct srvsvc_NetSessCtr10);
383 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr10);
385 r->out.ctr.ctr2->count = 0;
386 r->out.ctr.ctr2->array = NULL;
388 return WERR_NOT_SUPPORTED;
392 r->out.ctr.ctr502 = talloc(mem_ctx, struct srvsvc_NetSessCtr502);
393 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr502);
395 r->out.ctr.ctr2->count = 0;
396 r->out.ctr.ctr2->array = NULL;
398 return WERR_NOT_SUPPORTED;
401 return WERR_UNKNOWN_LEVEL;
404 return WERR_UNKNOWN_LEVEL;
411 static WERROR srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
412 struct srvsvc_NetSessDel *r)
414 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
421 static WERROR srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
422 struct srvsvc_NetShareAdd *r)
424 switch (r->in.level) {
427 if (r->in.parm_error) {
428 r->out.parm_error = r->in.parm_error;
430 return WERR_NOT_SUPPORTED;
434 if (r->in.parm_error) {
435 r->out.parm_error = r->in.parm_error;
437 return WERR_NOT_SUPPORTED;
441 if (r->in.parm_error) {
442 r->out.parm_error = r->in.parm_error;
444 return WERR_NOT_SUPPORTED;
448 if (r->in.parm_error) {
449 r->out.parm_error = r->in.parm_error;
451 return WERR_NOT_SUPPORTED;
456 struct share_info *info;
457 struct share_context *sctx;
459 nterr = share_get_context(mem_ctx, &sctx);
460 if (!NT_STATUS_IS_OK(nterr)) {
461 return ntstatus_to_werror(nterr);
464 info = talloc_zero(mem_ctx, struct share_info);
465 W_ERROR_HAVE_NO_MEMORY(info);
467 info->name = talloc_strdup(info, r->in.info.info502->name);
468 W_ERROR_HAVE_NO_MEMORY(info->name);
469 switch (r->in.info.info502->type) {
471 info->type = talloc_strdup(mem_ctx, "DISK");
474 info->type = talloc_strdup(mem_ctx, "PRINTER");
477 info->type = talloc_strdup(mem_ctx, "IPC");
480 return WERR_INVALID_PARAM;
482 W_ERROR_HAVE_NO_MEMORY(info->type);
484 /* Windows will send a path in a form of C:\example\path */
485 if (r->in.info.info502->path[1] == ':') {
486 info->path = talloc_strdup(info, &r->in.info.info502->path[2]);
488 info->path = talloc_strdup(info, r->in.info.info502->path);
490 W_ERROR_HAVE_NO_MEMORY(info->path);
491 all_string_sub(info->path, "\\", "/", 0);
493 if (r->in.info.info502->comment && r->in.info.info502->comment[0]) {
494 info->comment = talloc_strdup(info, r->in.info.info502->comment);
495 W_ERROR_HAVE_NO_MEMORY(info->comment);
498 if (r->in.info.info502->password && r->in.info.info502->password[0]) {
499 info->password = talloc_strdup(info, r->in.info.info502->password);
500 W_ERROR_HAVE_NO_MEMORY(info->password);
503 info->max_users = r->in.info.info502->max_users;
504 /* TODO: security descriptor */
507 nterr = share_create(sctx, info);
508 if (!NT_STATUS_IS_OK(nterr)) {
509 return ntstatus_to_werror(nterr);
512 if (r->in.parm_error) {
513 r->out.parm_error = r->in.parm_error;
519 return WERR_UNKNOWN_LEVEL;
522 return WERR_UNKNOWN_LEVEL;
525 static WERROR srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
526 struct share_config *scfg, uint32_t level,
527 union srvsvc_NetShareInfo *info)
529 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
534 info->info0->name = talloc_strdup(mem_ctx, scfg->name);
535 W_ERROR_HAVE_NO_MEMORY(info->info0->name);
541 info->info1->name = talloc_strdup(mem_ctx, scfg->name);
542 W_ERROR_HAVE_NO_MEMORY(info->info1->name);
543 info->info1->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
544 info->info1->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
545 W_ERROR_HAVE_NO_MEMORY(info->info1->comment);
551 info->info2->name = talloc_strdup(mem_ctx, scfg->name);
552 W_ERROR_HAVE_NO_MEMORY(info->info2->name);
553 info->info2->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
554 info->info2->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
555 W_ERROR_HAVE_NO_MEMORY(info->info2->comment);
556 info->info2->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
557 info->info2->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
558 info->info2->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
559 info->info2->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
560 W_ERROR_HAVE_NO_MEMORY(info->info2->path);
561 info->info2->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
567 info->info501->name = talloc_strdup(mem_ctx, scfg->name);
568 W_ERROR_HAVE_NO_MEMORY(info->info501->name);
569 info->info501->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
570 info->info501->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
571 W_ERROR_HAVE_NO_MEMORY(info->info501->comment);
572 info->info501->csc_policy = share_int_option(scfg, SHARE_CSC_POLICY, SHARE_CSC_POLICY_DEFAULT);
578 info->info502->name = talloc_strdup(mem_ctx, scfg->name);
579 W_ERROR_HAVE_NO_MEMORY(info->info502->name);
580 info->info502->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
581 info->info502->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
582 W_ERROR_HAVE_NO_MEMORY(info->info502->comment);
583 info->info502->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
584 info->info502->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
585 info->info502->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
586 info->info502->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
587 W_ERROR_HAVE_NO_MEMORY(info->info502->path);
588 info->info502->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
589 info->info502->unknown = dcesrv_common_get_share_unknown(mem_ctx, dce_ctx, scfg);
590 info->info502->sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, scfg);
596 info->info1005->dfs_flags = dcesrv_common_get_share_dfs_flags(mem_ctx, dce_ctx, scfg);
601 return WERR_UNKNOWN_LEVEL;
604 return WERR_UNKNOWN_LEVEL;
608 srvsvc_NetShareEnumAll
610 static WERROR srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
611 struct srvsvc_NetShareEnumAll *r)
616 struct share_context *sctx;
617 struct share_config *scfg;
619 r->out.level = r->in.level;
620 ZERO_STRUCT(r->out.ctr);
621 r->out.totalentries = 0;
622 r->out.resume_handle = NULL;
624 /* TODO: - paging of results
627 nterr = share_get_context(mem_ctx, &sctx);
628 if (!NT_STATUS_IS_OK(nterr)) {
629 return ntstatus_to_werror(nterr);
632 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
633 if (!NT_STATUS_IS_OK(nterr)) {
634 return ntstatus_to_werror(nterr);
637 switch (r->in.level) {
641 struct srvsvc_NetShareCtr0 *ctr0;
643 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
644 W_ERROR_HAVE_NO_MEMORY(ctr0);
646 ctr0->count = numshares;
649 if (ctr0->count == 0) {
650 r->out.ctr.ctr0 = ctr0;
654 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, ctr0->count);
655 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
657 for (i = 0; i < ctr0->count; i++) {
659 union srvsvc_NetShareInfo info;
661 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
662 if (!NT_STATUS_IS_OK(nterr)) {
663 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
664 return WERR_GENERAL_FAILURE;
666 info.info0 = &ctr0->array[i];
667 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
668 if (!W_ERROR_IS_OK(status)) {
675 r->out.ctr.ctr0 = ctr0;
676 r->out.totalentries = r->out.ctr.ctr0->count;
682 struct srvsvc_NetShareCtr1 *ctr1;
684 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
685 W_ERROR_HAVE_NO_MEMORY(ctr1);
687 ctr1->count = numshares;
690 if (ctr1->count == 0) {
691 r->out.ctr.ctr1 = ctr1;
695 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, ctr1->count);
696 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
698 for (i=0; i < ctr1->count; i++) {
700 union srvsvc_NetShareInfo info;
702 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
703 if (!NT_STATUS_IS_OK(nterr)) {
704 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
705 return WERR_GENERAL_FAILURE;
707 info.info1 = &ctr1->array[i];
708 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
709 if (!W_ERROR_IS_OK(status)) {
716 r->out.ctr.ctr1 = ctr1;
717 r->out.totalentries = r->out.ctr.ctr1->count;
723 struct srvsvc_NetShareCtr2 *ctr2;
725 SRVSVC_CHECK_ADMIN_ACCESS;
727 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
728 W_ERROR_HAVE_NO_MEMORY(ctr2);
730 ctr2->count = numshares;
733 if (ctr2->count == 0) {
734 r->out.ctr.ctr2 = ctr2;
738 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, ctr2->count);
739 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
741 for (i=0; i < ctr2->count; i++) {
743 union srvsvc_NetShareInfo info;
745 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
746 if (!NT_STATUS_IS_OK(nterr)) {
747 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
748 return WERR_GENERAL_FAILURE;
750 info.info2 = &ctr2->array[i];
751 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
752 if (!W_ERROR_IS_OK(status)) {
759 r->out.ctr.ctr2 = ctr2;
760 r->out.totalentries = r->out.ctr.ctr2->count;
766 struct srvsvc_NetShareCtr501 *ctr501;
768 SRVSVC_CHECK_ADMIN_ACCESS;
770 ctr501 = talloc(mem_ctx, struct srvsvc_NetShareCtr501);
771 W_ERROR_HAVE_NO_MEMORY(ctr501);
773 ctr501->count = numshares;
774 ctr501->array = NULL;
776 if (ctr501->count == 0) {
777 r->out.ctr.ctr501 = ctr501;
781 ctr501->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo501, ctr501->count);
782 W_ERROR_HAVE_NO_MEMORY(ctr501->array);
784 for (i=0; i < ctr501->count; i++) {
786 union srvsvc_NetShareInfo info;
788 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
789 if (!NT_STATUS_IS_OK(nterr)) {
790 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
791 return WERR_GENERAL_FAILURE;
793 info.info501 = &ctr501->array[i];
794 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
795 if (!W_ERROR_IS_OK(status)) {
802 r->out.ctr.ctr501 = ctr501;
803 r->out.totalentries = r->out.ctr.ctr501->count;
809 struct srvsvc_NetShareCtr502 *ctr502;
811 SRVSVC_CHECK_ADMIN_ACCESS;
813 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
814 W_ERROR_HAVE_NO_MEMORY(ctr502);
816 ctr502->count = numshares;
817 ctr502->array = NULL;
819 if (ctr502->count == 0) {
820 r->out.ctr.ctr502 = ctr502;
824 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, ctr502->count);
825 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
827 for (i=0; i < ctr502->count; i++) {
829 union srvsvc_NetShareInfo info;
831 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
832 if (!NT_STATUS_IS_OK(nterr)) {
833 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
834 return WERR_GENERAL_FAILURE;
836 info.info502 = &ctr502->array[i];
837 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
838 if (!W_ERROR_IS_OK(status)) {
845 r->out.ctr.ctr502 = ctr502;
846 r->out.totalentries = r->out.ctr.ctr502->count;
850 return WERR_UNKNOWN_LEVEL;
853 return WERR_UNKNOWN_LEVEL;
858 srvsvc_NetShareGetInfo
860 static WERROR srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
861 struct srvsvc_NetShareGetInfo *r)
864 struct share_context *sctx = NULL;
865 struct share_config *scfg = NULL;
869 /* TODO: - access check
872 if (strcmp("", r->in.share_name) == 0) {
873 return WERR_INVALID_PARAM;
876 nterr = share_get_context(mem_ctx, &sctx);
877 if (!NT_STATUS_IS_OK(nterr)) {
878 return ntstatus_to_werror(nterr);
881 nterr = share_get_config(mem_ctx, sctx, r->in.share_name, &scfg);
882 if (!NT_STATUS_IS_OK(nterr)) {
883 return ntstatus_to_werror(nterr);
886 switch (r->in.level) {
890 union srvsvc_NetShareInfo info;
892 info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0);
893 W_ERROR_HAVE_NO_MEMORY(info.info0);
895 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
896 if (!W_ERROR_IS_OK(status)) {
900 r->out.info.info0 = info.info0;
906 union srvsvc_NetShareInfo info;
908 info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1);
909 W_ERROR_HAVE_NO_MEMORY(info.info1);
911 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
912 if (!W_ERROR_IS_OK(status)) {
916 r->out.info.info1 = info.info1;
922 union srvsvc_NetShareInfo info;
924 SRVSVC_CHECK_ADMIN_ACCESS;
926 info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
927 W_ERROR_HAVE_NO_MEMORY(info.info2);
929 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
930 if (!W_ERROR_IS_OK(status)) {
934 r->out.info.info2 = info.info2;
940 union srvsvc_NetShareInfo info;
942 info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501);
943 W_ERROR_HAVE_NO_MEMORY(info.info501);
945 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
946 if (!W_ERROR_IS_OK(status)) {
950 r->out.info.info501 = info.info501;
956 union srvsvc_NetShareInfo info;
958 SRVSVC_CHECK_ADMIN_ACCESS;
960 info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502);
961 W_ERROR_HAVE_NO_MEMORY(info.info502);
963 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
964 if (!W_ERROR_IS_OK(status)) {
968 r->out.info.info502 = info.info502;
974 union srvsvc_NetShareInfo info;
976 info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005);
977 W_ERROR_HAVE_NO_MEMORY(info.info1005);
979 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
980 if (!W_ERROR_IS_OK(status)) {
984 r->out.info.info1005 = info.info1005;
988 return WERR_UNKNOWN_LEVEL;
991 return WERR_UNKNOWN_LEVEL;
996 srvsvc_NetShareSetInfo
998 static WERROR srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
999 struct srvsvc_NetShareSetInfo *r)
1001 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1006 srvsvc_NetShareDelSticky
1008 static WERROR srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1009 struct srvsvc_NetShareDelSticky *r)
1011 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1016 srvsvc_NetShareCheck
1018 static WERROR srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1019 struct srvsvc_NetShareCheck *r)
1021 ZERO_STRUCT(r->out);
1023 /* TODO: - access check
1026 if (strcmp("", r->in.device_name) == 0) {
1027 r->out.type = STYPE_IPC;
1031 if (strcmp("C:\\", r->in.device_name) == 0) {
1032 r->out.type = STYPE_DISKTREE;
1036 /* TODO: - lookup the share be devicename (path) */
1037 return WERR_DEVICE_NOT_SHARED;
1042 srvsvc_NetSrvGetInfo
1044 static WERROR srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1045 struct srvsvc_NetSrvGetInfo *r)
1047 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1049 ZERO_STRUCT(r->out);
1051 switch (r->in.level) {
1054 struct srvsvc_NetSrvInfo100 *info100;
1056 info100 = talloc(mem_ctx, struct srvsvc_NetSrvInfo100);
1057 W_ERROR_HAVE_NO_MEMORY(info100);
1059 info100->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1060 info100->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1061 W_ERROR_HAVE_NO_MEMORY(info100->server_name);
1063 r->out.info.info100 = info100;
1068 struct srvsvc_NetSrvInfo101 *info101;
1070 info101 = talloc(mem_ctx, struct srvsvc_NetSrvInfo101);
1071 W_ERROR_HAVE_NO_MEMORY(info101);
1073 info101->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1074 info101->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1075 W_ERROR_HAVE_NO_MEMORY(info101->server_name);
1077 info101->version_major = dcesrv_common_get_version_major(mem_ctx, dce_ctx);
1078 info101->version_minor = dcesrv_common_get_version_minor(mem_ctx, dce_ctx);
1079 info101->server_type = dcesrv_common_get_server_type(mem_ctx, dce_ctx);
1080 info101->comment = talloc_strdup(mem_ctx, lp_serverstring());
1081 W_ERROR_HAVE_NO_MEMORY(info101->comment);
1083 r->out.info.info101 = info101;
1088 struct srvsvc_NetSrvInfo102 *info102;
1090 info102 = talloc(mem_ctx, struct srvsvc_NetSrvInfo102);
1091 W_ERROR_HAVE_NO_MEMORY(info102);
1093 info102->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1094 info102->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1095 W_ERROR_HAVE_NO_MEMORY(info102->server_name);
1097 info102->version_major = dcesrv_common_get_version_major(mem_ctx, dce_ctx);
1098 info102->version_minor = dcesrv_common_get_version_minor(mem_ctx, dce_ctx);
1099 info102->server_type = dcesrv_common_get_server_type(mem_ctx, dce_ctx);
1100 info102->comment = talloc_strdup(mem_ctx, lp_serverstring());
1101 W_ERROR_HAVE_NO_MEMORY(info102->comment);
1103 info102->users = dcesrv_common_get_users(mem_ctx, dce_ctx);
1104 info102->disc = dcesrv_common_get_disc(mem_ctx, dce_ctx);
1105 info102->hidden = dcesrv_common_get_hidden(mem_ctx, dce_ctx);
1106 info102->announce = dcesrv_common_get_announce(mem_ctx, dce_ctx);
1107 info102->anndelta = dcesrv_common_get_anndelta(mem_ctx, dce_ctx);
1108 info102->licenses = dcesrv_common_get_licenses(mem_ctx, dce_ctx);
1109 info102->userpath = dcesrv_common_get_userpath(mem_ctx, dce_ctx);
1110 W_ERROR_HAVE_NO_MEMORY(info102->userpath);
1112 r->out.info.info102 = info102;
1116 return WERR_UNKNOWN_LEVEL;
1119 return WERR_UNKNOWN_LEVEL;
1124 srvsvc_NetSrvSetInfo
1126 static WERROR srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1127 struct srvsvc_NetSrvSetInfo *r)
1129 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1136 static WERROR srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1137 struct srvsvc_NetDiskEnum *r)
1139 r->out.info.disks = NULL;
1140 r->out.info.count = 0;
1141 r->out.totalentries = 0;
1142 r->out.resume_handle = NULL;
1144 switch (r->in.level) {
1147 /* we can safely hardcode the reply and report we have only one disk (C:) */
1148 /* for some reason Windows wants 2 entries with the second being empty */
1149 r->out.info.disks = talloc_array(mem_ctx, struct srvsvc_NetDiskInfo0, 2);
1150 W_ERROR_HAVE_NO_MEMORY(r->out.info.disks);
1151 r->out.info.count = 2;
1153 r->out.info.disks[0].disk = talloc_strdup(mem_ctx, "C:");
1154 W_ERROR_HAVE_NO_MEMORY(r->out.info.disks[0].disk);
1156 r->out.info.disks[1].disk = talloc_strdup(mem_ctx, "");
1157 W_ERROR_HAVE_NO_MEMORY(r->out.info.disks[1].disk);
1159 r->out.totalentries = 1;
1160 r->out.resume_handle = r->in.resume_handle;
1165 return WERR_UNKNOWN_LEVEL;
1168 return WERR_UNKNOWN_LEVEL;
1173 srvsvc_NetServerStatisticsGet
1175 static WERROR srvsvc_NetServerStatisticsGet(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1176 struct srvsvc_NetServerStatisticsGet *r)
1178 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1183 srvsvc_NetTransportAdd
1185 static WERROR srvsvc_NetTransportAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1186 struct srvsvc_NetTransportAdd *r)
1188 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1193 srvsvc_NetTransportEnum
1195 static WERROR srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1196 struct srvsvc_NetTransportEnum *r)
1198 r->out.level = r->in.level;
1199 r->out.totalentries = 0;
1200 r->out.resume_handle = NULL;
1202 switch (r->in.level) {
1205 r->out.transports.ctr0 = talloc(mem_ctx, struct srvsvc_NetTransportCtr0);
1206 W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr0);
1208 r->out.transports.ctr0->count = 0;
1209 r->out.transports.ctr0->array = NULL;
1211 return WERR_NOT_SUPPORTED;
1215 r->out.transports.ctr1 = talloc(mem_ctx, struct srvsvc_NetTransportCtr1);
1216 W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr1);
1218 r->out.transports.ctr1->count = 0;
1219 r->out.transports.ctr1->array = NULL;
1221 return WERR_NOT_SUPPORTED;
1225 r->out.transports.ctr2 = talloc(mem_ctx, struct srvsvc_NetTransportCtr2);
1226 W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr2);
1228 r->out.transports.ctr2->count = 0;
1229 r->out.transports.ctr2->array = NULL;
1231 return WERR_NOT_SUPPORTED;
1235 r->out.transports.ctr3 = talloc(mem_ctx, struct srvsvc_NetTransportCtr3);
1236 W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr3);
1238 r->out.transports.ctr3->count = 0;
1239 r->out.transports.ctr3->array = NULL;
1241 return WERR_NOT_SUPPORTED;
1244 return WERR_UNKNOWN_LEVEL;
1247 return WERR_UNKNOWN_LEVEL;
1251 srvsvc_NetTransportDel
1253 static WERROR srvsvc_NetTransportDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1254 struct srvsvc_NetTransportDel *r)
1256 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1263 static WERROR srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1264 struct srvsvc_NetRemoteTOD *r)
1266 struct timeval tval;
1270 r->out.info = talloc(mem_ctx, struct srvsvc_NetRemoteTODInfo);
1271 W_ERROR_HAVE_NO_MEMORY(r->out.info);
1273 GetTimeOfDay(&tval);
1278 r->out.info->elapsed = t;
1279 /* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
1280 r->out.info->msecs = (tm.tm_hour*60*60*1000)
1281 + (tm.tm_min*60*1000)
1283 + (tval.tv_usec/1000);
1284 r->out.info->hours = tm.tm_hour;
1285 r->out.info->mins = tm.tm_min;
1286 r->out.info->secs = tm.tm_sec;
1287 r->out.info->hunds = tval.tv_usec/10000;
1288 r->out.info->timezone = get_time_zone(t)/60;
1289 r->out.info->tinterval = 310; /* just return the same as windows */
1290 r->out.info->day = tm.tm_mday;
1291 r->out.info->month = tm.tm_mon + 1;
1292 r->out.info->year = tm.tm_year + 1900;
1293 r->out.info->weekday = tm.tm_wday;
1301 static WERROR srvsvc_NetPathType(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1302 struct srvsvc_NetPathType *r)
1304 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1309 srvsvc_NetPathCanonicalize
1311 static WERROR srvsvc_NetPathCanonicalize(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1312 struct srvsvc_NetPathCanonicalize *r)
1314 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1319 srvsvc_NetPathCompare
1321 static WERROR srvsvc_NetPathCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1322 struct srvsvc_NetPathCompare *r)
1324 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1329 srvsvc_NetNameValidate
1331 static WERROR srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1332 struct srvsvc_NetNameValidate *r)
1336 if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) {
1337 return WERR_INVALID_NAME;
1340 switch (r->in.name_type) {
1349 return WERR_NOT_SUPPORTED;
1351 case 9: /* validate share name */
1353 len = strlen_m(r->in.name);
1354 if ((r->in.flags == 0x0) && (len > 81)) {
1355 return WERR_INVALID_NAME;
1357 if ((r->in.flags == 0x80000000) && (len > 13)) {
1358 return WERR_INVALID_NAME;
1360 if (! dcesrv_common_validate_share_name(mem_ctx, r->in.name)) {
1361 return WERR_INVALID_NAME;
1369 return WERR_NOT_SUPPORTED;
1371 return WERR_INVALID_PARAM;
1374 return WERR_INVALID_PARAM;
1379 srvsvc_NetPRNameCompare
1381 static WERROR srvsvc_NetPRNameCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1382 struct srvsvc_NetPRNameCompare *r)
1384 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1391 static WERROR srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1392 struct srvsvc_NetShareEnum *r)
1396 const char **snames;
1397 struct share_context *sctx;
1398 struct share_config *scfg;
1399 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1401 r->out.level = r->in.level;
1402 ZERO_STRUCT(r->out.ctr);
1403 r->out.totalentries = 0;
1404 r->out.resume_handle = NULL;
1406 /* TODO: - paging of results
1409 nterr = share_get_context(mem_ctx, &sctx);
1410 if (!NT_STATUS_IS_OK(nterr)) {
1411 return ntstatus_to_werror(nterr);
1414 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
1415 if (!NT_STATUS_IS_OK(nterr)) {
1416 return ntstatus_to_werror(nterr);
1419 switch (r->in.level) {
1424 struct srvsvc_NetShareCtr0 *ctr0;
1426 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
1427 W_ERROR_HAVE_NO_MEMORY(ctr0);
1430 ctr0->count = count;
1433 if (ctr0->count == 0) {
1434 r->out.ctr.ctr0 = ctr0;
1438 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, count);
1439 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
1441 for (i=0; i < count; i++) {
1443 union srvsvc_NetShareInfo info;
1444 enum srvsvc_ShareType type;
1446 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1447 if (!NT_STATUS_IS_OK(nterr)) {
1448 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1449 return WERR_GENERAL_FAILURE;
1452 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1453 if (type & STYPE_HIDDEN) {
1459 info.info0 = &ctr0->array[y];
1460 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1461 W_ERROR_NOT_OK_RETURN(status);
1465 talloc_free(snames);
1467 r->out.ctr.ctr0 = ctr0;
1468 r->out.totalentries = r->out.ctr.ctr0->count;
1475 struct srvsvc_NetShareCtr1 *ctr1;
1477 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
1478 W_ERROR_HAVE_NO_MEMORY(ctr1);
1481 ctr1->count = count;
1484 if (ctr1->count == 0) {
1485 r->out.ctr.ctr1 = ctr1;
1489 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, count);
1490 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
1492 for (i=0; i < count; i++) {
1494 union srvsvc_NetShareInfo info;
1495 enum srvsvc_ShareType type;
1497 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1498 if (!NT_STATUS_IS_OK(nterr)) {
1499 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1500 return WERR_GENERAL_FAILURE;
1503 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1504 if (type & STYPE_HIDDEN) {
1510 info.info1 = &ctr1->array[y];
1511 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1512 W_ERROR_NOT_OK_RETURN(status);
1516 talloc_free(snames);
1518 r->out.ctr.ctr1 = ctr1;
1519 r->out.totalentries = r->out.ctr.ctr1->count;
1526 struct srvsvc_NetShareCtr2 *ctr2;
1528 SRVSVC_CHECK_ADMIN_ACCESS;
1530 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
1531 W_ERROR_HAVE_NO_MEMORY(ctr2);
1534 ctr2->count = count;
1537 if (ctr2->count == 0) {
1538 r->out.ctr.ctr2 = ctr2;
1542 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, count);
1543 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
1545 for (i=0; i < count; i++) {
1547 union srvsvc_NetShareInfo info;
1548 enum srvsvc_ShareType type;
1550 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1551 if (!NT_STATUS_IS_OK(nterr)) {
1552 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1553 return WERR_GENERAL_FAILURE;
1556 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1557 if (type & STYPE_HIDDEN) {
1563 info.info2 = &ctr2->array[y];
1564 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1565 W_ERROR_NOT_OK_RETURN(status);
1569 talloc_free(snames);
1571 r->out.ctr.ctr2 = ctr2;
1572 r->out.totalentries = r->out.ctr.ctr2->count;
1579 struct srvsvc_NetShareCtr502 *ctr502;
1581 SRVSVC_CHECK_ADMIN_ACCESS;
1583 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
1584 W_ERROR_HAVE_NO_MEMORY(ctr502);
1587 ctr502->count = count;
1588 ctr502->array = NULL;
1590 if (ctr502->count == 0) {
1591 r->out.ctr.ctr502 = ctr502;
1595 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, count);
1596 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
1598 for (i=0; i < count; i++) {
1600 union srvsvc_NetShareInfo info;
1601 enum srvsvc_ShareType type;
1603 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1604 if (!NT_STATUS_IS_OK(nterr)) {
1605 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1606 return WERR_GENERAL_FAILURE;
1609 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1610 if (type & STYPE_HIDDEN) {
1616 info.info502 = &ctr502->array[y];
1617 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1618 W_ERROR_NOT_OK_RETURN(status);
1622 talloc_free(snames);
1624 r->out.ctr.ctr502 = ctr502;
1625 r->out.totalentries = r->out.ctr.ctr502->count;
1629 return WERR_UNKNOWN_LEVEL;
1632 return WERR_UNKNOWN_LEVEL;
1637 srvsvc_NetShareDelStart
1639 static WERROR srvsvc_NetShareDelStart(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1640 struct srvsvc_NetShareDelStart *r)
1642 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1647 srvsvc_NetShareDelCommit
1649 static WERROR srvsvc_NetShareDelCommit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1650 struct srvsvc_NetShareDelCommit *r)
1652 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1657 srvsvc_NetGetFileSecurity
1659 static WERROR srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1660 struct srvsvc_NetGetFileSecurity *r)
1662 struct sec_desc_buf *sd_buf;
1663 struct ntvfs_context *ntvfs_ctx = NULL;
1664 struct ntvfs_request *ntvfs_req;
1665 union smb_fileinfo *io;
1668 nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
1669 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
1671 ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
1672 dce_call->conn->auth_state.session_info,
1676 W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
1678 sd_buf = talloc(mem_ctx, struct sec_desc_buf);
1679 W_ERROR_HAVE_NO_MEMORY(sd_buf);
1681 io = talloc(mem_ctx, union smb_fileinfo);
1682 W_ERROR_HAVE_NO_MEMORY(io);
1684 io->query_secdesc.level = RAW_FILEINFO_SEC_DESC;
1685 io->query_secdesc.in.file.path = r->in.file;
1686 io->query_secdesc.in.secinfo_flags = r->in.securityinformation;
1688 nt_status = ntvfs_qpathinfo(ntvfs_req, io);
1689 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
1691 sd_buf->sd = io->query_secdesc.out.sd;
1693 r->out.sd_buf = sd_buf;
1699 srvsvc_NetSetFileSecurity
1701 static WERROR srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1702 struct srvsvc_NetSetFileSecurity *r)
1704 struct ntvfs_context *ntvfs_ctx;
1705 struct ntvfs_request *ntvfs_req;
1706 union smb_setfileinfo *io;
1709 nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
1710 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
1712 ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
1713 dce_call->conn->auth_state.session_info,
1717 W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
1719 io = talloc(mem_ctx, union smb_setfileinfo);
1720 W_ERROR_HAVE_NO_MEMORY(io);
1722 io->set_secdesc.level = RAW_FILEINFO_SEC_DESC;
1723 io->set_secdesc.in.file.path = r->in.file;
1724 io->set_secdesc.in.secinfo_flags = r->in.securityinformation;
1725 io->set_secdesc.in.sd = r->in.sd_buf.sd;
1727 nt_status = ntvfs_setpathinfo(ntvfs_req, io);
1728 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
1735 srvsvc_NetServerTransportAddEx
1737 static WERROR srvsvc_NetServerTransportAddEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1738 struct srvsvc_NetServerTransportAddEx *r)
1740 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1745 srvsvc_NetServerSetServiceBitsEx
1747 static WERROR srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1748 struct srvsvc_NetServerSetServiceBitsEx *r)
1750 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1755 srvsvc_NETRDFSGETVERSION
1757 static WERROR srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1758 struct srvsvc_NETRDFSGETVERSION *r)
1760 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1765 srvsvc_NETRDFSCREATELOCALPARTITION
1767 static WERROR srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1768 struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
1770 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1775 srvsvc_NETRDFSDELETELOCALPARTITION
1777 static WERROR srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1778 struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
1780 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1785 srvsvc_NETRDFSSETLOCALVOLUMESTATE
1787 static WERROR srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1788 struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
1790 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1795 srvsvc_NETRDFSSETSERVERINFO
1797 static WERROR srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1798 struct srvsvc_NETRDFSSETSERVERINFO *r)
1800 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1805 srvsvc_NETRDFSCREATEEXITPOINT
1807 static WERROR srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1808 struct srvsvc_NETRDFSCREATEEXITPOINT *r)
1810 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1815 srvsvc_NETRDFSDELETEEXITPOINT
1817 static WERROR srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1818 struct srvsvc_NETRDFSDELETEEXITPOINT *r)
1820 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1825 srvsvc_NETRDFSMODIFYPREFIX
1827 static WERROR srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1828 struct srvsvc_NETRDFSMODIFYPREFIX *r)
1830 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1835 srvsvc_NETRDFSFIXLOCALVOLUME
1837 static WERROR srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1838 struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
1840 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1845 srvsvc_NETRDFSMANAGERREPORTSITEINFO
1847 static WERROR srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1848 struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
1850 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1855 srvsvc_NETRSERVERTRANSPORTDELEX
1857 static WERROR srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1858 struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
1860 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1866 static WERROR srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1867 struct srvsvc_NetShareDel *r)
1870 struct share_context *sctx;
1872 nterr = share_get_context(mem_ctx, &sctx);
1873 if (!NT_STATUS_IS_OK(nterr)) {
1874 return ntstatus_to_werror(nterr);
1877 nterr = share_remove(sctx, r->in.share_name);
1878 if (!NT_STATUS_IS_OK(nterr)) {
1879 return ntstatus_to_werror(nterr);
1886 srvsvc_NetSetServiceBits
1888 static WERROR srvsvc_NetSetServiceBits(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1889 struct srvsvc_NetSetServiceBits *r)
1891 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1895 srvsvc_NETRPRNAMECANONICALIZE
1897 static WERROR srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1898 struct srvsvc_NETRPRNAMECANONICALIZE *r)
1900 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1903 /* include the generated boilerplate */
1904 #include "librpc/gen_ndr/ndr_srvsvc_s.c"