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/share.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 auth_session_info *si = dcesrv_call_session_info(dce_call); \
36 struct security_token *t = si->security_token; \
37 if (!security_token_has_builtin_administrators(t) && \
38 !security_token_has_sid(t, &global_sid_Builtin_Server_Operators)) { \
39 return WERR_ACCESS_DENIED; \
46 static WERROR dcesrv_srvsvc_NetCharDevEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
47 struct srvsvc_NetCharDevEnum *r)
49 *r->out.totalentries = 0;
51 switch (r->in.info_ctr->level) {
53 r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr0);
54 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
56 r->out.info_ctr->ctr.ctr0->count = 0;
57 r->out.info_ctr->ctr.ctr0->array = NULL;
59 return WERR_NOT_SUPPORTED;
62 r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr1);
63 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
65 r->out.info_ctr->ctr.ctr1->count = 0;
66 r->out.info_ctr->ctr.ctr1->array = NULL;
68 return WERR_NOT_SUPPORTED;
71 return WERR_INVALID_LEVEL;
77 srvsvc_NetCharDevGetInfo
79 static WERROR dcesrv_srvsvc_NetCharDevGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
80 struct srvsvc_NetCharDevGetInfo *r)
82 ZERO_STRUCTP(r->out.info);
84 switch (r->in.level) {
87 return WERR_NOT_SUPPORTED;
91 return WERR_NOT_SUPPORTED;
94 return WERR_INVALID_LEVEL;
100 srvsvc_NetCharDevControl
102 static WERROR dcesrv_srvsvc_NetCharDevControl(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
103 struct srvsvc_NetCharDevControl *r)
105 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
110 srvsvc_NetCharDevQEnum
112 static WERROR dcesrv_srvsvc_NetCharDevQEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
113 struct srvsvc_NetCharDevQEnum *r)
115 *r->out.totalentries = 0;
117 switch (r->in.info_ctr->level) {
120 r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr0);
121 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
123 r->out.info_ctr->ctr.ctr0->count = 0;
124 r->out.info_ctr->ctr.ctr0->array = NULL;
126 return WERR_NOT_SUPPORTED;
130 r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr1);
131 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
133 r->out.info_ctr->ctr.ctr1->count = 0;
134 r->out.info_ctr->ctr.ctr1->array = NULL;
136 return WERR_NOT_SUPPORTED;
139 return WERR_INVALID_LEVEL;
145 srvsvc_NetCharDevQGetInfo
147 static WERROR dcesrv_srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
148 struct srvsvc_NetCharDevQGetInfo *r)
150 ZERO_STRUCTP(r->out.info);
152 switch (r->in.level) {
155 return WERR_NOT_SUPPORTED;
159 return WERR_NOT_SUPPORTED;
162 return WERR_INVALID_LEVEL;
168 srvsvc_NetCharDevQSetInfo
170 static WERROR dcesrv_srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
171 struct srvsvc_NetCharDevQSetInfo *r)
173 switch (r->in.level) {
176 if (r->in.parm_error) {
177 r->out.parm_error = r->in.parm_error;
179 return WERR_NOT_SUPPORTED;
183 if (r->in.parm_error) {
184 r->out.parm_error = r->in.parm_error;
186 return WERR_NOT_SUPPORTED;
189 return WERR_INVALID_LEVEL;
195 srvsvc_NetCharDevQPurge
197 static WERROR dcesrv_srvsvc_NetCharDevQPurge(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
198 struct srvsvc_NetCharDevQPurge *r)
200 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
205 srvsvc_NetCharDevQPurgeSelf
207 static WERROR dcesrv_srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
208 struct srvsvc_NetCharDevQPurgeSelf *r)
210 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
217 static WERROR dcesrv_srvsvc_NetConnEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
218 struct srvsvc_NetConnEnum *r)
220 *r->out.totalentries = 0;
222 switch (r->in.info_ctr->level) {
225 r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetConnCtr0);
226 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
228 r->out.info_ctr->ctr.ctr0->count = 0;
229 r->out.info_ctr->ctr.ctr0->array = NULL;
231 return WERR_NOT_SUPPORTED;
235 r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetConnCtr1);
236 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
238 r->out.info_ctr->ctr.ctr1->count = 0;
239 r->out.info_ctr->ctr.ctr1->array = NULL;
241 return WERR_NOT_SUPPORTED;
244 return WERR_INVALID_LEVEL;
252 static WERROR dcesrv_srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
253 struct srvsvc_NetFileEnum *r)
255 *r->out.totalentries = 0;
257 switch (r->in.info_ctr->level) {
260 r->out.info_ctr->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetFileCtr2);
261 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr2);
263 r->out.info_ctr->ctr.ctr2->count = 0;
264 r->out.info_ctr->ctr.ctr2->array = NULL;
266 return WERR_NOT_SUPPORTED;
270 r->out.info_ctr->ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetFileCtr3);
271 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr3);
273 r->out.info_ctr->ctr.ctr3->count = 0;
274 r->out.info_ctr->ctr.ctr3->array = NULL;
276 return WERR_NOT_SUPPORTED;
279 return WERR_INVALID_LEVEL;
285 srvsvc_NetFileGetInfo
287 static WERROR dcesrv_srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
288 struct srvsvc_NetFileGetInfo *r)
290 ZERO_STRUCTP(r->out.info);
292 switch (r->in.level) {
295 return WERR_NOT_SUPPORTED;
299 return WERR_NOT_SUPPORTED;
302 return WERR_INVALID_LEVEL;
310 static WERROR dcesrv_srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
311 struct srvsvc_NetFileClose *r)
313 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
320 static WERROR dcesrv_srvsvc_NetSessEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
321 struct srvsvc_NetSessEnum *r)
323 *r->out.totalentries = 0;
325 switch (r->in.info_ctr->level) {
328 r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetSessCtr0);
329 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
331 r->out.info_ctr->ctr.ctr0->count = 0;
332 r->out.info_ctr->ctr.ctr0->array = NULL;
334 return WERR_NOT_SUPPORTED;
338 r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetSessCtr1);
339 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
341 r->out.info_ctr->ctr.ctr1->count = 0;
342 r->out.info_ctr->ctr.ctr1->array = NULL;
344 return WERR_NOT_SUPPORTED;
348 r->out.info_ctr->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetSessCtr2);
349 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr2);
351 r->out.info_ctr->ctr.ctr2->count = 0;
352 r->out.info_ctr->ctr.ctr2->array = NULL;
354 return WERR_NOT_SUPPORTED;
358 r->out.info_ctr->ctr.ctr10 = talloc(mem_ctx, struct srvsvc_NetSessCtr10);
359 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr10);
361 r->out.info_ctr->ctr.ctr10->count = 0;
362 r->out.info_ctr->ctr.ctr10->array = NULL;
364 return WERR_NOT_SUPPORTED;
368 r->out.info_ctr->ctr.ctr502 = talloc(mem_ctx, struct srvsvc_NetSessCtr502);
369 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr502);
371 r->out.info_ctr->ctr.ctr502->count = 0;
372 r->out.info_ctr->ctr.ctr502->array = NULL;
374 return WERR_NOT_SUPPORTED;
377 return WERR_INVALID_LEVEL;
385 static WERROR dcesrv_srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
386 struct srvsvc_NetSessDel *r)
388 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
395 static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
396 struct srvsvc_NetShareAdd *r)
398 switch (r->in.level) {
401 if (r->in.parm_error) {
402 r->out.parm_error = r->in.parm_error;
404 return WERR_NOT_SUPPORTED;
408 if (r->in.parm_error) {
409 r->out.parm_error = r->in.parm_error;
411 return WERR_NOT_SUPPORTED;
416 struct share_info *info;
417 struct share_context *sctx;
418 unsigned int count = 8;
421 nterr = share_get_context_by_name(mem_ctx, lpcfg_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
422 if (!NT_STATUS_IS_OK(nterr)) {
423 return ntstatus_to_werror(nterr);
426 /* there are no more than 8 options in struct srvsvc_NetShareInfo2 */
427 info = talloc_array(mem_ctx, struct share_info, count);
428 W_ERROR_HAVE_NO_MEMORY(info);
432 info[i].name = SHARE_TYPE;
433 info[i].type = SHARE_INFO_STRING;
434 switch (r->in.info->info2->type) {
436 info[i].value = talloc_strdup(info, "DISK");
439 info[i].value = talloc_strdup(info, "PRINTER");
442 info[i].value = talloc_strdup(info, "IPC");
445 return WERR_INVALID_PARAMETER;
447 W_ERROR_HAVE_NO_MEMORY(info[i].value);
450 if (r->in.info->info2->path && r->in.info->info2->path[0]) {
451 info[i].name = SHARE_PATH;
452 info[i].type = SHARE_INFO_STRING;
454 /* Windows will send a path in a form of C:\example\path */
455 if (r->in.info->info2->path[1] == ':') {
456 info[i].value = talloc_strdup(info, &r->in.info->info2->path[2]);
458 /* very strange let's try to set as is */
459 info[i].value = talloc_strdup(info, r->in.info->info2->path);
461 W_ERROR_HAVE_NO_MEMORY(info[i].value);
462 all_string_sub((char *)info[i].value, "\\", "/", 0);
467 if (r->in.info->info2->comment && r->in.info->info2->comment[0]) {
468 info[i].name = SHARE_COMMENT;
469 info[i].type = SHARE_INFO_STRING;
470 info[i].value = talloc_strdup(info, r->in.info->info2->comment);
471 W_ERROR_HAVE_NO_MEMORY(info[i].value);
476 if (r->in.info->info2->password && r->in.info->info2->password[0]) {
477 info[i].name = SHARE_PASSWORD;
478 info[i].type = SHARE_INFO_STRING;
479 info[i].value = talloc_strdup(info, r->in.info->info2->password);
480 W_ERROR_HAVE_NO_MEMORY(info[i].value);
485 info[i].name = SHARE_MAX_CONNECTIONS;
486 info[i].type = SHARE_INFO_INT;
487 info[i].value = talloc(info, int);
488 *((int *)info[i].value) = r->in.info->info2->max_users;
491 /* TODO: security descriptor */
493 nterr = share_create(sctx, r->in.info->info2->name, info, i);
494 if (!NT_STATUS_IS_OK(nterr)) {
495 return ntstatus_to_werror(nterr);
498 if (r->in.parm_error) {
499 r->out.parm_error = r->in.parm_error;
506 if (r->in.parm_error) {
507 r->out.parm_error = r->in.parm_error;
509 return WERR_NOT_SUPPORTED;
514 struct share_info *info;
515 struct share_context *sctx;
516 unsigned int count = 10;
519 nterr = share_get_context_by_name(mem_ctx, lpcfg_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
520 if (!NT_STATUS_IS_OK(nterr)) {
521 return ntstatus_to_werror(nterr);
524 /* there are no more than 10 options in struct srvsvc_NetShareInfo502 */
525 info = talloc_array(mem_ctx, struct share_info, count);
526 W_ERROR_HAVE_NO_MEMORY(info);
530 info[i].name = SHARE_TYPE;
531 info[i].type = SHARE_INFO_STRING;
532 switch (r->in.info->info502->type) {
534 info[i].value = talloc_strdup(info, "DISK");
537 info[i].value = talloc_strdup(info, "PRINTER");
540 info[i].value = talloc_strdup(info, "IPC");
543 return WERR_INVALID_PARAMETER;
545 W_ERROR_HAVE_NO_MEMORY(info[i].value);
548 if (r->in.info->info502->path && r->in.info->info502->path[0]) {
549 info[i].name = SHARE_PATH;
550 info[i].type = SHARE_INFO_STRING;
552 /* Windows will send a path in a form of C:\example\path */
553 if (r->in.info->info502->path[1] == ':') {
554 info[i].value = talloc_strdup(info, &r->in.info->info502->path[2]);
556 /* very strange let's try to set as is */
557 info[i].value = talloc_strdup(info, r->in.info->info502->path);
559 W_ERROR_HAVE_NO_MEMORY(info[i].value);
560 all_string_sub((char *)info[i].value, "\\", "/", 0);
565 if (r->in.info->info502->comment && r->in.info->info502->comment[0]) {
566 info[i].name = SHARE_COMMENT;
567 info[i].type = SHARE_INFO_STRING;
568 info[i].value = talloc_strdup(info, r->in.info->info502->comment);
569 W_ERROR_HAVE_NO_MEMORY(info[i].value);
574 if (r->in.info->info502->password && r->in.info->info502->password[0]) {
575 info[i].name = SHARE_PASSWORD;
576 info[i].type = SHARE_INFO_STRING;
577 info[i].value = talloc_strdup(info, r->in.info->info502->password);
578 W_ERROR_HAVE_NO_MEMORY(info[i].value);
583 info[i].name = SHARE_MAX_CONNECTIONS;
584 info[i].type = SHARE_INFO_INT;
585 info[i].value = talloc(info, int);
586 *((int *)info[i].value) = r->in.info->info502->max_users;
589 /* TODO: security descriptor */
591 nterr = share_create(sctx, r->in.info->info502->name, info, i);
592 if (!NT_STATUS_IS_OK(nterr)) {
593 return ntstatus_to_werror(nterr);
596 if (r->in.parm_error) {
597 r->out.parm_error = r->in.parm_error;
603 return WERR_INVALID_LEVEL;
607 static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
608 struct share_config *scfg, uint32_t level,
609 union srvsvc_NetShareInfo *info)
611 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
616 info->info0->name = talloc_strdup(mem_ctx, scfg->name);
617 W_ERROR_HAVE_NO_MEMORY(info->info0->name);
623 info->info1->name = talloc_strdup(mem_ctx, scfg->name);
624 W_ERROR_HAVE_NO_MEMORY(info->info1->name);
625 info->info1->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
626 info->info1->comment = share_string_option(mem_ctx, scfg, SHARE_COMMENT, "");
627 W_ERROR_HAVE_NO_MEMORY(info->info1->comment);
633 info->info2->name = talloc_strdup(mem_ctx, scfg->name);
634 W_ERROR_HAVE_NO_MEMORY(info->info2->name);
635 info->info2->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
636 info->info2->comment = share_string_option(mem_ctx, scfg, SHARE_COMMENT, "");
637 W_ERROR_HAVE_NO_MEMORY(info->info2->comment);
638 info->info2->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
639 info->info2->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
640 info->info2->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
641 info->info2->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
642 W_ERROR_HAVE_NO_MEMORY(info->info2->path);
643 info->info2->password = share_string_option(mem_ctx, scfg, SHARE_PASSWORD, NULL);
649 info->info501->name = talloc_strdup(mem_ctx, scfg->name);
650 W_ERROR_HAVE_NO_MEMORY(info->info501->name);
651 info->info501->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
652 info->info501->comment = share_string_option(mem_ctx, scfg, SHARE_COMMENT, "");
653 W_ERROR_HAVE_NO_MEMORY(info->info501->comment);
654 info->info501->csc_policy = share_int_option(scfg, SHARE_CSC_POLICY, SHARE_CSC_POLICY_DEFAULT);
660 info->info502->name = talloc_strdup(mem_ctx, scfg->name);
661 W_ERROR_HAVE_NO_MEMORY(info->info502->name);
662 info->info502->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
663 info->info502->comment = share_string_option(mem_ctx, scfg, SHARE_COMMENT, "");
664 W_ERROR_HAVE_NO_MEMORY(info->info502->comment);
665 info->info502->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
666 info->info502->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
667 info->info502->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
668 info->info502->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
669 W_ERROR_HAVE_NO_MEMORY(info->info502->path);
670 info->info502->password = share_string_option(mem_ctx, scfg, SHARE_PASSWORD, NULL);
671 info->info502->sd_buf.sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, scfg);
677 info->info1005->dfs_flags = dcesrv_common_get_share_dfs_flags(mem_ctx, dce_ctx, scfg);
682 return WERR_INVALID_LEVEL;
687 srvsvc_NetShareEnumAll
689 static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
690 struct srvsvc_NetShareEnumAll *r)
695 struct share_context *sctx;
696 struct share_config *scfg;
698 *r->out.totalentries = 0;
700 /* TODO: - paging of results
703 nterr = share_get_context_by_name(mem_ctx, lpcfg_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
704 if (!NT_STATUS_IS_OK(nterr)) {
705 return ntstatus_to_werror(nterr);
708 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
709 if (!NT_STATUS_IS_OK(nterr)) {
710 return ntstatus_to_werror(nterr);
713 switch (r->in.info_ctr->level) {
717 struct srvsvc_NetShareCtr0 *ctr0;
719 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
720 W_ERROR_HAVE_NO_MEMORY(ctr0);
722 ctr0->count = numshares;
725 if (ctr0->count == 0) {
726 r->out.info_ctr->ctr.ctr0 = ctr0;
730 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, ctr0->count);
731 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
733 for (i = 0; i < ctr0->count; i++) {
735 union srvsvc_NetShareInfo info;
737 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
738 if (!NT_STATUS_IS_OK(nterr)) {
739 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
740 return WERR_GEN_FAILURE;
742 info.info0 = &ctr0->array[i];
743 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
744 if (!W_ERROR_IS_OK(status)) {
751 r->out.info_ctr->ctr.ctr0 = ctr0;
752 *r->out.totalentries = r->out.info_ctr->ctr.ctr0->count;
758 struct srvsvc_NetShareCtr1 *ctr1;
760 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
761 W_ERROR_HAVE_NO_MEMORY(ctr1);
763 ctr1->count = numshares;
766 if (ctr1->count == 0) {
767 r->out.info_ctr->ctr.ctr1 = ctr1;
771 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, ctr1->count);
772 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
774 for (i=0; i < ctr1->count; i++) {
776 union srvsvc_NetShareInfo info;
778 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
779 if (!NT_STATUS_IS_OK(nterr)) {
780 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
781 return WERR_GEN_FAILURE;
783 info.info1 = &ctr1->array[i];
784 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
785 if (!W_ERROR_IS_OK(status)) {
792 r->out.info_ctr->ctr.ctr1 = ctr1;
793 *r->out.totalentries = r->out.info_ctr->ctr.ctr1->count;
800 struct srvsvc_NetShareCtr2 *ctr2;
802 SRVSVC_CHECK_ADMIN_ACCESS;
804 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
805 W_ERROR_HAVE_NO_MEMORY(ctr2);
807 ctr2->count = numshares;
810 if (ctr2->count == 0) {
811 r->out.info_ctr->ctr.ctr2 = ctr2;
815 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, ctr2->count);
816 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
818 for (i=0; i < ctr2->count; i++) {
820 union srvsvc_NetShareInfo info;
822 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
823 if (!NT_STATUS_IS_OK(nterr)) {
824 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
825 return WERR_GEN_FAILURE;
827 info.info2 = &ctr2->array[i];
828 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
829 if (!W_ERROR_IS_OK(status)) {
836 r->out.info_ctr->ctr.ctr2 = ctr2;
837 *r->out.totalentries = r->out.info_ctr->ctr.ctr2->count;
844 struct srvsvc_NetShareCtr501 *ctr501;
846 SRVSVC_CHECK_ADMIN_ACCESS;
848 ctr501 = talloc(mem_ctx, struct srvsvc_NetShareCtr501);
849 W_ERROR_HAVE_NO_MEMORY(ctr501);
851 ctr501->count = numshares;
852 ctr501->array = NULL;
854 if (ctr501->count == 0) {
855 r->out.info_ctr->ctr.ctr501 = ctr501;
859 ctr501->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo501, ctr501->count);
860 W_ERROR_HAVE_NO_MEMORY(ctr501->array);
862 for (i=0; i < ctr501->count; i++) {
864 union srvsvc_NetShareInfo info;
866 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
867 if (!NT_STATUS_IS_OK(nterr)) {
868 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
869 return WERR_GEN_FAILURE;
871 info.info501 = &ctr501->array[i];
872 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
873 if (!W_ERROR_IS_OK(status)) {
880 r->out.info_ctr->ctr.ctr501 = ctr501;
881 *r->out.totalentries = r->out.info_ctr->ctr.ctr501->count;
888 struct srvsvc_NetShareCtr502 *ctr502;
890 SRVSVC_CHECK_ADMIN_ACCESS;
892 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
893 W_ERROR_HAVE_NO_MEMORY(ctr502);
895 ctr502->count = numshares;
896 ctr502->array = NULL;
898 if (ctr502->count == 0) {
899 r->out.info_ctr->ctr.ctr502 = ctr502;
903 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, ctr502->count);
904 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
906 for (i=0; i < ctr502->count; i++) {
908 union srvsvc_NetShareInfo info;
910 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
911 if (!NT_STATUS_IS_OK(nterr)) {
912 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
913 return WERR_GEN_FAILURE;
915 info.info502 = &ctr502->array[i];
916 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
917 if (!W_ERROR_IS_OK(status)) {
924 r->out.info_ctr->ctr.ctr502 = ctr502;
925 *r->out.totalentries = r->out.info_ctr->ctr.ctr502->count;
930 return WERR_INVALID_LEVEL;
936 srvsvc_NetShareGetInfo
938 static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
939 struct srvsvc_NetShareGetInfo *r)
942 struct share_context *sctx = NULL;
943 struct share_config *scfg = NULL;
945 ZERO_STRUCTP(r->out.info);
947 /* TODO: - access check
950 if (strcmp("", r->in.share_name) == 0) {
951 return WERR_INVALID_PARAMETER;
954 nterr = share_get_context_by_name(mem_ctx, lpcfg_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
955 if (!NT_STATUS_IS_OK(nterr)) {
956 return ntstatus_to_werror(nterr);
959 nterr = share_get_config(mem_ctx, sctx, r->in.share_name, &scfg);
960 if (!NT_STATUS_IS_OK(nterr)) {
961 return ntstatus_to_werror(nterr);
964 switch (r->in.level) {
968 union srvsvc_NetShareInfo info;
970 info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0);
971 W_ERROR_HAVE_NO_MEMORY(info.info0);
973 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
974 if (!W_ERROR_IS_OK(status)) {
978 r->out.info->info0 = info.info0;
984 union srvsvc_NetShareInfo info;
986 info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1);
987 W_ERROR_HAVE_NO_MEMORY(info.info1);
989 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
990 if (!W_ERROR_IS_OK(status)) {
994 r->out.info->info1 = info.info1;
1000 union srvsvc_NetShareInfo info;
1002 SRVSVC_CHECK_ADMIN_ACCESS;
1004 info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
1005 W_ERROR_HAVE_NO_MEMORY(info.info2);
1007 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1008 if (!W_ERROR_IS_OK(status)) {
1012 r->out.info->info2 = info.info2;
1018 union srvsvc_NetShareInfo info;
1020 info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501);
1021 W_ERROR_HAVE_NO_MEMORY(info.info501);
1023 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1024 if (!W_ERROR_IS_OK(status)) {
1028 r->out.info->info501 = info.info501;
1034 union srvsvc_NetShareInfo info;
1036 SRVSVC_CHECK_ADMIN_ACCESS;
1038 info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502);
1039 W_ERROR_HAVE_NO_MEMORY(info.info502);
1041 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1042 if (!W_ERROR_IS_OK(status)) {
1046 r->out.info->info502 = info.info502;
1052 union srvsvc_NetShareInfo info;
1054 info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005);
1055 W_ERROR_HAVE_NO_MEMORY(info.info1005);
1057 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1058 if (!W_ERROR_IS_OK(status)) {
1062 r->out.info->info1005 = info.info1005;
1066 return WERR_INVALID_LEVEL;
1070 static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count,
1071 const char *share_name, int level,
1074 const char *comment,
1075 const char *password,
1076 enum srvsvc_ShareType type,
1078 uint32_t csc_policy,
1079 struct security_descriptor *sd)
1084 info[i].name = SHARE_CSC_POLICY;
1085 info[i].type = SHARE_INFO_INT;
1086 info[i].value = talloc(info, int);
1087 *((int *)info[i].value) = csc_policy;
1094 /* TODO: check if unknown is csc_policy */
1096 /* TODO: security descriptor */
1099 if (path && path[0]) {
1100 info[i].name = SHARE_PATH;
1101 info[i].type = SHARE_INFO_STRING;
1103 /* Windows will send a path in a form of C:\example\path */
1104 if (path[1] == ':') {
1105 info[i].value = talloc_strdup(info, &path[2]);
1107 /* very strange let's try to set as is */
1108 info[i].value = talloc_strdup(info, path);
1110 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1111 all_string_sub((char *)info[i].value, "\\", "/", 0);
1116 if (password && password[0]) {
1117 info[i].name = SHARE_PASSWORD;
1118 info[i].type = SHARE_INFO_STRING;
1119 info[i].value = talloc_strdup(info, password);
1120 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1125 info[i].name = SHARE_MAX_CONNECTIONS;
1126 info[i].type = SHARE_INFO_INT;
1127 info[i].value = talloc(info, int);
1128 *((int *)info[i].value) = max_users;
1134 info[i].name = SHARE_TYPE;
1135 info[i].type = SHARE_INFO_STRING;
1138 info[i].value = talloc_strdup(info, "DISK");
1141 info[i].value = talloc_strdup(info, "PRINTER");
1144 info[i].value = talloc_strdup(info, "IPC");
1147 return WERR_INVALID_PARAMETER;
1149 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1155 info[i].name = SHARE_COMMENT;
1156 info[i].type = SHARE_INFO_STRING;
1157 info[i].value = talloc_strdup(info, comment);
1158 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1166 strcasecmp(share_name, name) != 0) {
1167 info[i].name = SHARE_NAME;
1168 info[i].type = SHARE_INFO_STRING;
1169 info[i].value = talloc_strdup(info, name);
1170 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1177 return WERR_INVALID_LEVEL;
1186 srvsvc_NetShareSetInfo
1188 static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1189 struct srvsvc_NetShareSetInfo *r)
1193 struct share_context *sctx = NULL;
1194 struct share_info *info;
1197 /* TODO: - access check
1200 /* there are no more than 10 options in all struct srvsvc_NetShareInfoXXX */
1201 info = talloc_array(mem_ctx, struct share_info, 10);
1202 W_ERROR_HAVE_NO_MEMORY(info);
1204 if (strcmp("", r->in.share_name) == 0) {
1205 return WERR_INVALID_PARAMETER;
1208 nterr = share_get_context_by_name(mem_ctx, lpcfg_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
1209 if (!NT_STATUS_IS_OK(nterr)) {
1210 return ntstatus_to_werror(nterr);
1213 switch (r->in.level) {
1216 status = dcesrv_srvsvc_fill_share_info(info, &count,
1217 r->in.share_name, r->in.level,
1218 r->in.info->info0->name,
1226 if (!W_ERROR_EQUAL(status, WERR_OK)) {
1233 status = dcesrv_srvsvc_fill_share_info(info, &count,
1234 r->in.share_name, r->in.level,
1235 r->in.info->info1->name,
1237 r->in.info->info1->comment,
1239 r->in.info->info1->type,
1243 if (!W_ERROR_EQUAL(status, WERR_OK)) {
1250 status = dcesrv_srvsvc_fill_share_info(info, &count,
1251 r->in.share_name, r->in.level,
1252 r->in.info->info2->name,
1253 r->in.info->info2->path,
1254 r->in.info->info2->comment,
1255 r->in.info->info2->password,
1256 r->in.info->info2->type,
1257 r->in.info->info2->max_users,
1260 if (!W_ERROR_EQUAL(status, WERR_OK)) {
1267 status = dcesrv_srvsvc_fill_share_info(info, &count,
1268 r->in.share_name, r->in.level,
1269 r->in.info->info501->name,
1271 r->in.info->info501->comment,
1273 r->in.info->info501->type,
1275 r->in.info->info501->csc_policy,
1277 if (!W_ERROR_EQUAL(status, WERR_OK)) {
1284 status = dcesrv_srvsvc_fill_share_info(info, &count,
1285 r->in.share_name, r->in.level,
1286 r->in.info->info502->name,
1287 r->in.info->info502->path,
1288 r->in.info->info502->comment,
1289 r->in.info->info502->password,
1290 r->in.info->info502->type,
1291 r->in.info->info502->max_users,
1293 r->in.info->info502->sd_buf.sd);
1294 if (!W_ERROR_EQUAL(status, WERR_OK)) {
1301 status = dcesrv_srvsvc_fill_share_info(info, &count,
1302 r->in.share_name, r->in.level,
1305 r->in.info->info1004->comment,
1311 if (!W_ERROR_EQUAL(status, WERR_OK)) {
1318 /* r->in.info.dfs_flags; */
1320 if (r->in.parm_error) {
1321 r->out.parm_error = r->in.parm_error;
1327 return WERR_INVALID_LEVEL;
1330 nterr = share_set(sctx, r->in.share_name, info, count);
1331 if (!NT_STATUS_IS_OK(nterr)) {
1332 return ntstatus_to_werror(nterr);
1335 if (r->in.parm_error) {
1336 r->out.parm_error = r->in.parm_error;
1344 srvsvc_NetShareDelSticky
1346 static WERROR dcesrv_srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1347 struct srvsvc_NetShareDelSticky *r)
1349 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1354 srvsvc_NetShareCheck
1356 static WERROR dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1357 struct srvsvc_NetShareCheck *r)
1360 struct share_context *sctx = NULL;
1361 struct share_config *scfg = NULL;
1369 /* TODO: - access check
1372 if (strcmp("", r->in.device_name) == 0) {
1373 *r->out.type = STYPE_IPC;
1377 /* copy the path skipping C:\ */
1378 if (strncasecmp(r->in.device_name, "C:", 2) == 0) {
1379 device = talloc_strdup(mem_ctx, &r->in.device_name[2]);
1381 /* no chance we have a share that doesn't start with C:\ */
1382 return WERR_NERR_DEVICENOTSHARED;
1384 all_string_sub(device, "\\", "/", 0);
1386 nterr = share_get_context_by_name(mem_ctx, lpcfg_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
1387 if (!NT_STATUS_IS_OK(nterr)) {
1388 return ntstatus_to_werror(nterr);
1391 nterr = share_list_all(mem_ctx, sctx, &count, &names);
1392 if (!NT_STATUS_IS_OK(nterr)) {
1393 return ntstatus_to_werror(nterr);
1396 for (i = 0; i < count; i++) {
1400 nterr = share_get_config(mem_ctx, sctx, names[i], &scfg);
1401 if (!NT_STATUS_IS_OK(nterr)) {
1402 return ntstatus_to_werror(nterr);
1404 path = share_string_option(mem_ctx, scfg, SHARE_PATH, NULL);
1405 if (!path) continue;
1407 if (strcmp(device, path) == 0) {
1408 type = share_string_option(mem_ctx, scfg, SHARE_TYPE, NULL);
1409 if (!type) continue;
1411 if (strcmp(type, "DISK") == 0) {
1412 *r->out.type = STYPE_DISKTREE;
1416 if (strcmp(type, "IPC") == 0) {
1417 *r->out.type = STYPE_IPC;
1421 if (strcmp(type, "PRINTER") == 0) {
1422 *r->out.type = STYPE_PRINTQ;
1428 return WERR_NERR_DEVICENOTSHARED;
1433 srvsvc_NetSrvGetInfo
1435 static WERROR dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1436 struct srvsvc_NetSrvGetInfo *r)
1438 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1439 struct dcerpc_server_info *server_info = lpcfg_dcerpc_server_info(mem_ctx, dce_ctx->lp_ctx);
1441 ZERO_STRUCTP(r->out.info);
1443 switch (r->in.level) {
1446 struct srvsvc_NetSrvInfo100 *info100;
1448 info100 = talloc(mem_ctx, struct srvsvc_NetSrvInfo100);
1449 W_ERROR_HAVE_NO_MEMORY(info100);
1451 info100->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1452 info100->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1453 W_ERROR_HAVE_NO_MEMORY(info100->server_name);
1455 r->out.info->info100 = info100;
1460 struct srvsvc_NetSrvInfo101 *info101;
1462 info101 = talloc(mem_ctx, struct srvsvc_NetSrvInfo101);
1463 W_ERROR_HAVE_NO_MEMORY(info101);
1465 info101->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1466 info101->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1467 W_ERROR_HAVE_NO_MEMORY(info101->server_name);
1469 info101->version_major = server_info->version_major;
1470 info101->version_minor = server_info->version_minor;
1471 info101->server_type = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
1472 info101->comment = lpcfg_server_string(dce_ctx->lp_ctx, mem_ctx);
1473 W_ERROR_HAVE_NO_MEMORY(info101->comment);
1475 r->out.info->info101 = info101;
1480 struct srvsvc_NetSrvInfo102 *info102;
1482 info102 = talloc(mem_ctx, struct srvsvc_NetSrvInfo102);
1483 W_ERROR_HAVE_NO_MEMORY(info102);
1485 info102->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1486 info102->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1487 W_ERROR_HAVE_NO_MEMORY(info102->server_name);
1489 info102->version_major = server_info->version_major;
1490 info102->version_minor = server_info->version_minor;
1491 info102->server_type = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
1492 info102->comment = lpcfg_server_string(dce_ctx->lp_ctx, mem_ctx);
1493 W_ERROR_HAVE_NO_MEMORY(info102->comment);
1495 info102->users = dcesrv_common_get_users(mem_ctx, dce_ctx);
1496 info102->disc = dcesrv_common_get_disc(mem_ctx, dce_ctx);
1497 info102->hidden = dcesrv_common_get_hidden(mem_ctx, dce_ctx);
1498 info102->announce = dcesrv_common_get_announce(mem_ctx, dce_ctx);
1499 info102->anndelta = dcesrv_common_get_anndelta(mem_ctx, dce_ctx);
1500 info102->licenses = dcesrv_common_get_licenses(mem_ctx, dce_ctx);
1501 info102->userpath = dcesrv_common_get_userpath(mem_ctx, dce_ctx);
1502 W_ERROR_HAVE_NO_MEMORY(info102->userpath);
1504 r->out.info->info102 = info102;
1508 return WERR_INVALID_LEVEL;
1514 srvsvc_NetSrvSetInfo
1516 static WERROR dcesrv_srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1517 struct srvsvc_NetSrvSetInfo *r)
1519 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1526 static WERROR dcesrv_srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1527 struct srvsvc_NetDiskEnum *r)
1529 r->out.info->disks = NULL;
1530 r->out.info->count = 0;
1531 *r->out.totalentries = 0;
1533 switch (r->in.level) {
1536 /* we can safely hardcode the reply and report we have only one disk (C:) */
1537 /* for some reason Windows wants 2 entries with the second being empty */
1538 r->out.info->disks = talloc_array(mem_ctx, struct srvsvc_NetDiskInfo0, 2);
1539 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks);
1540 r->out.info->count = 2;
1542 r->out.info->disks[0].disk = talloc_strdup(mem_ctx, "C:");
1543 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[0].disk);
1545 r->out.info->disks[1].disk = talloc_strdup(mem_ctx, "");
1546 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[1].disk);
1548 *r->out.totalentries = 1;
1549 r->out.resume_handle = r->in.resume_handle;
1554 return WERR_INVALID_LEVEL;
1560 srvsvc_NetServerStatisticsGet
1562 static WERROR dcesrv_srvsvc_NetServerStatisticsGet(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1563 struct srvsvc_NetServerStatisticsGet *r)
1565 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1570 srvsvc_NetTransportAdd
1572 static WERROR dcesrv_srvsvc_NetTransportAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1573 struct srvsvc_NetTransportAdd *r)
1575 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1580 srvsvc_NetTransportEnum
1582 static WERROR dcesrv_srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1583 struct srvsvc_NetTransportEnum *r)
1585 r->out.transports->level = r->in.transports->level;
1586 *r->out.totalentries = 0;
1587 if (r->out.resume_handle) {
1588 *r->out.resume_handle = 0;
1591 switch (r->in.transports->level) {
1594 r->out.transports->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetTransportCtr0);
1595 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr0);
1597 r->out.transports->ctr.ctr0->count = 0;
1598 r->out.transports->ctr.ctr0->array = NULL;
1600 return WERR_NOT_SUPPORTED;
1604 r->out.transports->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetTransportCtr1);
1605 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr1);
1607 r->out.transports->ctr.ctr1->count = 0;
1608 r->out.transports->ctr.ctr1->array = NULL;
1610 return WERR_NOT_SUPPORTED;
1614 r->out.transports->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetTransportCtr2);
1615 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr2);
1617 r->out.transports->ctr.ctr2->count = 0;
1618 r->out.transports->ctr.ctr2->array = NULL;
1620 return WERR_NOT_SUPPORTED;
1624 r->out.transports->ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetTransportCtr3);
1625 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr3);
1627 r->out.transports->ctr.ctr3->count = 0;
1628 r->out.transports->ctr.ctr3->array = NULL;
1630 return WERR_NOT_SUPPORTED;
1633 return WERR_INVALID_LEVEL;
1638 srvsvc_NetTransportDel
1640 static WERROR dcesrv_srvsvc_NetTransportDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1641 struct srvsvc_NetTransportDel *r)
1643 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1650 static WERROR dcesrv_srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1651 struct srvsvc_NetRemoteTOD *r)
1653 struct timeval tval;
1656 struct srvsvc_NetRemoteTODInfo *info;
1658 info = talloc(mem_ctx, struct srvsvc_NetRemoteTODInfo);
1659 W_ERROR_HAVE_NO_MEMORY(info);
1661 GetTimeOfDay(&tval);
1667 /* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
1668 info->msecs = (tm.tm_hour*60*60*1000)
1669 + (tm.tm_min*60*1000)
1671 + (tval.tv_usec/1000);
1672 info->hours = tm.tm_hour;
1673 info->mins = tm.tm_min;
1674 info->secs = tm.tm_sec;
1675 info->hunds = tval.tv_usec/10000;
1676 info->timezone = get_time_zone(t)/60;
1677 info->tinterval = 310; /* just return the same as windows */
1678 info->day = tm.tm_mday;
1679 info->month = tm.tm_mon + 1;
1680 info->year = tm.tm_year + 1900;
1681 info->weekday = tm.tm_wday;
1683 *r->out.info = info;
1691 static WERROR dcesrv_srvsvc_NetPathType(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1692 struct srvsvc_NetPathType *r)
1694 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1699 srvsvc_NetPathCanonicalize
1701 static WERROR dcesrv_srvsvc_NetPathCanonicalize(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1702 struct srvsvc_NetPathCanonicalize *r)
1704 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1709 srvsvc_NetPathCompare
1711 static WERROR dcesrv_srvsvc_NetPathCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1712 struct srvsvc_NetPathCompare *r)
1714 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1719 srvsvc_NetNameValidate
1721 static WERROR dcesrv_srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1722 struct srvsvc_NetNameValidate *r)
1726 if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) {
1727 return WERR_INVALID_NAME;
1730 switch (r->in.name_type) {
1739 return WERR_NOT_SUPPORTED;
1741 case 9: /* validate share name */
1743 len = strlen_m(r->in.name);
1744 if ((r->in.flags == 0x0) && (len > 81)) {
1745 return WERR_INVALID_NAME;
1747 if ((r->in.flags == 0x80000000) && (len > 13)) {
1748 return WERR_INVALID_NAME;
1750 if (! dcesrv_common_validate_share_name(mem_ctx, r->in.name)) {
1751 return WERR_INVALID_NAME;
1759 return WERR_NOT_SUPPORTED;
1761 return WERR_INVALID_PARAMETER;
1767 srvsvc_NetPRNameCompare
1769 static WERROR dcesrv_srvsvc_NetPRNameCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1770 struct srvsvc_NetPRNameCompare *r)
1772 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1779 static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1780 struct srvsvc_NetShareEnum *r)
1784 const char **snames;
1785 struct share_context *sctx;
1786 struct share_config *scfg;
1787 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1789 *r->out.totalentries = 0;
1791 /* TODO: - paging of results
1794 nterr = share_get_context_by_name(mem_ctx, lpcfg_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
1795 if (!NT_STATUS_IS_OK(nterr)) {
1796 return ntstatus_to_werror(nterr);
1799 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
1800 if (!NT_STATUS_IS_OK(nterr)) {
1801 return ntstatus_to_werror(nterr);
1804 switch (r->in.info_ctr->level) {
1807 unsigned int i, y = 0;
1809 struct srvsvc_NetShareCtr0 *ctr0;
1811 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
1812 W_ERROR_HAVE_NO_MEMORY(ctr0);
1815 ctr0->count = count;
1818 if (ctr0->count == 0) {
1819 r->out.info_ctr->ctr.ctr0 = ctr0;
1823 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, count);
1824 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
1826 for (i=0; i < count; i++) {
1828 union srvsvc_NetShareInfo info;
1829 enum srvsvc_ShareType type;
1831 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1832 if (!NT_STATUS_IS_OK(nterr)) {
1833 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1834 return WERR_GEN_FAILURE;
1837 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1838 if (type & STYPE_HIDDEN) {
1844 info.info0 = &ctr0->array[y];
1845 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
1846 W_ERROR_NOT_OK_RETURN(status);
1850 talloc_free(snames);
1852 r->out.info_ctr->ctr.ctr0 = ctr0;
1853 *r->out.totalentries = r->out.info_ctr->ctr.ctr0->count;
1859 unsigned int i, y = 0;
1861 struct srvsvc_NetShareCtr1 *ctr1;
1863 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
1864 W_ERROR_HAVE_NO_MEMORY(ctr1);
1867 ctr1->count = count;
1870 if (ctr1->count == 0) {
1871 r->out.info_ctr->ctr.ctr1 = ctr1;
1875 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, count);
1876 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
1878 for (i=0; i < count; i++) {
1880 union srvsvc_NetShareInfo info;
1881 enum srvsvc_ShareType type;
1883 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1884 if (!NT_STATUS_IS_OK(nterr)) {
1885 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1886 return WERR_GEN_FAILURE;
1889 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1890 if (type & STYPE_HIDDEN) {
1896 info.info1 = &ctr1->array[y];
1897 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
1898 W_ERROR_NOT_OK_RETURN(status);
1902 talloc_free(snames);
1904 r->out.info_ctr->ctr.ctr1 = ctr1;
1905 *r->out.totalentries = r->out.info_ctr->ctr.ctr1->count;
1911 unsigned int i, y = 0;
1913 struct srvsvc_NetShareCtr2 *ctr2;
1915 SRVSVC_CHECK_ADMIN_ACCESS;
1917 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
1918 W_ERROR_HAVE_NO_MEMORY(ctr2);
1921 ctr2->count = count;
1924 if (ctr2->count == 0) {
1925 r->out.info_ctr->ctr.ctr2 = ctr2;
1929 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, count);
1930 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
1932 for (i=0; i < count; i++) {
1934 union srvsvc_NetShareInfo info;
1935 enum srvsvc_ShareType type;
1937 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1938 if (!NT_STATUS_IS_OK(nterr)) {
1939 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1940 return WERR_GEN_FAILURE;
1943 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1944 if (type & STYPE_HIDDEN) {
1950 info.info2 = &ctr2->array[y];
1951 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
1952 W_ERROR_NOT_OK_RETURN(status);
1956 talloc_free(snames);
1958 r->out.info_ctr->ctr.ctr2 = ctr2;
1959 *r->out.totalentries = r->out.info_ctr->ctr.ctr2->count;
1965 unsigned int i, y = 0;
1967 struct srvsvc_NetShareCtr502 *ctr502;
1969 SRVSVC_CHECK_ADMIN_ACCESS;
1971 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
1972 W_ERROR_HAVE_NO_MEMORY(ctr502);
1975 ctr502->count = count;
1976 ctr502->array = NULL;
1978 if (ctr502->count == 0) {
1979 r->out.info_ctr->ctr.ctr502 = ctr502;
1983 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, count);
1984 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
1986 for (i=0; i < count; i++) {
1988 union srvsvc_NetShareInfo info;
1989 enum srvsvc_ShareType type;
1991 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1992 if (!NT_STATUS_IS_OK(nterr)) {
1993 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1994 return WERR_GEN_FAILURE;
1997 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1998 if (type & STYPE_HIDDEN) {
2004 info.info502 = &ctr502->array[y];
2005 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
2006 W_ERROR_NOT_OK_RETURN(status);
2010 talloc_free(snames);
2012 r->out.info_ctr->ctr.ctr502 = ctr502;
2013 *r->out.totalentries = r->out.info_ctr->ctr.ctr502->count;
2018 return WERR_INVALID_LEVEL;
2024 srvsvc_NetShareDelStart
2026 static WERROR dcesrv_srvsvc_NetShareDelStart(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2027 struct srvsvc_NetShareDelStart *r)
2029 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2034 srvsvc_NetShareDelCommit
2036 static WERROR dcesrv_srvsvc_NetShareDelCommit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2037 struct srvsvc_NetShareDelCommit *r)
2039 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2044 srvsvc_NetGetFileSecurity
2046 static WERROR dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2047 struct srvsvc_NetGetFileSecurity *r)
2049 struct auth_session_info *session_info =
2050 dcesrv_call_session_info(dce_call);
2051 struct sec_desc_buf *sd_buf;
2052 struct ntvfs_context *ntvfs_ctx = NULL;
2053 struct ntvfs_request *ntvfs_req;
2054 union smb_fileinfo *io;
2057 nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
2058 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2060 ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
2065 W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
2067 sd_buf = talloc(mem_ctx, struct sec_desc_buf);
2068 W_ERROR_HAVE_NO_MEMORY(sd_buf);
2070 io = talloc(mem_ctx, union smb_fileinfo);
2071 W_ERROR_HAVE_NO_MEMORY(io);
2073 io->query_secdesc.level = RAW_FILEINFO_SEC_DESC;
2074 io->query_secdesc.in.file.path = r->in.file;
2075 io->query_secdesc.in.secinfo_flags = r->in.securityinformation;
2077 nt_status = ntvfs_qpathinfo(ntvfs_req, io);
2078 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2080 sd_buf->sd = io->query_secdesc.out.sd;
2082 *r->out.sd_buf = sd_buf;
2088 srvsvc_NetSetFileSecurity
2090 static WERROR dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2091 struct srvsvc_NetSetFileSecurity *r)
2093 struct auth_session_info *session_info =
2094 dcesrv_call_session_info(dce_call);
2095 struct ntvfs_context *ntvfs_ctx;
2096 struct ntvfs_request *ntvfs_req;
2097 union smb_setfileinfo *io;
2100 nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
2101 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2103 ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
2108 W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
2110 io = talloc(mem_ctx, union smb_setfileinfo);
2111 W_ERROR_HAVE_NO_MEMORY(io);
2113 io->set_secdesc.level = RAW_SFILEINFO_SEC_DESC;
2114 io->set_secdesc.in.file.path = r->in.file;
2115 io->set_secdesc.in.secinfo_flags = r->in.securityinformation;
2116 io->set_secdesc.in.sd = r->in.sd_buf->sd;
2118 nt_status = ntvfs_setpathinfo(ntvfs_req, io);
2119 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2126 srvsvc_NetServerTransportAddEx
2128 static WERROR dcesrv_srvsvc_NetServerTransportAddEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2129 struct srvsvc_NetServerTransportAddEx *r)
2131 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2136 srvsvc_NetServerSetServiceBitsEx
2138 static WERROR dcesrv_srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2139 struct srvsvc_NetServerSetServiceBitsEx *r)
2141 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2146 srvsvc_NETRDFSGETVERSION
2148 static WERROR dcesrv_srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2149 struct srvsvc_NETRDFSGETVERSION *r)
2151 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2156 srvsvc_NETRDFSCREATELOCALPARTITION
2158 static WERROR dcesrv_srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2159 struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
2161 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2166 srvsvc_NETRDFSDELETELOCALPARTITION
2168 static WERROR dcesrv_srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2169 struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
2171 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2176 srvsvc_NETRDFSSETLOCALVOLUMESTATE
2178 static WERROR dcesrv_srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2179 struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
2181 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2186 srvsvc_NETRDFSSETSERVERINFO
2188 static WERROR dcesrv_srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2189 struct srvsvc_NETRDFSSETSERVERINFO *r)
2191 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2196 srvsvc_NETRDFSCREATEEXITPOINT
2198 static WERROR dcesrv_srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2199 struct srvsvc_NETRDFSCREATEEXITPOINT *r)
2201 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2206 srvsvc_NETRDFSDELETEEXITPOINT
2208 static WERROR dcesrv_srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2209 struct srvsvc_NETRDFSDELETEEXITPOINT *r)
2211 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2216 srvsvc_NETRDFSMODIFYPREFIX
2218 static WERROR dcesrv_srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2219 struct srvsvc_NETRDFSMODIFYPREFIX *r)
2221 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2226 srvsvc_NETRDFSFIXLOCALVOLUME
2228 static WERROR dcesrv_srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2229 struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
2231 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2236 srvsvc_NETRDFSMANAGERREPORTSITEINFO
2238 static WERROR dcesrv_srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2239 struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
2241 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2246 srvsvc_NETRSERVERTRANSPORTDELEX
2248 static WERROR dcesrv_srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2249 struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
2251 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2257 static WERROR dcesrv_srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2258 struct srvsvc_NetShareDel *r)
2261 struct share_context *sctx;
2263 nterr = share_get_context_by_name(mem_ctx, lpcfg_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
2264 if (!NT_STATUS_IS_OK(nterr)) {
2265 return ntstatus_to_werror(nterr);
2268 nterr = share_remove(sctx, r->in.share_name);
2269 if (!NT_STATUS_IS_OK(nterr)) {
2270 return ntstatus_to_werror(nterr);
2277 srvsvc_NetSetServiceBits
2279 static WERROR dcesrv_srvsvc_NetSetServiceBits(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2280 struct srvsvc_NetSetServiceBits *r)
2282 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2286 srvsvc_NETRPRNAMECANONICALIZE
2288 static WERROR dcesrv_srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2289 struct srvsvc_NETRPRNAMECANONICALIZE *r)
2291 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2294 /* include the generated boilerplate */
2295 #include "librpc/gen_ndr/ndr_srvsvc_s.c"