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 "auth/auth.h"
28 #include "libcli/security/security.h"
29 #include "system/time.h"
30 #include "rpc_server/srvsvc/proto.h"
31 #include "param/param.h"
33 #define SRVSVC_CHECK_ADMIN_ACCESS do { \
34 struct security_token *t = dce_call->conn->auth_state.session_info->security_token; \
35 if (!security_token_has_builtin_administrators(t) && \
36 !security_token_has_sid_string(t, SID_BUILTIN_SERVER_OPERATORS)) { \
37 return WERR_ACCESS_DENIED; \
44 static WERROR dcesrv_srvsvc_NetCharDevEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
45 struct srvsvc_NetCharDevEnum *r)
47 *r->out.totalentries = 0;
49 switch (r->in.info_ctr->level) {
51 r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr0);
52 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
54 r->out.info_ctr->ctr.ctr0->count = 0;
55 r->out.info_ctr->ctr.ctr0->array = NULL;
57 return WERR_NOT_SUPPORTED;
60 r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr1);
61 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
63 r->out.info_ctr->ctr.ctr1->count = 0;
64 r->out.info_ctr->ctr.ctr1->array = NULL;
66 return WERR_NOT_SUPPORTED;
69 return WERR_UNKNOWN_LEVEL;
75 srvsvc_NetCharDevGetInfo
77 static WERROR dcesrv_srvsvc_NetCharDevGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
78 struct srvsvc_NetCharDevGetInfo *r)
80 ZERO_STRUCTP(r->out.info);
82 switch (r->in.level) {
85 return WERR_NOT_SUPPORTED;
89 return WERR_NOT_SUPPORTED;
92 return WERR_UNKNOWN_LEVEL;
98 srvsvc_NetCharDevControl
100 static WERROR dcesrv_srvsvc_NetCharDevControl(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
101 struct srvsvc_NetCharDevControl *r)
103 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
108 srvsvc_NetCharDevQEnum
110 static WERROR dcesrv_srvsvc_NetCharDevQEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
111 struct srvsvc_NetCharDevQEnum *r)
113 *r->out.totalentries = 0;
115 switch (r->in.info_ctr->level) {
118 r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr0);
119 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
121 r->out.info_ctr->ctr.ctr0->count = 0;
122 r->out.info_ctr->ctr.ctr0->array = NULL;
124 return WERR_NOT_SUPPORTED;
128 r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr1);
129 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
131 r->out.info_ctr->ctr.ctr1->count = 0;
132 r->out.info_ctr->ctr.ctr1->array = NULL;
134 return WERR_NOT_SUPPORTED;
137 return WERR_UNKNOWN_LEVEL;
143 srvsvc_NetCharDevQGetInfo
145 static WERROR dcesrv_srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
146 struct srvsvc_NetCharDevQGetInfo *r)
148 ZERO_STRUCTP(r->out.info);
150 switch (r->in.level) {
153 return WERR_NOT_SUPPORTED;
157 return WERR_NOT_SUPPORTED;
160 return WERR_UNKNOWN_LEVEL;
166 srvsvc_NetCharDevQSetInfo
168 static WERROR dcesrv_srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
169 struct srvsvc_NetCharDevQSetInfo *r)
171 switch (r->in.level) {
174 if (r->in.parm_error) {
175 r->out.parm_error = r->in.parm_error;
177 return WERR_NOT_SUPPORTED;
181 if (r->in.parm_error) {
182 r->out.parm_error = r->in.parm_error;
184 return WERR_NOT_SUPPORTED;
187 return WERR_UNKNOWN_LEVEL;
193 srvsvc_NetCharDevQPurge
195 static WERROR dcesrv_srvsvc_NetCharDevQPurge(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
196 struct srvsvc_NetCharDevQPurge *r)
198 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
203 srvsvc_NetCharDevQPurgeSelf
205 static WERROR dcesrv_srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
206 struct srvsvc_NetCharDevQPurgeSelf *r)
208 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
215 static WERROR dcesrv_srvsvc_NetConnEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
216 struct srvsvc_NetConnEnum *r)
218 *r->out.totalentries = 0;
220 switch (r->in.info_ctr->level) {
223 r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetConnCtr0);
224 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
226 r->out.info_ctr->ctr.ctr0->count = 0;
227 r->out.info_ctr->ctr.ctr0->array = NULL;
229 return WERR_NOT_SUPPORTED;
233 r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetConnCtr1);
234 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
236 r->out.info_ctr->ctr.ctr1->count = 0;
237 r->out.info_ctr->ctr.ctr1->array = NULL;
239 return WERR_NOT_SUPPORTED;
242 return WERR_UNKNOWN_LEVEL;
250 static WERROR dcesrv_srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
251 struct srvsvc_NetFileEnum *r)
253 *r->out.totalentries = 0;
255 switch (r->in.info_ctr->level) {
258 r->out.info_ctr->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetFileCtr2);
259 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr2);
261 r->out.info_ctr->ctr.ctr2->count = 0;
262 r->out.info_ctr->ctr.ctr2->array = NULL;
264 return WERR_NOT_SUPPORTED;
268 r->out.info_ctr->ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetFileCtr3);
269 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr3);
271 r->out.info_ctr->ctr.ctr3->count = 0;
272 r->out.info_ctr->ctr.ctr3->array = NULL;
274 return WERR_NOT_SUPPORTED;
277 return WERR_UNKNOWN_LEVEL;
283 srvsvc_NetFileGetInfo
285 static WERROR dcesrv_srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
286 struct srvsvc_NetFileGetInfo *r)
288 ZERO_STRUCTP(r->out.info);
290 switch (r->in.level) {
293 return WERR_NOT_SUPPORTED;
297 return WERR_NOT_SUPPORTED;
300 return WERR_UNKNOWN_LEVEL;
308 static WERROR dcesrv_srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
309 struct srvsvc_NetFileClose *r)
311 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
318 static WERROR dcesrv_srvsvc_NetSessEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
319 struct srvsvc_NetSessEnum *r)
321 *r->out.totalentries = 0;
323 switch (r->in.info_ctr->level) {
326 r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetSessCtr0);
327 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
329 r->out.info_ctr->ctr.ctr0->count = 0;
330 r->out.info_ctr->ctr.ctr0->array = NULL;
332 return WERR_NOT_SUPPORTED;
336 r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetSessCtr1);
337 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
339 r->out.info_ctr->ctr.ctr1->count = 0;
340 r->out.info_ctr->ctr.ctr1->array = NULL;
342 return WERR_NOT_SUPPORTED;
346 r->out.info_ctr->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetSessCtr2);
347 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr2);
349 r->out.info_ctr->ctr.ctr2->count = 0;
350 r->out.info_ctr->ctr.ctr2->array = NULL;
352 return WERR_NOT_SUPPORTED;
356 r->out.info_ctr->ctr.ctr10 = talloc(mem_ctx, struct srvsvc_NetSessCtr10);
357 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr10);
359 r->out.info_ctr->ctr.ctr10->count = 0;
360 r->out.info_ctr->ctr.ctr10->array = NULL;
362 return WERR_NOT_SUPPORTED;
366 r->out.info_ctr->ctr.ctr502 = talloc(mem_ctx, struct srvsvc_NetSessCtr502);
367 W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr502);
369 r->out.info_ctr->ctr.ctr502->count = 0;
370 r->out.info_ctr->ctr.ctr502->array = NULL;
372 return WERR_NOT_SUPPORTED;
375 return WERR_UNKNOWN_LEVEL;
383 static WERROR dcesrv_srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
384 struct srvsvc_NetSessDel *r)
386 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
393 static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
394 struct srvsvc_NetShareAdd *r)
396 switch (r->in.level) {
399 if (r->in.parm_error) {
400 r->out.parm_error = r->in.parm_error;
402 return WERR_NOT_SUPPORTED;
406 if (r->in.parm_error) {
407 r->out.parm_error = r->in.parm_error;
409 return WERR_NOT_SUPPORTED;
414 struct share_info *info;
415 struct share_context *sctx;
416 unsigned int count = 8;
419 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
420 if (!NT_STATUS_IS_OK(nterr)) {
421 return ntstatus_to_werror(nterr);
424 /* there are no more than 8 options in struct srvsvc_NetShareInfo2 */
425 info = talloc_array(mem_ctx, struct share_info, count);
426 W_ERROR_HAVE_NO_MEMORY(info);
430 info[i].name = SHARE_TYPE;
431 info[i].type = SHARE_INFO_STRING;
432 switch (r->in.info->info2->type) {
434 info[i].value = talloc_strdup(info, "DISK");
437 info[i].value = talloc_strdup(info, "PRINTER");
440 info[i].value = talloc_strdup(info, "IPC");
443 return WERR_INVALID_PARAM;
445 W_ERROR_HAVE_NO_MEMORY(info[i].value);
448 if (r->in.info->info2->path && r->in.info->info2->path[0]) {
449 info[i].name = SHARE_PATH;
450 info[i].type = SHARE_INFO_STRING;
452 /* Windows will send a path in a form of C:\example\path */
453 if (r->in.info->info2->path[1] == ':') {
454 info[i].value = talloc_strdup(info, &r->in.info->info2->path[2]);
456 /* very strange let's try to set as is */
457 info[i].value = talloc_strdup(info, r->in.info->info2->path);
459 W_ERROR_HAVE_NO_MEMORY(info[i].value);
460 all_string_sub((char *)info[i].value, "\\", "/", 0);
465 if (r->in.info->info2->comment && r->in.info->info2->comment[0]) {
466 info[i].name = SHARE_COMMENT;
467 info[i].type = SHARE_INFO_STRING;
468 info[i].value = talloc_strdup(info, r->in.info->info2->comment);
469 W_ERROR_HAVE_NO_MEMORY(info[i].value);
474 if (r->in.info->info2->password && r->in.info->info2->password[0]) {
475 info[i].name = SHARE_PASSWORD;
476 info[i].type = SHARE_INFO_STRING;
477 info[i].value = talloc_strdup(info, r->in.info->info2->password);
478 W_ERROR_HAVE_NO_MEMORY(info[i].value);
483 info[i].name = SHARE_MAX_CONNECTIONS;
484 info[i].type = SHARE_INFO_INT;
485 info[i].value = talloc(info, int);
486 *((int *)info[i].value) = r->in.info->info2->max_users;
489 /* TODO: security descriptor */
491 nterr = share_create(sctx, r->in.info->info2->name, info, i);
492 if (!NT_STATUS_IS_OK(nterr)) {
493 return ntstatus_to_werror(nterr);
496 if (r->in.parm_error) {
497 r->out.parm_error = r->in.parm_error;
504 if (r->in.parm_error) {
505 r->out.parm_error = r->in.parm_error;
507 return WERR_NOT_SUPPORTED;
512 struct share_info *info;
513 struct share_context *sctx;
514 unsigned int count = 10;
517 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
518 if (!NT_STATUS_IS_OK(nterr)) {
519 return ntstatus_to_werror(nterr);
522 /* there are no more than 10 options in struct srvsvc_NetShareInfo502 */
523 info = talloc_array(mem_ctx, struct share_info, count);
524 W_ERROR_HAVE_NO_MEMORY(info);
528 info[i].name = SHARE_TYPE;
529 info[i].type = SHARE_INFO_STRING;
530 switch (r->in.info->info502->type) {
532 info[i].value = talloc_strdup(info, "DISK");
535 info[i].value = talloc_strdup(info, "PRINTER");
538 info[i].value = talloc_strdup(info, "IPC");
541 return WERR_INVALID_PARAM;
543 W_ERROR_HAVE_NO_MEMORY(info[i].value);
546 if (r->in.info->info502->path && r->in.info->info502->path[0]) {
547 info[i].name = SHARE_PATH;
548 info[i].type = SHARE_INFO_STRING;
550 /* Windows will send a path in a form of C:\example\path */
551 if (r->in.info->info502->path[1] == ':') {
552 info[i].value = talloc_strdup(info, &r->in.info->info502->path[2]);
554 /* very strange let's try to set as is */
555 info[i].value = talloc_strdup(info, r->in.info->info502->path);
557 W_ERROR_HAVE_NO_MEMORY(info[i].value);
558 all_string_sub((char *)info[i].value, "\\", "/", 0);
563 if (r->in.info->info502->comment && r->in.info->info502->comment[0]) {
564 info[i].name = SHARE_COMMENT;
565 info[i].type = SHARE_INFO_STRING;
566 info[i].value = talloc_strdup(info, r->in.info->info502->comment);
567 W_ERROR_HAVE_NO_MEMORY(info[i].value);
572 if (r->in.info->info502->password && r->in.info->info502->password[0]) {
573 info[i].name = SHARE_PASSWORD;
574 info[i].type = SHARE_INFO_STRING;
575 info[i].value = talloc_strdup(info, r->in.info->info502->password);
576 W_ERROR_HAVE_NO_MEMORY(info[i].value);
581 info[i].name = SHARE_MAX_CONNECTIONS;
582 info[i].type = SHARE_INFO_INT;
583 info[i].value = talloc(info, int);
584 *((int *)info[i].value) = r->in.info->info502->max_users;
587 /* TODO: security descriptor */
589 nterr = share_create(sctx, r->in.info->info502->name, info, i);
590 if (!NT_STATUS_IS_OK(nterr)) {
591 return ntstatus_to_werror(nterr);
594 if (r->in.parm_error) {
595 r->out.parm_error = r->in.parm_error;
601 return WERR_UNKNOWN_LEVEL;
605 static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
606 struct share_config *scfg, uint32_t level,
607 union srvsvc_NetShareInfo *info)
609 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
614 info->info0->name = talloc_strdup(mem_ctx, scfg->name);
615 W_ERROR_HAVE_NO_MEMORY(info->info0->name);
621 info->info1->name = talloc_strdup(mem_ctx, scfg->name);
622 W_ERROR_HAVE_NO_MEMORY(info->info1->name);
623 info->info1->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
624 info->info1->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
625 W_ERROR_HAVE_NO_MEMORY(info->info1->comment);
631 info->info2->name = talloc_strdup(mem_ctx, scfg->name);
632 W_ERROR_HAVE_NO_MEMORY(info->info2->name);
633 info->info2->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
634 info->info2->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
635 W_ERROR_HAVE_NO_MEMORY(info->info2->comment);
636 info->info2->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
637 info->info2->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
638 info->info2->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
639 info->info2->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
640 W_ERROR_HAVE_NO_MEMORY(info->info2->path);
641 info->info2->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
647 info->info501->name = talloc_strdup(mem_ctx, scfg->name);
648 W_ERROR_HAVE_NO_MEMORY(info->info501->name);
649 info->info501->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
650 info->info501->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
651 W_ERROR_HAVE_NO_MEMORY(info->info501->comment);
652 info->info501->csc_policy = share_int_option(scfg, SHARE_CSC_POLICY, SHARE_CSC_POLICY_DEFAULT);
658 info->info502->name = talloc_strdup(mem_ctx, scfg->name);
659 W_ERROR_HAVE_NO_MEMORY(info->info502->name);
660 info->info502->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
661 info->info502->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
662 W_ERROR_HAVE_NO_MEMORY(info->info502->comment);
663 info->info502->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
664 info->info502->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
665 info->info502->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
666 info->info502->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
667 W_ERROR_HAVE_NO_MEMORY(info->info502->path);
668 info->info502->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
669 info->info502->sd_buf.sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, scfg);
675 info->info1005->dfs_flags = dcesrv_common_get_share_dfs_flags(mem_ctx, dce_ctx, scfg);
680 return WERR_UNKNOWN_LEVEL;
685 srvsvc_NetShareEnumAll
687 static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
688 struct srvsvc_NetShareEnumAll *r)
693 struct share_context *sctx;
694 struct share_config *scfg;
696 *r->out.totalentries = 0;
698 /* TODO: - paging of results
701 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
702 if (!NT_STATUS_IS_OK(nterr)) {
703 return ntstatus_to_werror(nterr);
706 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
707 if (!NT_STATUS_IS_OK(nterr)) {
708 return ntstatus_to_werror(nterr);
711 switch (r->in.info_ctr->level) {
715 struct srvsvc_NetShareCtr0 *ctr0;
717 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
718 W_ERROR_HAVE_NO_MEMORY(ctr0);
720 ctr0->count = numshares;
723 if (ctr0->count == 0) {
724 r->out.info_ctr->ctr.ctr0 = ctr0;
728 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, ctr0->count);
729 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
731 for (i = 0; i < ctr0->count; i++) {
733 union srvsvc_NetShareInfo info;
735 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
736 if (!NT_STATUS_IS_OK(nterr)) {
737 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
738 return WERR_GENERAL_FAILURE;
740 info.info0 = &ctr0->array[i];
741 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
742 if (!W_ERROR_IS_OK(status)) {
749 r->out.info_ctr->ctr.ctr0 = ctr0;
750 *r->out.totalentries = r->out.info_ctr->ctr.ctr0->count;
756 struct srvsvc_NetShareCtr1 *ctr1;
758 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
759 W_ERROR_HAVE_NO_MEMORY(ctr1);
761 ctr1->count = numshares;
764 if (ctr1->count == 0) {
765 r->out.info_ctr->ctr.ctr1 = ctr1;
769 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, ctr1->count);
770 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
772 for (i=0; i < ctr1->count; i++) {
774 union srvsvc_NetShareInfo info;
776 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
777 if (!NT_STATUS_IS_OK(nterr)) {
778 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
779 return WERR_GENERAL_FAILURE;
781 info.info1 = &ctr1->array[i];
782 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
783 if (!W_ERROR_IS_OK(status)) {
790 r->out.info_ctr->ctr.ctr1 = ctr1;
791 *r->out.totalentries = r->out.info_ctr->ctr.ctr1->count;
798 struct srvsvc_NetShareCtr2 *ctr2;
800 SRVSVC_CHECK_ADMIN_ACCESS;
802 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
803 W_ERROR_HAVE_NO_MEMORY(ctr2);
805 ctr2->count = numshares;
808 if (ctr2->count == 0) {
809 r->out.info_ctr->ctr.ctr2 = ctr2;
813 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, ctr2->count);
814 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
816 for (i=0; i < ctr2->count; i++) {
818 union srvsvc_NetShareInfo info;
820 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
821 if (!NT_STATUS_IS_OK(nterr)) {
822 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
823 return WERR_GENERAL_FAILURE;
825 info.info2 = &ctr2->array[i];
826 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
827 if (!W_ERROR_IS_OK(status)) {
834 r->out.info_ctr->ctr.ctr2 = ctr2;
835 *r->out.totalentries = r->out.info_ctr->ctr.ctr2->count;
842 struct srvsvc_NetShareCtr501 *ctr501;
844 SRVSVC_CHECK_ADMIN_ACCESS;
846 ctr501 = talloc(mem_ctx, struct srvsvc_NetShareCtr501);
847 W_ERROR_HAVE_NO_MEMORY(ctr501);
849 ctr501->count = numshares;
850 ctr501->array = NULL;
852 if (ctr501->count == 0) {
853 r->out.info_ctr->ctr.ctr501 = ctr501;
857 ctr501->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo501, ctr501->count);
858 W_ERROR_HAVE_NO_MEMORY(ctr501->array);
860 for (i=0; i < ctr501->count; i++) {
862 union srvsvc_NetShareInfo info;
864 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
865 if (!NT_STATUS_IS_OK(nterr)) {
866 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
867 return WERR_GENERAL_FAILURE;
869 info.info501 = &ctr501->array[i];
870 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
871 if (!W_ERROR_IS_OK(status)) {
878 r->out.info_ctr->ctr.ctr501 = ctr501;
879 *r->out.totalentries = r->out.info_ctr->ctr.ctr501->count;
886 struct srvsvc_NetShareCtr502 *ctr502;
888 SRVSVC_CHECK_ADMIN_ACCESS;
890 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
891 W_ERROR_HAVE_NO_MEMORY(ctr502);
893 ctr502->count = numshares;
894 ctr502->array = NULL;
896 if (ctr502->count == 0) {
897 r->out.info_ctr->ctr.ctr502 = ctr502;
901 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, ctr502->count);
902 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
904 for (i=0; i < ctr502->count; i++) {
906 union srvsvc_NetShareInfo info;
908 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
909 if (!NT_STATUS_IS_OK(nterr)) {
910 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
911 return WERR_GENERAL_FAILURE;
913 info.info502 = &ctr502->array[i];
914 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
915 if (!W_ERROR_IS_OK(status)) {
922 r->out.info_ctr->ctr.ctr502 = ctr502;
923 *r->out.totalentries = r->out.info_ctr->ctr.ctr502->count;
928 return WERR_UNKNOWN_LEVEL;
934 srvsvc_NetShareGetInfo
936 static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
937 struct srvsvc_NetShareGetInfo *r)
940 struct share_context *sctx = NULL;
941 struct share_config *scfg = NULL;
943 ZERO_STRUCTP(r->out.info);
945 /* TODO: - access check
948 if (strcmp("", r->in.share_name) == 0) {
949 return WERR_INVALID_PARAM;
952 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
953 if (!NT_STATUS_IS_OK(nterr)) {
954 return ntstatus_to_werror(nterr);
957 nterr = share_get_config(mem_ctx, sctx, r->in.share_name, &scfg);
958 if (!NT_STATUS_IS_OK(nterr)) {
959 return ntstatus_to_werror(nterr);
962 switch (r->in.level) {
966 union srvsvc_NetShareInfo info;
968 info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0);
969 W_ERROR_HAVE_NO_MEMORY(info.info0);
971 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
972 if (!W_ERROR_IS_OK(status)) {
976 r->out.info->info0 = info.info0;
982 union srvsvc_NetShareInfo info;
984 info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1);
985 W_ERROR_HAVE_NO_MEMORY(info.info1);
987 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
988 if (!W_ERROR_IS_OK(status)) {
992 r->out.info->info1 = info.info1;
998 union srvsvc_NetShareInfo info;
1000 SRVSVC_CHECK_ADMIN_ACCESS;
1002 info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
1003 W_ERROR_HAVE_NO_MEMORY(info.info2);
1005 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1006 if (!W_ERROR_IS_OK(status)) {
1010 r->out.info->info2 = info.info2;
1016 union srvsvc_NetShareInfo info;
1018 info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501);
1019 W_ERROR_HAVE_NO_MEMORY(info.info501);
1021 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1022 if (!W_ERROR_IS_OK(status)) {
1026 r->out.info->info501 = info.info501;
1032 union srvsvc_NetShareInfo info;
1034 SRVSVC_CHECK_ADMIN_ACCESS;
1036 info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502);
1037 W_ERROR_HAVE_NO_MEMORY(info.info502);
1039 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1040 if (!W_ERROR_IS_OK(status)) {
1044 r->out.info->info502 = info.info502;
1050 union srvsvc_NetShareInfo info;
1052 info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005);
1053 W_ERROR_HAVE_NO_MEMORY(info.info1005);
1055 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1056 if (!W_ERROR_IS_OK(status)) {
1060 r->out.info->info1005 = info.info1005;
1064 return WERR_UNKNOWN_LEVEL;
1068 static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count,
1069 const char *share_name, int level,
1072 const char *comment,
1073 const char *password,
1074 enum srvsvc_ShareType type,
1076 uint32_t csc_policy,
1077 struct security_descriptor *sd)
1082 info[i].name = SHARE_CSC_POLICY;
1083 info[i].type = SHARE_INFO_INT;
1084 info[i].value = talloc(info, int);
1085 *((int *)info[i].value) = csc_policy;
1092 /* TODO: check if unknown is csc_policy */
1094 /* TODO: security descriptor */
1097 if (path && path[0]) {
1098 info[i].name = SHARE_PATH;
1099 info[i].type = SHARE_INFO_STRING;
1101 /* Windows will send a path in a form of C:\example\path */
1102 if (path[1] == ':') {
1103 info[i].value = talloc_strdup(info, &path[2]);
1105 /* very strange let's try to set as is */
1106 info[i].value = talloc_strdup(info, path);
1108 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1109 all_string_sub((char *)info[i].value, "\\", "/", 0);
1114 if (password && password[0]) {
1115 info[i].name = SHARE_PASSWORD;
1116 info[i].type = SHARE_INFO_STRING;
1117 info[i].value = talloc_strdup(info, password);
1118 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1123 info[i].name = SHARE_MAX_CONNECTIONS;
1124 info[i].type = SHARE_INFO_INT;
1125 info[i].value = talloc(info, int);
1126 *((int *)info[i].value) = max_users;
1131 info[i].name = SHARE_TYPE;
1132 info[i].type = SHARE_INFO_STRING;
1135 info[i].value = talloc_strdup(info, "DISK");
1138 info[i].value = talloc_strdup(info, "PRINTER");
1141 info[i].value = talloc_strdup(info, "IPC");
1144 return WERR_INVALID_PARAM;
1146 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1151 info[i].name = SHARE_COMMENT;
1152 info[i].type = SHARE_INFO_STRING;
1153 info[i].value = talloc_strdup(info, comment);
1154 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1160 strcasecmp(share_name, name) != 0) {
1161 info[i].name = SHARE_NAME;
1162 info[i].type = SHARE_INFO_STRING;
1163 info[i].value = talloc_strdup(info, name);
1164 W_ERROR_HAVE_NO_MEMORY(info[i].value);
1171 return WERR_UNKNOWN_LEVEL;
1180 srvsvc_NetShareSetInfo
1182 static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1183 struct srvsvc_NetShareSetInfo *r)
1187 struct share_context *sctx = NULL;
1188 struct share_info *info;
1191 /* TODO: - access check
1194 /* there are no more than 10 options in all struct srvsvc_NetShareInfoXXX */
1195 info = talloc_array(mem_ctx, struct share_info, 10);
1196 W_ERROR_HAVE_NO_MEMORY(info);
1198 if (strcmp("", r->in.share_name) == 0) {
1199 return WERR_INVALID_PARAM;
1202 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
1203 if (!NT_STATUS_IS_OK(nterr)) {
1204 return ntstatus_to_werror(nterr);
1207 switch (r->in.level) {
1210 status = dcesrv_srvsvc_fill_share_info(info, &count,
1211 r->in.share_name, r->in.level,
1212 r->in.info->info0->name,
1220 if (!W_ERROR_EQUAL(status, WERR_OK)) {
1227 status = dcesrv_srvsvc_fill_share_info(info, &count,
1228 r->in.share_name, r->in.level,
1229 r->in.info->info1->name,
1231 r->in.info->info1->comment,
1233 r->in.info->info1->type,
1237 if (!W_ERROR_EQUAL(status, WERR_OK)) {
1244 status = dcesrv_srvsvc_fill_share_info(info, &count,
1245 r->in.share_name, r->in.level,
1246 r->in.info->info2->name,
1247 r->in.info->info2->path,
1248 r->in.info->info2->comment,
1249 r->in.info->info2->password,
1250 r->in.info->info2->type,
1251 r->in.info->info2->max_users,
1254 if (!W_ERROR_EQUAL(status, WERR_OK)) {
1261 status = dcesrv_srvsvc_fill_share_info(info, &count,
1262 r->in.share_name, r->in.level,
1263 r->in.info->info501->name,
1265 r->in.info->info501->comment,
1267 r->in.info->info501->type,
1269 r->in.info->info501->csc_policy,
1271 if (!W_ERROR_EQUAL(status, WERR_OK)) {
1278 status = dcesrv_srvsvc_fill_share_info(info, &count,
1279 r->in.share_name, r->in.level,
1280 r->in.info->info502->name,
1281 r->in.info->info502->path,
1282 r->in.info->info502->comment,
1283 r->in.info->info502->password,
1284 r->in.info->info502->type,
1285 r->in.info->info502->max_users,
1287 r->in.info->info502->sd_buf.sd);
1288 if (!W_ERROR_EQUAL(status, WERR_OK)) {
1295 status = dcesrv_srvsvc_fill_share_info(info, &count,
1296 r->in.share_name, r->in.level,
1299 r->in.info->info1004->comment,
1305 if (!W_ERROR_EQUAL(status, WERR_OK)) {
1312 /* r->in.info.dfs_flags; */
1314 if (r->in.parm_error) {
1315 r->out.parm_error = r->in.parm_error;
1321 return WERR_UNKNOWN_LEVEL;
1324 nterr = share_set(sctx, r->in.share_name, info, count);
1325 if (!NT_STATUS_IS_OK(nterr)) {
1326 return ntstatus_to_werror(nterr);
1329 if (r->in.parm_error) {
1330 r->out.parm_error = r->in.parm_error;
1338 srvsvc_NetShareDelSticky
1340 static WERROR dcesrv_srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1341 struct srvsvc_NetShareDelSticky *r)
1343 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1348 srvsvc_NetShareCheck
1350 static WERROR dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1351 struct srvsvc_NetShareCheck *r)
1354 struct share_context *sctx = NULL;
1355 struct share_config *scfg = NULL;
1363 /* TODO: - access check
1366 if (strcmp("", r->in.device_name) == 0) {
1367 *r->out.type = STYPE_IPC;
1371 /* copy the path skipping C:\ */
1372 if (strncasecmp(r->in.device_name, "C:", 2) == 0) {
1373 device = talloc_strdup(mem_ctx, &r->in.device_name[2]);
1375 /* no chance we have a share that doesn't start with C:\ */
1376 return WERR_DEVICE_NOT_SHARED;
1378 all_string_sub(device, "\\", "/", 0);
1380 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
1381 if (!NT_STATUS_IS_OK(nterr)) {
1382 return ntstatus_to_werror(nterr);
1385 nterr = share_list_all(mem_ctx, sctx, &count, &names);
1386 if (!NT_STATUS_IS_OK(nterr)) {
1387 return ntstatus_to_werror(nterr);
1390 for (i = 0; i < count; i++) {
1394 nterr = share_get_config(mem_ctx, sctx, names[i], &scfg);
1395 if (!NT_STATUS_IS_OK(nterr)) {
1396 return ntstatus_to_werror(nterr);
1398 path = share_string_option(scfg, SHARE_PATH, NULL);
1399 if (!path) continue;
1401 if (strcmp(device, path) == 0) {
1402 type = share_string_option(scfg, SHARE_TYPE, NULL);
1403 if (!type) continue;
1405 if (strcmp(type, "DISK") == 0) {
1406 *r->out.type = STYPE_DISKTREE;
1410 if (strcmp(type, "IPC") == 0) {
1411 *r->out.type = STYPE_IPC;
1415 if (strcmp(type, "PRINTER") == 0) {
1416 *r->out.type = STYPE_PRINTQ;
1422 return WERR_DEVICE_NOT_SHARED;
1427 srvsvc_NetSrvGetInfo
1429 static WERROR dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1430 struct srvsvc_NetSrvGetInfo *r)
1432 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1433 struct dcerpc_server_info *server_info = lp_dcerpc_server_info(mem_ctx, dce_ctx->lp_ctx);
1435 ZERO_STRUCTP(r->out.info);
1437 switch (r->in.level) {
1440 struct srvsvc_NetSrvInfo100 *info100;
1442 info100 = talloc(mem_ctx, struct srvsvc_NetSrvInfo100);
1443 W_ERROR_HAVE_NO_MEMORY(info100);
1445 info100->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1446 info100->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1447 W_ERROR_HAVE_NO_MEMORY(info100->server_name);
1449 r->out.info->info100 = info100;
1454 struct srvsvc_NetSrvInfo101 *info101;
1456 info101 = talloc(mem_ctx, struct srvsvc_NetSrvInfo101);
1457 W_ERROR_HAVE_NO_MEMORY(info101);
1459 info101->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1460 info101->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1461 W_ERROR_HAVE_NO_MEMORY(info101->server_name);
1463 info101->version_major = server_info->version_major;
1464 info101->version_minor = server_info->version_minor;
1465 info101->server_type = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
1466 info101->comment = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
1467 W_ERROR_HAVE_NO_MEMORY(info101->comment);
1469 r->out.info->info101 = info101;
1474 struct srvsvc_NetSrvInfo102 *info102;
1476 info102 = talloc(mem_ctx, struct srvsvc_NetSrvInfo102);
1477 W_ERROR_HAVE_NO_MEMORY(info102);
1479 info102->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1480 info102->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1481 W_ERROR_HAVE_NO_MEMORY(info102->server_name);
1483 info102->version_major = server_info->version_major;
1484 info102->version_minor = server_info->version_minor;
1485 info102->server_type = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
1486 info102->comment = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
1487 W_ERROR_HAVE_NO_MEMORY(info102->comment);
1489 info102->users = dcesrv_common_get_users(mem_ctx, dce_ctx);
1490 info102->disc = dcesrv_common_get_disc(mem_ctx, dce_ctx);
1491 info102->hidden = dcesrv_common_get_hidden(mem_ctx, dce_ctx);
1492 info102->announce = dcesrv_common_get_announce(mem_ctx, dce_ctx);
1493 info102->anndelta = dcesrv_common_get_anndelta(mem_ctx, dce_ctx);
1494 info102->licenses = dcesrv_common_get_licenses(mem_ctx, dce_ctx);
1495 info102->userpath = dcesrv_common_get_userpath(mem_ctx, dce_ctx);
1496 W_ERROR_HAVE_NO_MEMORY(info102->userpath);
1498 r->out.info->info102 = info102;
1502 return WERR_UNKNOWN_LEVEL;
1508 srvsvc_NetSrvSetInfo
1510 static WERROR dcesrv_srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1511 struct srvsvc_NetSrvSetInfo *r)
1513 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1520 static WERROR dcesrv_srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1521 struct srvsvc_NetDiskEnum *r)
1523 r->out.info->disks = NULL;
1524 r->out.info->count = 0;
1525 *r->out.totalentries = 0;
1527 switch (r->in.level) {
1530 /* we can safely hardcode the reply and report we have only one disk (C:) */
1531 /* for some reason Windows wants 2 entries with the second being empty */
1532 r->out.info->disks = talloc_array(mem_ctx, struct srvsvc_NetDiskInfo0, 2);
1533 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks);
1534 r->out.info->count = 2;
1536 r->out.info->disks[0].disk = talloc_strdup(mem_ctx, "C:");
1537 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[0].disk);
1539 r->out.info->disks[1].disk = talloc_strdup(mem_ctx, "");
1540 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[1].disk);
1542 *r->out.totalentries = 1;
1543 r->out.resume_handle = r->in.resume_handle;
1548 return WERR_UNKNOWN_LEVEL;
1554 srvsvc_NetServerStatisticsGet
1556 static WERROR dcesrv_srvsvc_NetServerStatisticsGet(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1557 struct srvsvc_NetServerStatisticsGet *r)
1559 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1564 srvsvc_NetTransportAdd
1566 static WERROR dcesrv_srvsvc_NetTransportAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1567 struct srvsvc_NetTransportAdd *r)
1569 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1574 srvsvc_NetTransportEnum
1576 static WERROR dcesrv_srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1577 struct srvsvc_NetTransportEnum *r)
1579 r->out.transports->level = r->in.transports->level;
1580 *r->out.totalentries = 0;
1581 if (r->out.resume_handle) {
1582 *r->out.resume_handle = 0;
1585 switch (r->in.transports->level) {
1588 r->out.transports->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetTransportCtr0);
1589 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr0);
1591 r->out.transports->ctr.ctr0->count = 0;
1592 r->out.transports->ctr.ctr0->array = NULL;
1594 return WERR_NOT_SUPPORTED;
1598 r->out.transports->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetTransportCtr1);
1599 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr1);
1601 r->out.transports->ctr.ctr1->count = 0;
1602 r->out.transports->ctr.ctr1->array = NULL;
1604 return WERR_NOT_SUPPORTED;
1608 r->out.transports->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetTransportCtr2);
1609 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr2);
1611 r->out.transports->ctr.ctr2->count = 0;
1612 r->out.transports->ctr.ctr2->array = NULL;
1614 return WERR_NOT_SUPPORTED;
1618 r->out.transports->ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetTransportCtr3);
1619 W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr3);
1621 r->out.transports->ctr.ctr3->count = 0;
1622 r->out.transports->ctr.ctr3->array = NULL;
1624 return WERR_NOT_SUPPORTED;
1627 return WERR_UNKNOWN_LEVEL;
1632 srvsvc_NetTransportDel
1634 static WERROR dcesrv_srvsvc_NetTransportDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1635 struct srvsvc_NetTransportDel *r)
1637 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1644 static WERROR dcesrv_srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1645 struct srvsvc_NetRemoteTOD *r)
1647 struct timeval tval;
1650 struct srvsvc_NetRemoteTODInfo *info;
1652 info = talloc(mem_ctx, struct srvsvc_NetRemoteTODInfo);
1653 W_ERROR_HAVE_NO_MEMORY(info);
1655 GetTimeOfDay(&tval);
1661 /* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
1662 info->msecs = (tm.tm_hour*60*60*1000)
1663 + (tm.tm_min*60*1000)
1665 + (tval.tv_usec/1000);
1666 info->hours = tm.tm_hour;
1667 info->mins = tm.tm_min;
1668 info->secs = tm.tm_sec;
1669 info->hunds = tval.tv_usec/10000;
1670 info->timezone = get_time_zone(t)/60;
1671 info->tinterval = 310; /* just return the same as windows */
1672 info->day = tm.tm_mday;
1673 info->month = tm.tm_mon + 1;
1674 info->year = tm.tm_year + 1900;
1675 info->weekday = tm.tm_wday;
1677 *r->out.info = info;
1685 static WERROR dcesrv_srvsvc_NetPathType(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1686 struct srvsvc_NetPathType *r)
1688 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1693 srvsvc_NetPathCanonicalize
1695 static WERROR dcesrv_srvsvc_NetPathCanonicalize(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1696 struct srvsvc_NetPathCanonicalize *r)
1698 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1703 srvsvc_NetPathCompare
1705 static WERROR dcesrv_srvsvc_NetPathCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1706 struct srvsvc_NetPathCompare *r)
1708 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1713 srvsvc_NetNameValidate
1715 static WERROR dcesrv_srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1716 struct srvsvc_NetNameValidate *r)
1720 if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) {
1721 return WERR_INVALID_NAME;
1724 switch (r->in.name_type) {
1733 return WERR_NOT_SUPPORTED;
1735 case 9: /* validate share name */
1737 len = strlen_m(r->in.name);
1738 if ((r->in.flags == 0x0) && (len > 81)) {
1739 return WERR_INVALID_NAME;
1741 if ((r->in.flags == 0x80000000) && (len > 13)) {
1742 return WERR_INVALID_NAME;
1744 if (! dcesrv_common_validate_share_name(mem_ctx, r->in.name)) {
1745 return WERR_INVALID_NAME;
1753 return WERR_NOT_SUPPORTED;
1755 return WERR_INVALID_PARAM;
1761 srvsvc_NetPRNameCompare
1763 static WERROR dcesrv_srvsvc_NetPRNameCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1764 struct srvsvc_NetPRNameCompare *r)
1766 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1773 static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1774 struct srvsvc_NetShareEnum *r)
1778 const char **snames;
1779 struct share_context *sctx;
1780 struct share_config *scfg;
1781 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1783 *r->out.totalentries = 0;
1785 /* TODO: - paging of results
1788 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
1789 if (!NT_STATUS_IS_OK(nterr)) {
1790 return ntstatus_to_werror(nterr);
1793 nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
1794 if (!NT_STATUS_IS_OK(nterr)) {
1795 return ntstatus_to_werror(nterr);
1798 switch (r->in.info_ctr->level) {
1801 unsigned int i, y = 0;
1803 struct srvsvc_NetShareCtr0 *ctr0;
1805 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
1806 W_ERROR_HAVE_NO_MEMORY(ctr0);
1809 ctr0->count = count;
1812 if (ctr0->count == 0) {
1813 r->out.info_ctr->ctr.ctr0 = ctr0;
1817 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, count);
1818 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
1820 for (i=0; i < count; i++) {
1822 union srvsvc_NetShareInfo info;
1823 enum srvsvc_ShareType type;
1825 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1826 if (!NT_STATUS_IS_OK(nterr)) {
1827 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1828 return WERR_GENERAL_FAILURE;
1831 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1832 if (type & STYPE_HIDDEN) {
1838 info.info0 = &ctr0->array[y];
1839 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
1840 W_ERROR_NOT_OK_RETURN(status);
1844 talloc_free(snames);
1846 r->out.info_ctr->ctr.ctr0 = ctr0;
1847 *r->out.totalentries = r->out.info_ctr->ctr.ctr0->count;
1853 unsigned int i, y = 0;
1855 struct srvsvc_NetShareCtr1 *ctr1;
1857 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
1858 W_ERROR_HAVE_NO_MEMORY(ctr1);
1861 ctr1->count = count;
1864 if (ctr1->count == 0) {
1865 r->out.info_ctr->ctr.ctr1 = ctr1;
1869 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, count);
1870 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
1872 for (i=0; i < count; i++) {
1874 union srvsvc_NetShareInfo info;
1875 enum srvsvc_ShareType type;
1877 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1878 if (!NT_STATUS_IS_OK(nterr)) {
1879 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1880 return WERR_GENERAL_FAILURE;
1883 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1884 if (type & STYPE_HIDDEN) {
1890 info.info1 = &ctr1->array[y];
1891 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
1892 W_ERROR_NOT_OK_RETURN(status);
1896 talloc_free(snames);
1898 r->out.info_ctr->ctr.ctr1 = ctr1;
1899 *r->out.totalentries = r->out.info_ctr->ctr.ctr1->count;
1905 unsigned int i, y = 0;
1907 struct srvsvc_NetShareCtr2 *ctr2;
1909 SRVSVC_CHECK_ADMIN_ACCESS;
1911 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
1912 W_ERROR_HAVE_NO_MEMORY(ctr2);
1915 ctr2->count = count;
1918 if (ctr2->count == 0) {
1919 r->out.info_ctr->ctr.ctr2 = ctr2;
1923 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, count);
1924 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
1926 for (i=0; i < count; i++) {
1928 union srvsvc_NetShareInfo info;
1929 enum srvsvc_ShareType type;
1931 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1932 if (!NT_STATUS_IS_OK(nterr)) {
1933 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1934 return WERR_GENERAL_FAILURE;
1937 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1938 if (type & STYPE_HIDDEN) {
1944 info.info2 = &ctr2->array[y];
1945 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
1946 W_ERROR_NOT_OK_RETURN(status);
1950 talloc_free(snames);
1952 r->out.info_ctr->ctr.ctr2 = ctr2;
1953 *r->out.totalentries = r->out.info_ctr->ctr.ctr2->count;
1959 unsigned int i, y = 0;
1961 struct srvsvc_NetShareCtr502 *ctr502;
1963 SRVSVC_CHECK_ADMIN_ACCESS;
1965 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
1966 W_ERROR_HAVE_NO_MEMORY(ctr502);
1969 ctr502->count = count;
1970 ctr502->array = NULL;
1972 if (ctr502->count == 0) {
1973 r->out.info_ctr->ctr.ctr502 = ctr502;
1977 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, count);
1978 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
1980 for (i=0; i < count; i++) {
1982 union srvsvc_NetShareInfo info;
1983 enum srvsvc_ShareType type;
1985 nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1986 if (!NT_STATUS_IS_OK(nterr)) {
1987 DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1988 return WERR_GENERAL_FAILURE;
1991 type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1992 if (type & STYPE_HIDDEN) {
1998 info.info502 = &ctr502->array[y];
1999 status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
2000 W_ERROR_NOT_OK_RETURN(status);
2004 talloc_free(snames);
2006 r->out.info_ctr->ctr.ctr502 = ctr502;
2007 *r->out.totalentries = r->out.info_ctr->ctr.ctr502->count;
2012 return WERR_UNKNOWN_LEVEL;
2018 srvsvc_NetShareDelStart
2020 static WERROR dcesrv_srvsvc_NetShareDelStart(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2021 struct srvsvc_NetShareDelStart *r)
2023 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2028 srvsvc_NetShareDelCommit
2030 static WERROR dcesrv_srvsvc_NetShareDelCommit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2031 struct srvsvc_NetShareDelCommit *r)
2033 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2038 srvsvc_NetGetFileSecurity
2040 static WERROR dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2041 struct srvsvc_NetGetFileSecurity *r)
2043 struct sec_desc_buf *sd_buf;
2044 struct ntvfs_context *ntvfs_ctx = NULL;
2045 struct ntvfs_request *ntvfs_req;
2046 union smb_fileinfo *io;
2049 nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
2050 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2052 ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
2053 dce_call->conn->auth_state.session_info,
2057 W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
2059 sd_buf = talloc(mem_ctx, struct sec_desc_buf);
2060 W_ERROR_HAVE_NO_MEMORY(sd_buf);
2062 io = talloc(mem_ctx, union smb_fileinfo);
2063 W_ERROR_HAVE_NO_MEMORY(io);
2065 io->query_secdesc.level = RAW_FILEINFO_SEC_DESC;
2066 io->query_secdesc.in.file.path = r->in.file;
2067 io->query_secdesc.in.secinfo_flags = r->in.securityinformation;
2069 nt_status = ntvfs_qpathinfo(ntvfs_req, io);
2070 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2072 sd_buf->sd = io->query_secdesc.out.sd;
2074 *r->out.sd_buf = sd_buf;
2080 srvsvc_NetSetFileSecurity
2082 static WERROR dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2083 struct srvsvc_NetSetFileSecurity *r)
2085 struct ntvfs_context *ntvfs_ctx;
2086 struct ntvfs_request *ntvfs_req;
2087 union smb_setfileinfo *io;
2090 nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
2091 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2093 ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
2094 dce_call->conn->auth_state.session_info,
2098 W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
2100 io = talloc(mem_ctx, union smb_setfileinfo);
2101 W_ERROR_HAVE_NO_MEMORY(io);
2103 io->set_secdesc.level = RAW_FILEINFO_SEC_DESC;
2104 io->set_secdesc.in.file.path = r->in.file;
2105 io->set_secdesc.in.secinfo_flags = r->in.securityinformation;
2106 io->set_secdesc.in.sd = r->in.sd_buf->sd;
2108 nt_status = ntvfs_setpathinfo(ntvfs_req, io);
2109 if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2116 srvsvc_NetServerTransportAddEx
2118 static WERROR dcesrv_srvsvc_NetServerTransportAddEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2119 struct srvsvc_NetServerTransportAddEx *r)
2121 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2126 srvsvc_NetServerSetServiceBitsEx
2128 static WERROR dcesrv_srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2129 struct srvsvc_NetServerSetServiceBitsEx *r)
2131 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2136 srvsvc_NETRDFSGETVERSION
2138 static WERROR dcesrv_srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2139 struct srvsvc_NETRDFSGETVERSION *r)
2141 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2146 srvsvc_NETRDFSCREATELOCALPARTITION
2148 static WERROR dcesrv_srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2149 struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
2151 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2156 srvsvc_NETRDFSDELETELOCALPARTITION
2158 static WERROR dcesrv_srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2159 struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
2161 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2166 srvsvc_NETRDFSSETLOCALVOLUMESTATE
2168 static WERROR dcesrv_srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2169 struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
2171 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2176 srvsvc_NETRDFSSETSERVERINFO
2178 static WERROR dcesrv_srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2179 struct srvsvc_NETRDFSSETSERVERINFO *r)
2181 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2186 srvsvc_NETRDFSCREATEEXITPOINT
2188 static WERROR dcesrv_srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2189 struct srvsvc_NETRDFSCREATEEXITPOINT *r)
2191 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2196 srvsvc_NETRDFSDELETEEXITPOINT
2198 static WERROR dcesrv_srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2199 struct srvsvc_NETRDFSDELETEEXITPOINT *r)
2201 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2206 srvsvc_NETRDFSMODIFYPREFIX
2208 static WERROR dcesrv_srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2209 struct srvsvc_NETRDFSMODIFYPREFIX *r)
2211 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2216 srvsvc_NETRDFSFIXLOCALVOLUME
2218 static WERROR dcesrv_srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2219 struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
2221 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2226 srvsvc_NETRDFSMANAGERREPORTSITEINFO
2228 static WERROR dcesrv_srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2229 struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
2231 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2236 srvsvc_NETRSERVERTRANSPORTDELEX
2238 static WERROR dcesrv_srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2239 struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
2241 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2247 static WERROR dcesrv_srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2248 struct srvsvc_NetShareDel *r)
2251 struct share_context *sctx;
2253 nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx);
2254 if (!NT_STATUS_IS_OK(nterr)) {
2255 return ntstatus_to_werror(nterr);
2258 nterr = share_remove(sctx, r->in.share_name);
2259 if (!NT_STATUS_IS_OK(nterr)) {
2260 return ntstatus_to_werror(nterr);
2267 srvsvc_NetSetServiceBits
2269 static WERROR dcesrv_srvsvc_NetSetServiceBits(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2270 struct srvsvc_NetSetServiceBits *r)
2272 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2276 srvsvc_NETRPRNAMECANONICALIZE
2278 static WERROR dcesrv_srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2279 struct srvsvc_NETRPRNAMECANONICALIZE *r)
2281 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2284 /* include the generated boilerplate */
2285 #include "librpc/gen_ndr/ndr_srvsvc_s.c"