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.level = r->in.level;
49 r->out.totalentries = 0;
50 r->out.resume_handle = NULL;
52 switch (r->in.level) {
54 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr0);
55 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
57 r->out.ctr.ctr0->count = 0;
58 r->out.ctr.ctr0->array = NULL;
60 return WERR_NOT_SUPPORTED;
63 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr1);
64 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
66 r->out.ctr.ctr1->count = 0;
67 r->out.ctr.ctr1->array = NULL;
69 return WERR_NOT_SUPPORTED;
72 return WERR_UNKNOWN_LEVEL;
80 srvsvc_NetCharDevGetInfo
82 static WERROR dcesrv_srvsvc_NetCharDevGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
83 struct srvsvc_NetCharDevGetInfo *r)
87 switch (r->in.level) {
90 return WERR_NOT_SUPPORTED;
94 return WERR_NOT_SUPPORTED;
97 return WERR_UNKNOWN_LEVEL;
100 return WERR_UNKNOWN_LEVEL;
105 srvsvc_NetCharDevControl
107 static WERROR dcesrv_srvsvc_NetCharDevControl(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
108 struct srvsvc_NetCharDevControl *r)
110 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
115 srvsvc_NetCharDevQEnum
117 static WERROR dcesrv_srvsvc_NetCharDevQEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
118 struct srvsvc_NetCharDevQEnum *r)
120 r->out.level = r->in.level;
121 r->out.totalentries = 0;
122 r->out.resume_handle = NULL;
124 switch (r->in.level) {
127 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr0);
128 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
130 r->out.ctr.ctr0->count = 0;
131 r->out.ctr.ctr0->array = NULL;
133 return WERR_NOT_SUPPORTED;
137 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr1);
138 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
140 r->out.ctr.ctr1->count = 0;
141 r->out.ctr.ctr1->array = NULL;
143 return WERR_NOT_SUPPORTED;
146 return WERR_UNKNOWN_LEVEL;
149 return WERR_UNKNOWN_LEVEL;
154 srvsvc_NetCharDevQGetInfo
156 static WERROR dcesrv_srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
157 struct srvsvc_NetCharDevQGetInfo *r)
161 switch (r->in.level) {
164 return WERR_NOT_SUPPORTED;
168 return WERR_NOT_SUPPORTED;
171 return WERR_UNKNOWN_LEVEL;
174 return WERR_UNKNOWN_LEVEL;
179 srvsvc_NetCharDevQSetInfo
181 static WERROR dcesrv_srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
182 struct srvsvc_NetCharDevQSetInfo *r)
184 switch (r->in.level) {
187 if (r->in.parm_error) {
188 r->out.parm_error = r->in.parm_error;
190 return WERR_NOT_SUPPORTED;
194 if (r->in.parm_error) {
195 r->out.parm_error = r->in.parm_error;
197 return WERR_NOT_SUPPORTED;
200 return WERR_UNKNOWN_LEVEL;
203 return WERR_UNKNOWN_LEVEL;
208 srvsvc_NetCharDevQPurge
210 static WERROR dcesrv_srvsvc_NetCharDevQPurge(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
211 struct srvsvc_NetCharDevQPurge *r)
213 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
218 srvsvc_NetCharDevQPurgeSelf
220 static WERROR dcesrv_srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
221 struct srvsvc_NetCharDevQPurgeSelf *r)
223 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
230 static WERROR dcesrv_srvsvc_NetConnEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
231 struct srvsvc_NetConnEnum *r)
233 r->out.level = r->in.level;
234 r->out.totalentries = 0;
235 r->out.resume_handle = NULL;
237 switch (r->in.level) {
240 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetConnCtr0);
241 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
243 r->out.ctr.ctr0->count = 0;
244 r->out.ctr.ctr0->array = NULL;
246 return WERR_NOT_SUPPORTED;
250 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetConnCtr1);
251 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
253 r->out.ctr.ctr1->count = 0;
254 r->out.ctr.ctr1->array = NULL;
256 return WERR_NOT_SUPPORTED;
259 return WERR_UNKNOWN_LEVEL;
262 return WERR_UNKNOWN_LEVEL;
269 static WERROR dcesrv_srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
270 struct srvsvc_NetFileEnum *r)
272 r->out.level = r->in.level;
273 r->out.totalentries = 0;
274 r->out.resume_handle = NULL;
276 switch (r->in.level) {
279 r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetFileCtr2);
280 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
282 r->out.ctr.ctr2->count = 0;
283 r->out.ctr.ctr2->array = NULL;
285 return WERR_NOT_SUPPORTED;
289 r->out.ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetFileCtr3);
290 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr3);
292 r->out.ctr.ctr3->count = 0;
293 r->out.ctr.ctr3->array = NULL;
295 return WERR_NOT_SUPPORTED;
298 return WERR_UNKNOWN_LEVEL;
301 return WERR_UNKNOWN_LEVEL;
306 srvsvc_NetFileGetInfo
308 static WERROR dcesrv_srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
309 struct srvsvc_NetFileGetInfo *r)
313 switch (r->in.level) {
316 return WERR_NOT_SUPPORTED;
320 return WERR_NOT_SUPPORTED;
323 return WERR_UNKNOWN_LEVEL;
326 return WERR_UNKNOWN_LEVEL;
333 static WERROR dcesrv_srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
334 struct srvsvc_NetFileClose *r)
336 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
343 static WERROR dcesrv_srvsvc_NetSessEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
344 struct srvsvc_NetSessEnum *r)
346 r->out.level = r->in.level;
347 r->out.totalentries = 0;
348 r->out.resume_handle = NULL;
350 switch (r->in.level) {
353 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetSessCtr0);
354 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
356 r->out.ctr.ctr0->count = 0;
357 r->out.ctr.ctr0->array = NULL;
359 return WERR_NOT_SUPPORTED;
363 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetSessCtr1);
364 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
366 r->out.ctr.ctr1->count = 0;
367 r->out.ctr.ctr1->array = NULL;
369 return WERR_NOT_SUPPORTED;
373 r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetSessCtr2);
374 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
376 r->out.ctr.ctr2->count = 0;
377 r->out.ctr.ctr2->array = NULL;
379 return WERR_NOT_SUPPORTED;
383 r->out.ctr.ctr10 = talloc(mem_ctx, struct srvsvc_NetSessCtr10);
384 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr10);
386 r->out.ctr.ctr2->count = 0;
387 r->out.ctr.ctr2->array = NULL;
389 return WERR_NOT_SUPPORTED;
393 r->out.ctr.ctr502 = talloc(mem_ctx, struct srvsvc_NetSessCtr502);
394 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr502);
396 r->out.ctr.ctr2->count = 0;
397 r->out.ctr.ctr2->array = NULL;
399 return WERR_NOT_SUPPORTED;
402 return WERR_UNKNOWN_LEVEL;
405 return WERR_UNKNOWN_LEVEL;
412 static WERROR dcesrv_srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
413 struct srvsvc_NetSessDel *r)
415 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
422 static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
423 struct srvsvc_NetShareAdd *r)
425 switch (r->in.level) {
428 if (r->in.parm_error) {
429 r->out.parm_error = r->in.parm_error;
431 return WERR_NOT_SUPPORTED;
435 if (r->in.parm_error) {
436 r->out.parm_error = r->in.parm_error;
438 return WERR_NOT_SUPPORTED;
443 struct share_info *info;
444 struct share_context *sctx;
448 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->conn->dce_ctx->lp_ctx, &sctx);
449 if (!NT_STATUS_IS_OK(nterr)) {
450 return ntstatus_to_werror(nterr);
453 /* there are no more than 8 options in struct srvsvc_NetShareInfo2 */
454 info = talloc_array(mem_ctx, struct share_info, count);
455 W_ERROR_HAVE_NO_MEMORY(info);
459 info[i].name = SHARE_TYPE;
460 info[i].type = SHARE_INFO_STRING;
461 switch (r->in.info.info2->type) {
463 info[i].value = talloc_strdup(info, "DISK");
466 info[i].value = talloc_strdup(info, "PRINTER");
469 info[i].value = talloc_strdup(info, "IPC");
472 return WERR_INVALID_PARAM;
474 W_ERROR_HAVE_NO_MEMORY(info[i].value);
477 if (r->in.info.info2->path && r->in.info.info2->path[0]) {
478 info[i].name = SHARE_PATH;
479 info[i].type = SHARE_INFO_STRING;
481 /* Windows will send a path in a form of C:\example\path */
482 if (r->in.info.info2->path[1] == ':') {
483 info[i].value = talloc_strdup(info, &r->in.info.info2->path[2]);
485 /* very strange let's try to set as is */
486 info[i].value = talloc_strdup(info, r->in.info.info2->path);
488 W_ERROR_HAVE_NO_MEMORY(info[i].value);
489 all_string_sub((char *)info[i].value, "\\", "/", 0);
494 if (r->in.info.info2->comment && r->in.info.info2->comment[0]) {
495 info[i].name = SHARE_COMMENT;
496 info[i].type = SHARE_INFO_STRING;
497 info[i].value = talloc_strdup(info, r->in.info.info2->comment);
498 W_ERROR_HAVE_NO_MEMORY(info[i].value);
503 if (r->in.info.info2->password && r->in.info.info2->password[0]) {
504 info[i].name = SHARE_PASSWORD;
505 info[i].type = SHARE_INFO_STRING;
506 info[i].value = talloc_strdup(info, r->in.info.info502->password);
507 W_ERROR_HAVE_NO_MEMORY(info[i].value);
512 info[i].name = SHARE_MAX_CONNECTIONS;
513 info[i].type = SHARE_INFO_INT;
514 info[i].value = talloc(info, int);
515 *((int *)info[i].value) = r->in.info.info2->max_users;
518 /* TODO: security descriptor */
520 nterr = share_create(sctx, r->in.info.info2->name, info, i);
521 if (!NT_STATUS_IS_OK(nterr)) {
522 return ntstatus_to_werror(nterr);
525 if (r->in.parm_error) {
526 r->out.parm_error = r->in.parm_error;
533 if (r->in.parm_error) {
534 r->out.parm_error = r->in.parm_error;
536 return WERR_NOT_SUPPORTED;
541 struct share_info *info;
542 struct share_context *sctx;
546 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->conn->dce_ctx->lp_ctx, &sctx);
547 if (!NT_STATUS_IS_OK(nterr)) {
548 return ntstatus_to_werror(nterr);
551 /* there are no more than 10 options in struct srvsvc_NetShareInfo502 */
552 info = talloc_array(mem_ctx, struct share_info, count);
553 W_ERROR_HAVE_NO_MEMORY(info);
557 info[i].name = SHARE_TYPE;
558 info[i].type = SHARE_INFO_STRING;
559 switch (r->in.info.info502->type) {
561 info[i].value = talloc_strdup(info, "DISK");
564 info[i].value = talloc_strdup(info, "PRINTER");
567 info[i].value = talloc_strdup(info, "IPC");
570 return WERR_INVALID_PARAM;
572 W_ERROR_HAVE_NO_MEMORY(info[i].value);
575 if (r->in.info.info502->path && r->in.info.info502->path[0]) {
576 info[i].name = SHARE_PATH;
577 info[i].type = SHARE_INFO_STRING;
579 /* Windows will send a path in a form of C:\example\path */
580 if (r->in.info.info2->path[1] == ':') {
581 info[i].value = talloc_strdup(info, &r->in.info.info502->path[2]);
583 /* very strange let's try to set as is */
584 info[i].value = talloc_strdup(info, r->in.info.info502->path);
586 W_ERROR_HAVE_NO_MEMORY(info[i].value);
587 all_string_sub((char *)info[i].value, "\\", "/", 0);
592 if (r->in.info.info502->comment && r->in.info.info502->comment[0]) {
593 info[i].name = SHARE_COMMENT;
594 info[i].type = SHARE_INFO_STRING;
595 info[i].value = talloc_strdup(info, r->in.info.info502->comment);
596 W_ERROR_HAVE_NO_MEMORY(info[i].value);
601 if (r->in.info.info502->password && r->in.info.info502->password[0]) {
602 info[i].name = SHARE_PASSWORD;
603 info[i].type = SHARE_INFO_STRING;
604 info[i].value = talloc_strdup(info, r->in.info.info502->password);
605 W_ERROR_HAVE_NO_MEMORY(info[i].value);
610 info[i].name = SHARE_MAX_CONNECTIONS;
611 info[i].type = SHARE_INFO_INT;
612 info[i].value = talloc(info, int);
613 *((int *)info[i].value) = r->in.info.info502->max_users;
616 /* TODO: security descriptor */
618 nterr = share_create(sctx, r->in.info.info502->name, info, i);
619 if (!NT_STATUS_IS_OK(nterr)) {
620 return ntstatus_to_werror(nterr);
623 if (r->in.parm_error) {
624 r->out.parm_error = r->in.parm_error;
630 return WERR_UNKNOWN_LEVEL;
633 return WERR_UNKNOWN_LEVEL;
636 static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
637 struct share_config *scfg, uint32_t level,
638 union srvsvc_NetShareInfo *info)
640 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
645 info->info0->name = talloc_strdup(mem_ctx, scfg->name);
646 W_ERROR_HAVE_NO_MEMORY(info->info0->name);
652 info->info1->name = talloc_strdup(mem_ctx, scfg->name);
653 W_ERROR_HAVE_NO_MEMORY(info->info1->name);
654 info->info1->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
655 info->info1->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
656 W_ERROR_HAVE_NO_MEMORY(info->info1->comment);
662 info->info2->name = talloc_strdup(mem_ctx, scfg->name);
663 W_ERROR_HAVE_NO_MEMORY(info->info2->name);
664 info->info2->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
665 info->info2->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
666 W_ERROR_HAVE_NO_MEMORY(info->info2->comment);
667 info->info2->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
668 info->info2->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
669 info->info2->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
670 info->info2->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
671 W_ERROR_HAVE_NO_MEMORY(info->info2->path);
672 info->info2->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
678 info->info501->name = talloc_strdup(mem_ctx, scfg->name);
679 W_ERROR_HAVE_NO_MEMORY(info->info501->name);
680 info->info501->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
681 info->info501->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
682 W_ERROR_HAVE_NO_MEMORY(info->info501->comment);
683 info->info501->csc_policy = share_int_option(scfg, SHARE_CSC_POLICY, SHARE_CSC_POLICY_DEFAULT);
689 info->info502->name = talloc_strdup(mem_ctx, scfg->name);
690 W_ERROR_HAVE_NO_MEMORY(info->info502->name);
691 info->info502->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
692 info->info502->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
693 W_ERROR_HAVE_NO_MEMORY(info->info502->comment);
694 info->info502->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
695 info->info502->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
696 info->info502->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
697 info->info502->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
698 W_ERROR_HAVE_NO_MEMORY(info->info502->path);
699 info->info502->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
700 info->info502->unknown = dcesrv_common_get_share_unknown(mem_ctx, dce_ctx, scfg);
701 info->info502->sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, scfg);
707 info->info1005->dfs_flags = dcesrv_common_get_share_dfs_flags(mem_ctx, dce_ctx, scfg);
712 return WERR_UNKNOWN_LEVEL;
715 return WERR_UNKNOWN_LEVEL;
719 srvsvc_NetShareEnumAll
721 static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
722 struct srvsvc_NetShareEnumAll *r)
727 struct share_context *sctx;
728 struct share_config *scfg;
730 r->out.level = r->in.level;
731 ZERO_STRUCT(r->out.ctr);
732 r->out.totalentries = 0;
733 r->out.resume_handle = NULL;
735 /* TODO: - paging of results
738 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->conn->dce_ctx->lp_ctx, &sctx);
739 if (!NT_STATUS_IS_OK(nterr)) {
740 return ntstatus_to_werror(nterr);
743 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
744 if (!NT_STATUS_IS_OK(nterr)) {
745 return ntstatus_to_werror(nterr);
748 switch (r->in.level) {
752 struct srvsvc_NetShareCtr0 *ctr0;
754 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
755 W_ERROR_HAVE_NO_MEMORY(ctr0);
757 ctr0->count = numshares;
760 if (ctr0->count == 0) {
761 r->out.ctr.ctr0 = ctr0;
765 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, ctr0->count);
766 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
768 for (i = 0; i < ctr0->count; i++) {
770 union srvsvc_NetShareInfo info;
772 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
773 if (!NT_STATUS_IS_OK(nterr)) {
774 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
775 return WERR_GENERAL_FAILURE;
777 info.info0 = &ctr0->array[i];
778 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
779 if (!W_ERROR_IS_OK(status)) {
786 r->out.ctr.ctr0 = ctr0;
787 r->out.totalentries = r->out.ctr.ctr0->count;
793 struct srvsvc_NetShareCtr1 *ctr1;
795 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
796 W_ERROR_HAVE_NO_MEMORY(ctr1);
798 ctr1->count = numshares;
801 if (ctr1->count == 0) {
802 r->out.ctr.ctr1 = ctr1;
806 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, ctr1->count);
807 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
809 for (i=0; i < ctr1->count; i++) {
811 union srvsvc_NetShareInfo info;
813 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
814 if (!NT_STATUS_IS_OK(nterr)) {
815 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
816 return WERR_GENERAL_FAILURE;
818 info.info1 = &ctr1->array[i];
819 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
820 if (!W_ERROR_IS_OK(status)) {
827 r->out.ctr.ctr1 = ctr1;
828 r->out.totalentries = r->out.ctr.ctr1->count;
834 struct srvsvc_NetShareCtr2 *ctr2;
836 SRVSVC_CHECK_ADMIN_ACCESS;
838 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
839 W_ERROR_HAVE_NO_MEMORY(ctr2);
841 ctr2->count = numshares;
844 if (ctr2->count == 0) {
845 r->out.ctr.ctr2 = ctr2;
849 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, ctr2->count);
850 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
852 for (i=0; i < ctr2->count; i++) {
854 union srvsvc_NetShareInfo info;
856 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
857 if (!NT_STATUS_IS_OK(nterr)) {
858 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
859 return WERR_GENERAL_FAILURE;
861 info.info2 = &ctr2->array[i];
862 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
863 if (!W_ERROR_IS_OK(status)) {
870 r->out.ctr.ctr2 = ctr2;
871 r->out.totalentries = r->out.ctr.ctr2->count;
877 struct srvsvc_NetShareCtr501 *ctr501;
879 SRVSVC_CHECK_ADMIN_ACCESS;
881 ctr501 = talloc(mem_ctx, struct srvsvc_NetShareCtr501);
882 W_ERROR_HAVE_NO_MEMORY(ctr501);
884 ctr501->count = numshares;
885 ctr501->array = NULL;
887 if (ctr501->count == 0) {
888 r->out.ctr.ctr501 = ctr501;
892 ctr501->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo501, ctr501->count);
893 W_ERROR_HAVE_NO_MEMORY(ctr501->array);
895 for (i=0; i < ctr501->count; i++) {
897 union srvsvc_NetShareInfo info;
899 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
900 if (!NT_STATUS_IS_OK(nterr)) {
901 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
902 return WERR_GENERAL_FAILURE;
904 info.info501 = &ctr501->array[i];
905 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
906 if (!W_ERROR_IS_OK(status)) {
913 r->out.ctr.ctr501 = ctr501;
914 r->out.totalentries = r->out.ctr.ctr501->count;
920 struct srvsvc_NetShareCtr502 *ctr502;
922 SRVSVC_CHECK_ADMIN_ACCESS;
924 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
925 W_ERROR_HAVE_NO_MEMORY(ctr502);
927 ctr502->count = numshares;
928 ctr502->array = NULL;
930 if (ctr502->count == 0) {
931 r->out.ctr.ctr502 = ctr502;
935 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, ctr502->count);
936 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
938 for (i=0; i < ctr502->count; i++) {
940 union srvsvc_NetShareInfo info;
942 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
943 if (!NT_STATUS_IS_OK(nterr)) {
944 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
945 return WERR_GENERAL_FAILURE;
947 info.info502 = &ctr502->array[i];
948 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
949 if (!W_ERROR_IS_OK(status)) {
956 r->out.ctr.ctr502 = ctr502;
957 r->out.totalentries = r->out.ctr.ctr502->count;
961 return WERR_UNKNOWN_LEVEL;
964 return WERR_UNKNOWN_LEVEL;
969 srvsvc_NetShareGetInfo
971 static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
972 struct srvsvc_NetShareGetInfo *r)
975 struct share_context *sctx = NULL;
976 struct share_config *scfg = NULL;
980 /* TODO: - access check
983 if (strcmp("", r->in.share_name) == 0) {
984 return WERR_INVALID_PARAM;
987 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->conn->dce_ctx->lp_ctx, &sctx);
988 if (!NT_STATUS_IS_OK(nterr)) {
989 return ntstatus_to_werror(nterr);
992 nterr = share_get_config(mem_ctx, sctx, r->in.share_name, &scfg);
993 if (!NT_STATUS_IS_OK(nterr)) {
994 return ntstatus_to_werror(nterr);
997 switch (r->in.level) {
1001 union srvsvc_NetShareInfo info;
1003 info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0);
1004 W_ERROR_HAVE_NO_MEMORY(info.info0);
1006 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1007 if (!W_ERROR_IS_OK(status)) {
1011 r->out.info.info0 = info.info0;
1017 union srvsvc_NetShareInfo info;
1019 info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1);
1020 W_ERROR_HAVE_NO_MEMORY(info.info1);
1022 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1023 if (!W_ERROR_IS_OK(status)) {
1027 r->out.info.info1 = info.info1;
1033 union srvsvc_NetShareInfo info;
1035 SRVSVC_CHECK_ADMIN_ACCESS;
1037 info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
1038 W_ERROR_HAVE_NO_MEMORY(info.info2);
1040 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1041 if (!W_ERROR_IS_OK(status)) {
1045 r->out.info.info2 = info.info2;
1051 union srvsvc_NetShareInfo info;
1053 info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501);
1054 W_ERROR_HAVE_NO_MEMORY(info.info501);
1056 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1057 if (!W_ERROR_IS_OK(status)) {
1061 r->out.info.info501 = info.info501;
1067 union srvsvc_NetShareInfo info;
1069 SRVSVC_CHECK_ADMIN_ACCESS;
1071 info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502);
1072 W_ERROR_HAVE_NO_MEMORY(info.info502);
1074 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1075 if (!W_ERROR_IS_OK(status)) {
1079 r->out.info.info502 = info.info502;
1085 union srvsvc_NetShareInfo info;
1087 info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005);
1088 W_ERROR_HAVE_NO_MEMORY(info.info1005);
1090 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1091 if (!W_ERROR_IS_OK(status)) {
1095 r->out.info.info1005 = info.info1005;
1099 return WERR_UNKNOWN_LEVEL;
1102 return WERR_UNKNOWN_LEVEL;
1105 static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count,
1106 const char *share_name, int level,
1109 const char *comment,
1110 const char *password,
1111 enum srvsvc_ShareType type,
1113 uint32_t csc_policy,
1114 struct security_descriptor *sd)
1119 info[i].name = SHARE_CSC_POLICY;
1120 info[i].type = SHARE_INFO_INT;
1121 info[i].value = talloc(info, int);
1122 *((int *)info[i].value) = csc_policy;
1129 /* TODO: check if unknown is csc_policy */
1131 /* TODO: security descriptor */
1134 if (path && path[0]) {
1135 info[i].name = SHARE_PATH;
1136 info[i].type = SHARE_INFO_STRING;
1138 /* Windows will send a path in a form of C:\example\path */
1139 if (path[1] == ':') {
1140 info[i].value = talloc_strdup(info, &path[2]);
1142 /* very strange let's try to set as is */
1143 info[i].value = talloc_strdup(info, path);
1145 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1146 all_string_sub((char *)info[i].value, "\\", "/", 0);
1151 if (password && password[0]) {
1152 info[i].name = SHARE_PASSWORD;
1153 info[i].type = SHARE_INFO_STRING;
1154 info[i].value = talloc_strdup(info, password);
1155 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1160 info[i].name = SHARE_MAX_CONNECTIONS;
1161 info[i].type = SHARE_INFO_INT;
1162 info[i].value = talloc(info, int);
1163 *((int *)info[i].value) = max_users;
1168 info[i].name = SHARE_TYPE;
1169 info[i].type = SHARE_INFO_STRING;
1172 info[i].value = talloc_strdup(info, "DISK");
1175 info[i].value = talloc_strdup(info, "PRINTER");
1178 info[i].value = talloc_strdup(info, "IPC");
1181 return WERR_INVALID_PARAM;
1183 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1188 info[i].name = SHARE_COMMENT;
1189 info[i].type = SHARE_INFO_STRING;
1190 info[i].value = talloc_strdup(info, comment);
1191 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1197 strcasecmp(share_name, name) != 0) {
1198 info[i].name = SHARE_NAME;
1199 info[i].type = SHARE_INFO_STRING;
1200 info[i].value = talloc_strdup(info, name);
1201 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1208 return WERR_UNKNOWN_LEVEL;
1217 srvsvc_NetShareSetInfo
1219 static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1220 struct srvsvc_NetShareSetInfo *r)
1224 struct share_context *sctx = NULL;
1225 struct share_info *info;
1228 /* TODO: - access check
1231 /* there are no more than 10 options in all struct srvsvc_NetShareInfoXXX */
1232 info = talloc_array(mem_ctx, struct share_info, 10);
1233 W_ERROR_HAVE_NO_MEMORY(info);
1235 ZERO_STRUCT(r->out);
1237 if (strcmp("", r->in.share_name) == 0) {
1238 return WERR_INVALID_PARAM;
1241 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->conn->dce_ctx->lp_ctx, &sctx);
1242 if (!NT_STATUS_IS_OK(nterr)) {
1243 return ntstatus_to_werror(nterr);
1246 switch (r->in.level) {
1249 status = dcesrv_srvsvc_fill_share_info(info, &count,
1250 r->in.share_name, r->in.level,
1251 r->in.info.info0->name,
1259 if (W_ERROR_EQUAL(status, WERR_OK)) {
1266 status = dcesrv_srvsvc_fill_share_info(info, &count,
1267 r->in.share_name, r->in.level,
1268 r->in.info.info1->name,
1270 r->in.info.info1->comment,
1272 r->in.info.info1->type,
1276 if (W_ERROR_EQUAL(status, WERR_OK)) {
1283 status = dcesrv_srvsvc_fill_share_info(info, &count,
1284 r->in.share_name, r->in.level,
1285 r->in.info.info2->name,
1286 r->in.info.info2->path,
1287 r->in.info.info2->comment,
1288 r->in.info.info2->password,
1289 r->in.info.info2->type,
1290 r->in.info.info2->max_users,
1293 if (W_ERROR_EQUAL(status, WERR_OK)) {
1300 status = dcesrv_srvsvc_fill_share_info(info, &count,
1301 r->in.share_name, r->in.level,
1302 r->in.info.info501->name,
1304 r->in.info.info501->comment,
1306 r->in.info.info501->type,
1308 r->in.info.info501->csc_policy,
1310 if (W_ERROR_EQUAL(status, WERR_OK)) {
1317 status = dcesrv_srvsvc_fill_share_info(info, &count,
1318 r->in.share_name, r->in.level,
1319 r->in.info.info502->name,
1320 r->in.info.info502->path,
1321 r->in.info.info502->comment,
1322 r->in.info.info502->password,
1323 r->in.info.info502->type,
1324 r->in.info.info502->max_users,
1326 r->in.info.info502->sd);
1327 if (W_ERROR_EQUAL(status, WERR_OK)) {
1334 status = dcesrv_srvsvc_fill_share_info(info, &count,
1335 r->in.share_name, r->in.level,
1338 r->in.info.info1004->comment,
1344 if (W_ERROR_EQUAL(status, WERR_OK)) {
1351 /* r->in.info.dfs_flags; */
1353 if (r->in.parm_error) {
1354 r->out.parm_error = r->in.parm_error;
1360 return WERR_UNKNOWN_LEVEL;
1363 nterr = share_set(sctx, r->in.share_name, info, count);
1364 if (!NT_STATUS_IS_OK(nterr)) {
1365 return ntstatus_to_werror(nterr);
1368 if (r->in.parm_error) {
1369 r->out.parm_error = r->in.parm_error;
1377 srvsvc_NetShareDelSticky
1379 static WERROR dcesrv_srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1380 struct srvsvc_NetShareDelSticky *r)
1382 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1387 srvsvc_NetShareCheck
1389 static WERROR dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1390 struct srvsvc_NetShareCheck *r)
1393 struct share_context *sctx = NULL;
1394 struct share_config *scfg = NULL;
1399 ZERO_STRUCT(r->out);
1401 /* TODO: - access check
1404 if (strcmp("", r->in.device_name) == 0) {
1405 r->out.type = STYPE_IPC;
1409 /* copy the path skipping C:\ */
1410 if (strncasecmp(r->in.device_name, "C:", 2) == 0) {
1411 device = talloc_strdup(mem_ctx, &r->in.device_name[2]);
1413 /* no chance we have a share that doesn't start with C:\ */
1414 return WERR_DEVICE_NOT_SHARED;
1416 all_string_sub(device, "\\", "/", 0);
1418 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->conn->dce_ctx->lp_ctx, &sctx);
1419 if (!NT_STATUS_IS_OK(nterr)) {
1420 return ntstatus_to_werror(nterr);
1423 nterr = share_list_all(mem_ctx, sctx, &count, &names);
1424 if (!NT_STATUS_IS_OK(nterr)) {
1425 return ntstatus_to_werror(nterr);
1428 for (i = 0; i < count; i++) {
1432 nterr = share_get_config(mem_ctx, sctx, names[i], &scfg);
1433 if (!NT_STATUS_IS_OK(nterr)) {
1434 return ntstatus_to_werror(nterr);
1436 path = share_string_option(scfg, SHARE_PATH, NULL);
1437 if (!path) continue;
1439 if (strcmp(device, path) == 0) {
1440 type = share_string_option(scfg, SHARE_TYPE, NULL);
1441 if (!type) continue;
1443 if (strcmp(type, "DISK") == 0) {
1444 r->out.type = STYPE_DISKTREE;
1448 if (strcmp(type, "IPC") == 0) {
1449 r->out.type = STYPE_IPC;
1453 if (strcmp(type, "PRINTER") == 0) {
1454 r->out.type = STYPE_PRINTQ;
1460 return WERR_DEVICE_NOT_SHARED;
1465 srvsvc_NetSrvGetInfo
1467 static WERROR dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1468 struct srvsvc_NetSrvGetInfo *r)
1470 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1472 ZERO_STRUCT(r->out);
1474 switch (r->in.level) {
1477 struct srvsvc_NetSrvInfo100 *info100;
1479 info100 = talloc(mem_ctx, struct srvsvc_NetSrvInfo100);
1480 W_ERROR_HAVE_NO_MEMORY(info100);
1482 info100->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1483 info100->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1484 W_ERROR_HAVE_NO_MEMORY(info100->server_name);
1486 r->out.info.info100 = info100;
1491 struct srvsvc_NetSrvInfo101 *info101;
1493 info101 = talloc(mem_ctx, struct srvsvc_NetSrvInfo101);
1494 W_ERROR_HAVE_NO_MEMORY(info101);
1496 info101->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1497 info101->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1498 W_ERROR_HAVE_NO_MEMORY(info101->server_name);
1500 info101->version_major = dcesrv_common_get_version_major(mem_ctx, dce_ctx->lp_ctx);
1501 info101->version_minor = dcesrv_common_get_version_minor(mem_ctx, dce_ctx->lp_ctx);
1502 info101->server_type = dcesrv_common_get_server_type(mem_ctx, dce_ctx);
1503 info101->comment = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
1504 W_ERROR_HAVE_NO_MEMORY(info101->comment);
1506 r->out.info.info101 = info101;
1511 struct srvsvc_NetSrvInfo102 *info102;
1513 info102 = talloc(mem_ctx, struct srvsvc_NetSrvInfo102);
1514 W_ERROR_HAVE_NO_MEMORY(info102);
1516 info102->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1517 info102->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1518 W_ERROR_HAVE_NO_MEMORY(info102->server_name);
1520 info102->version_major = dcesrv_common_get_version_major(mem_ctx, dce_ctx->lp_ctx);
1521 info102->version_minor = dcesrv_common_get_version_minor(mem_ctx, dce_ctx->lp_ctx);
1522 info102->server_type = dcesrv_common_get_server_type(mem_ctx, dce_ctx);
1523 info102->comment = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
1524 W_ERROR_HAVE_NO_MEMORY(info102->comment);
1526 info102->users = dcesrv_common_get_users(mem_ctx, dce_ctx);
1527 info102->disc = dcesrv_common_get_disc(mem_ctx, dce_ctx);
1528 info102->hidden = dcesrv_common_get_hidden(mem_ctx, dce_ctx);
1529 info102->announce = dcesrv_common_get_announce(mem_ctx, dce_ctx);
1530 info102->anndelta = dcesrv_common_get_anndelta(mem_ctx, dce_ctx);
1531 info102->licenses = dcesrv_common_get_licenses(mem_ctx, dce_ctx);
1532 info102->userpath = dcesrv_common_get_userpath(mem_ctx, dce_ctx);
1533 W_ERROR_HAVE_NO_MEMORY(info102->userpath);
1535 r->out.info.info102 = info102;
1539 return WERR_UNKNOWN_LEVEL;
1542 return WERR_UNKNOWN_LEVEL;
1547 srvsvc_NetSrvSetInfo
1549 static WERROR dcesrv_srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1550 struct srvsvc_NetSrvSetInfo *r)
1552 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1559 static WERROR dcesrv_srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1560 struct srvsvc_NetDiskEnum *r)
1562 r->out.info.disks = NULL;
1563 r->out.info.count = 0;
1564 r->out.totalentries = 0;
1565 r->out.resume_handle = NULL;
1567 switch (r->in.level) {
1570 /* we can safely hardcode the reply and report we have only one disk (C:) */
1571 /* for some reason Windows wants 2 entries with the second being empty */
1572 r->out.info.disks = talloc_array(mem_ctx, struct srvsvc_NetDiskInfo0, 2);
1573 W_ERROR_HAVE_NO_MEMORY(r->out.info.disks);
1574 r->out.info.count = 2;
1576 r->out.info.disks[0].disk = talloc_strdup(mem_ctx, "C:");
1577 W_ERROR_HAVE_NO_MEMORY(r->out.info.disks[0].disk);
1579 r->out.info.disks[1].disk = talloc_strdup(mem_ctx, "");
1580 W_ERROR_HAVE_NO_MEMORY(r->out.info.disks[1].disk);
1582 r->out.totalentries = 1;
1583 r->out.resume_handle = r->in.resume_handle;
1588 return WERR_UNKNOWN_LEVEL;
1591 return WERR_UNKNOWN_LEVEL;
1596 srvsvc_NetServerStatisticsGet
1598 static WERROR dcesrv_srvsvc_NetServerStatisticsGet(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1599 struct srvsvc_NetServerStatisticsGet *r)
1601 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1606 srvsvc_NetTransportAdd
1608 static WERROR dcesrv_srvsvc_NetTransportAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1609 struct srvsvc_NetTransportAdd *r)
1611 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1616 srvsvc_NetTransportEnum
1618 static WERROR dcesrv_srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1619 struct srvsvc_NetTransportEnum *r)
1621 r->out.level = r->in.level;
1622 r->out.totalentries = 0;
1623 r->out.resume_handle = NULL;
1625 switch (r->in.level) {
1628 r->out.transports.ctr0 = talloc(mem_ctx, struct srvsvc_NetTransportCtr0);
1629 W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr0);
1631 r->out.transports.ctr0->count = 0;
1632 r->out.transports.ctr0->array = NULL;
1634 return WERR_NOT_SUPPORTED;
1638 r->out.transports.ctr1 = talloc(mem_ctx, struct srvsvc_NetTransportCtr1);
1639 W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr1);
1641 r->out.transports.ctr1->count = 0;
1642 r->out.transports.ctr1->array = NULL;
1644 return WERR_NOT_SUPPORTED;
1648 r->out.transports.ctr2 = talloc(mem_ctx, struct srvsvc_NetTransportCtr2);
1649 W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr2);
1651 r->out.transports.ctr2->count = 0;
1652 r->out.transports.ctr2->array = NULL;
1654 return WERR_NOT_SUPPORTED;
1658 r->out.transports.ctr3 = talloc(mem_ctx, struct srvsvc_NetTransportCtr3);
1659 W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr3);
1661 r->out.transports.ctr3->count = 0;
1662 r->out.transports.ctr3->array = NULL;
1664 return WERR_NOT_SUPPORTED;
1667 return WERR_UNKNOWN_LEVEL;
1670 return WERR_UNKNOWN_LEVEL;
1674 srvsvc_NetTransportDel
1676 static WERROR dcesrv_srvsvc_NetTransportDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1677 struct srvsvc_NetTransportDel *r)
1679 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1686 static WERROR dcesrv_srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1687 struct srvsvc_NetRemoteTOD *r)
1689 struct timeval tval;
1693 r->out.info = talloc(mem_ctx, struct srvsvc_NetRemoteTODInfo);
1694 W_ERROR_HAVE_NO_MEMORY(r->out.info);
1696 GetTimeOfDay(&tval);
1701 r->out.info->elapsed = t;
1702 /* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
1703 r->out.info->msecs = (tm.tm_hour*60*60*1000)
1704 + (tm.tm_min*60*1000)
1706 + (tval.tv_usec/1000);
1707 r->out.info->hours = tm.tm_hour;
1708 r->out.info->mins = tm.tm_min;
1709 r->out.info->secs = tm.tm_sec;
1710 r->out.info->hunds = tval.tv_usec/10000;
1711 r->out.info->timezone = get_time_zone(t)/60;
1712 r->out.info->tinterval = 310; /* just return the same as windows */
1713 r->out.info->day = tm.tm_mday;
1714 r->out.info->month = tm.tm_mon + 1;
1715 r->out.info->year = tm.tm_year + 1900;
1716 r->out.info->weekday = tm.tm_wday;
1724 static WERROR dcesrv_srvsvc_NetPathType(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1725 struct srvsvc_NetPathType *r)
1727 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1732 srvsvc_NetPathCanonicalize
1734 static WERROR dcesrv_srvsvc_NetPathCanonicalize(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1735 struct srvsvc_NetPathCanonicalize *r)
1737 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1742 srvsvc_NetPathCompare
1744 static WERROR dcesrv_srvsvc_NetPathCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1745 struct srvsvc_NetPathCompare *r)
1747 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1752 srvsvc_NetNameValidate
1754 static WERROR dcesrv_srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1755 struct srvsvc_NetNameValidate *r)
1759 if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) {
1760 return WERR_INVALID_NAME;
1763 switch (r->in.name_type) {
1772 return WERR_NOT_SUPPORTED;
1774 case 9: /* validate share name */
1776 len = strlen_m(r->in.name);
1777 if ((r->in.flags == 0x0) && (len > 81)) {
1778 return WERR_INVALID_NAME;
1780 if ((r->in.flags == 0x80000000) && (len > 13)) {
1781 return WERR_INVALID_NAME;
1783 if (! dcesrv_common_validate_share_name(mem_ctx, r->in.name)) {
1784 return WERR_INVALID_NAME;
1792 return WERR_NOT_SUPPORTED;
1794 return WERR_INVALID_PARAM;
1797 return WERR_INVALID_PARAM;
1802 srvsvc_NetPRNameCompare
1804 static WERROR dcesrv_srvsvc_NetPRNameCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1805 struct srvsvc_NetPRNameCompare *r)
1807 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1814 static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1815 struct srvsvc_NetShareEnum *r)
1819 const char **snames;
1820 struct share_context *sctx;
1821 struct share_config *scfg;
1822 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1824 r->out.level = r->in.level;
1825 ZERO_STRUCT(r->out.ctr);
1826 r->out.totalentries = 0;
1827 r->out.resume_handle = NULL;
1829 /* TODO: - paging of results
1832 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->conn->dce_ctx->lp_ctx, &sctx);
1833 if (!NT_STATUS_IS_OK(nterr)) {
1834 return ntstatus_to_werror(nterr);
1837 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
1838 if (!NT_STATUS_IS_OK(nterr)) {
1839 return ntstatus_to_werror(nterr);
1842 switch (r->in.level) {
1847 struct srvsvc_NetShareCtr0 *ctr0;
1849 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
1850 W_ERROR_HAVE_NO_MEMORY(ctr0);
1853 ctr0->count = count;
1856 if (ctr0->count == 0) {
1857 r->out.ctr.ctr0 = ctr0;
1861 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, count);
1862 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
1864 for (i=0; i < count; i++) {
1866 union srvsvc_NetShareInfo info;
1867 enum srvsvc_ShareType type;
1869 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1870 if (!NT_STATUS_IS_OK(nterr)) {
1871 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1872 return WERR_GENERAL_FAILURE;
1875 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1876 if (type & STYPE_HIDDEN) {
1882 info.info0 = &ctr0->array[y];
1883 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1884 W_ERROR_NOT_OK_RETURN(status);
1888 talloc_free(snames);
1890 r->out.ctr.ctr0 = ctr0;
1891 r->out.totalentries = r->out.ctr.ctr0->count;
1898 struct srvsvc_NetShareCtr1 *ctr1;
1900 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
1901 W_ERROR_HAVE_NO_MEMORY(ctr1);
1904 ctr1->count = count;
1907 if (ctr1->count == 0) {
1908 r->out.ctr.ctr1 = ctr1;
1912 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, count);
1913 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
1915 for (i=0; i < count; i++) {
1917 union srvsvc_NetShareInfo info;
1918 enum srvsvc_ShareType type;
1920 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1921 if (!NT_STATUS_IS_OK(nterr)) {
1922 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1923 return WERR_GENERAL_FAILURE;
1926 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1927 if (type & STYPE_HIDDEN) {
1933 info.info1 = &ctr1->array[y];
1934 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1935 W_ERROR_NOT_OK_RETURN(status);
1939 talloc_free(snames);
1941 r->out.ctr.ctr1 = ctr1;
1942 r->out.totalentries = r->out.ctr.ctr1->count;
1949 struct srvsvc_NetShareCtr2 *ctr2;
1951 SRVSVC_CHECK_ADMIN_ACCESS;
1953 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
1954 W_ERROR_HAVE_NO_MEMORY(ctr2);
1957 ctr2->count = count;
1960 if (ctr2->count == 0) {
1961 r->out.ctr.ctr2 = ctr2;
1965 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, count);
1966 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
1968 for (i=0; i < count; i++) {
1970 union srvsvc_NetShareInfo info;
1971 enum srvsvc_ShareType type;
1973 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1974 if (!NT_STATUS_IS_OK(nterr)) {
1975 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1976 return WERR_GENERAL_FAILURE;
1979 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1980 if (type & STYPE_HIDDEN) {
1986 info.info2 = &ctr2->array[y];
1987 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1988 W_ERROR_NOT_OK_RETURN(status);
1992 talloc_free(snames);
1994 r->out.ctr.ctr2 = ctr2;
1995 r->out.totalentries = r->out.ctr.ctr2->count;
2002 struct srvsvc_NetShareCtr502 *ctr502;
2004 SRVSVC_CHECK_ADMIN_ACCESS;
2006 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
2007 W_ERROR_HAVE_NO_MEMORY(ctr502);
2010 ctr502->count = count;
2011 ctr502->array = NULL;
2013 if (ctr502->count == 0) {
2014 r->out.ctr.ctr502 = ctr502;
2018 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, count);
2019 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
2021 for (i=0; i < count; i++) {
2023 union srvsvc_NetShareInfo info;
2024 enum srvsvc_ShareType type;
2026 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
2027 if (!NT_STATUS_IS_OK(nterr)) {
2028 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
2029 return WERR_GENERAL_FAILURE;
2032 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
2033 if (type & STYPE_HIDDEN) {
2039 info.info502 = &ctr502->array[y];
2040 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
2041 W_ERROR_NOT_OK_RETURN(status);
2045 talloc_free(snames);
2047 r->out.ctr.ctr502 = ctr502;
2048 r->out.totalentries = r->out.ctr.ctr502->count;
2052 return WERR_UNKNOWN_LEVEL;
2055 return WERR_UNKNOWN_LEVEL;
2060 srvsvc_NetShareDelStart
2062 static WERROR dcesrv_srvsvc_NetShareDelStart(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2063 struct srvsvc_NetShareDelStart *r)
2065 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2070 srvsvc_NetShareDelCommit
2072 static WERROR dcesrv_srvsvc_NetShareDelCommit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2073 struct srvsvc_NetShareDelCommit *r)
2075 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2080 srvsvc_NetGetFileSecurity
2082 static WERROR dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2083 struct srvsvc_NetGetFileSecurity *r)
2085 struct sec_desc_buf *sd_buf;
2086 struct ntvfs_context *ntvfs_ctx = NULL;
2087 struct ntvfs_request *ntvfs_req;
2088 union smb_fileinfo *io;
2091 nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
2092 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2094 ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
2095 dce_call->conn->auth_state.session_info,
2099 W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
2101 sd_buf = talloc(mem_ctx, struct sec_desc_buf);
2102 W_ERROR_HAVE_NO_MEMORY(sd_buf);
2104 io = talloc(mem_ctx, union smb_fileinfo);
2105 W_ERROR_HAVE_NO_MEMORY(io);
2107 io->query_secdesc.level = RAW_FILEINFO_SEC_DESC;
2108 io->query_secdesc.in.file.path = r->in.file;
2109 io->query_secdesc.in.secinfo_flags = r->in.securityinformation;
2111 nt_status = ntvfs_qpathinfo(ntvfs_req, io);
2112 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2114 sd_buf->sd = io->query_secdesc.out.sd;
2116 r->out.sd_buf = sd_buf;
2122 srvsvc_NetSetFileSecurity
2124 static WERROR dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2125 struct srvsvc_NetSetFileSecurity *r)
2127 struct ntvfs_context *ntvfs_ctx;
2128 struct ntvfs_request *ntvfs_req;
2129 union smb_setfileinfo *io;
2132 nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
2133 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2135 ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
2136 dce_call->conn->auth_state.session_info,
2140 W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
2142 io = talloc(mem_ctx, union smb_setfileinfo);
2143 W_ERROR_HAVE_NO_MEMORY(io);
2145 io->set_secdesc.level = RAW_FILEINFO_SEC_DESC;
2146 io->set_secdesc.in.file.path = r->in.file;
2147 io->set_secdesc.in.secinfo_flags = r->in.securityinformation;
2148 io->set_secdesc.in.sd = r->in.sd_buf.sd;
2150 nt_status = ntvfs_setpathinfo(ntvfs_req, io);
2151 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2158 srvsvc_NetServerTransportAddEx
2160 static WERROR dcesrv_srvsvc_NetServerTransportAddEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2161 struct srvsvc_NetServerTransportAddEx *r)
2163 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2168 srvsvc_NetServerSetServiceBitsEx
2170 static WERROR dcesrv_srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2171 struct srvsvc_NetServerSetServiceBitsEx *r)
2173 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2178 srvsvc_NETRDFSGETVERSION
2180 static WERROR dcesrv_srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2181 struct srvsvc_NETRDFSGETVERSION *r)
2183 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2188 srvsvc_NETRDFSCREATELOCALPARTITION
2190 static WERROR dcesrv_srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2191 struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
2193 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2198 srvsvc_NETRDFSDELETELOCALPARTITION
2200 static WERROR dcesrv_srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2201 struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
2203 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2208 srvsvc_NETRDFSSETLOCALVOLUMESTATE
2210 static WERROR dcesrv_srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2211 struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
2213 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2218 srvsvc_NETRDFSSETSERVERINFO
2220 static WERROR dcesrv_srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2221 struct srvsvc_NETRDFSSETSERVERINFO *r)
2223 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2228 srvsvc_NETRDFSCREATEEXITPOINT
2230 static WERROR dcesrv_srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2231 struct srvsvc_NETRDFSCREATEEXITPOINT *r)
2233 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2238 srvsvc_NETRDFSDELETEEXITPOINT
2240 static WERROR dcesrv_srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2241 struct srvsvc_NETRDFSDELETEEXITPOINT *r)
2243 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2248 srvsvc_NETRDFSMODIFYPREFIX
2250 static WERROR dcesrv_srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2251 struct srvsvc_NETRDFSMODIFYPREFIX *r)
2253 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2258 srvsvc_NETRDFSFIXLOCALVOLUME
2260 static WERROR dcesrv_srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2261 struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
2263 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2268 srvsvc_NETRDFSMANAGERREPORTSITEINFO
2270 static WERROR dcesrv_srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2271 struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
2273 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2278 srvsvc_NETRSERVERTRANSPORTDELEX
2280 static WERROR dcesrv_srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2281 struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
2283 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2289 static WERROR dcesrv_srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2290 struct srvsvc_NetShareDel *r)
2293 struct share_context *sctx;
2295 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->conn->dce_ctx->lp_ctx, &sctx);
2296 if (!NT_STATUS_IS_OK(nterr)) {
2297 return ntstatus_to_werror(nterr);
2300 nterr = share_remove(sctx, r->in.share_name);
2301 if (!NT_STATUS_IS_OK(nterr)) {
2302 return ntstatus_to_werror(nterr);
2309 srvsvc_NetSetServiceBits
2311 static WERROR dcesrv_srvsvc_NetSetServiceBits(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2312 struct srvsvc_NetSetServiceBits *r)
2314 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2318 srvsvc_NETRPRNAMECANONICALIZE
2320 static WERROR dcesrv_srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2321 struct srvsvc_NETRPRNAMECANONICALIZE *r)
2323 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2326 /* include the generated boilerplate */
2327 #include "librpc/gen_ndr/ndr_srvsvc_s.c"