2 Unix SMB/CIFS implementation.
4 endpoint server for the srvsvc pipe
6 Copyright (C) Stefan (metze) Metzmacher 2004
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "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"
31 #define SRVSVC_CHECK_ADMIN_ACCESS do { \
32 struct security_token *t = dce_call->conn->auth_state.session_info->security_token; \
33 if (!security_token_has_builtin_administrators(t) && \
34 !security_token_has_sid_string(t, SID_BUILTIN_SERVER_OPERATORS)) { \
35 return WERR_ACCESS_DENIED; \
42 static WERROR srvsvc_NetCharDevEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
43 struct srvsvc_NetCharDevEnum *r)
45 r->out.level = r->in.level;
46 r->out.totalentries = 0;
47 r->out.resume_handle = NULL;
49 switch (r->in.level) {
51 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr0);
52 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
54 r->out.ctr.ctr0->count = 0;
55 r->out.ctr.ctr0->array = NULL;
57 return WERR_NOT_SUPPORTED;
60 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr1);
61 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
63 r->out.ctr.ctr1->count = 0;
64 r->out.ctr.ctr1->array = NULL;
66 return WERR_NOT_SUPPORTED;
69 return WERR_UNKNOWN_LEVEL;
77 srvsvc_NetCharDevGetInfo
79 static WERROR srvsvc_NetCharDevGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
80 struct srvsvc_NetCharDevGetInfo *r)
84 switch (r->in.level) {
87 return WERR_NOT_SUPPORTED;
91 return WERR_NOT_SUPPORTED;
94 return WERR_UNKNOWN_LEVEL;
97 return WERR_UNKNOWN_LEVEL;
102 srvsvc_NetCharDevControl
104 static WERROR srvsvc_NetCharDevControl(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
105 struct srvsvc_NetCharDevControl *r)
107 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
112 srvsvc_NetCharDevQEnum
114 static WERROR srvsvc_NetCharDevQEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
115 struct srvsvc_NetCharDevQEnum *r)
117 r->out.level = r->in.level;
118 r->out.totalentries = 0;
119 r->out.resume_handle = NULL;
121 switch (r->in.level) {
124 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr0);
125 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
127 r->out.ctr.ctr0->count = 0;
128 r->out.ctr.ctr0->array = NULL;
130 return WERR_NOT_SUPPORTED;
134 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr1);
135 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
137 r->out.ctr.ctr1->count = 0;
138 r->out.ctr.ctr1->array = NULL;
140 return WERR_NOT_SUPPORTED;
143 return WERR_UNKNOWN_LEVEL;
146 return WERR_UNKNOWN_LEVEL;
151 srvsvc_NetCharDevQGetInfo
153 static WERROR srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
154 struct srvsvc_NetCharDevQGetInfo *r)
158 switch (r->in.level) {
161 return WERR_NOT_SUPPORTED;
165 return WERR_NOT_SUPPORTED;
168 return WERR_UNKNOWN_LEVEL;
171 return WERR_UNKNOWN_LEVEL;
176 srvsvc_NetCharDevQSetInfo
178 static WERROR srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
179 struct srvsvc_NetCharDevQSetInfo *r)
181 switch (r->in.level) {
184 if (r->in.parm_error) {
185 r->out.parm_error = r->in.parm_error;
187 return WERR_NOT_SUPPORTED;
191 if (r->in.parm_error) {
192 r->out.parm_error = r->in.parm_error;
194 return WERR_NOT_SUPPORTED;
197 return WERR_UNKNOWN_LEVEL;
200 return WERR_UNKNOWN_LEVEL;
205 srvsvc_NetCharDevQPurge
207 static WERROR srvsvc_NetCharDevQPurge(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
208 struct srvsvc_NetCharDevQPurge *r)
210 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
215 srvsvc_NetCharDevQPurgeSelf
217 static WERROR srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
218 struct srvsvc_NetCharDevQPurgeSelf *r)
220 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
227 static WERROR srvsvc_NetConnEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
228 struct srvsvc_NetConnEnum *r)
230 r->out.level = r->in.level;
231 r->out.totalentries = 0;
232 r->out.resume_handle = NULL;
234 switch (r->in.level) {
237 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetConnCtr0);
238 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
240 r->out.ctr.ctr0->count = 0;
241 r->out.ctr.ctr0->array = NULL;
243 return WERR_NOT_SUPPORTED;
247 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetConnCtr1);
248 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
250 r->out.ctr.ctr1->count = 0;
251 r->out.ctr.ctr1->array = NULL;
253 return WERR_NOT_SUPPORTED;
256 return WERR_UNKNOWN_LEVEL;
259 return WERR_UNKNOWN_LEVEL;
266 static WERROR srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
267 struct srvsvc_NetFileEnum *r)
269 r->out.level = r->in.level;
270 r->out.totalentries = 0;
271 r->out.resume_handle = NULL;
273 switch (r->in.level) {
276 r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetFileCtr2);
277 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
279 r->out.ctr.ctr2->count = 0;
280 r->out.ctr.ctr2->array = NULL;
282 return WERR_NOT_SUPPORTED;
286 r->out.ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetFileCtr3);
287 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr3);
289 r->out.ctr.ctr3->count = 0;
290 r->out.ctr.ctr3->array = NULL;
292 return WERR_NOT_SUPPORTED;
295 return WERR_UNKNOWN_LEVEL;
298 return WERR_UNKNOWN_LEVEL;
303 srvsvc_NetFileGetInfo
305 static WERROR srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
306 struct srvsvc_NetFileGetInfo *r)
310 switch (r->in.level) {
313 return WERR_NOT_SUPPORTED;
317 return WERR_NOT_SUPPORTED;
320 return WERR_UNKNOWN_LEVEL;
323 return WERR_UNKNOWN_LEVEL;
330 static WERROR srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
331 struct srvsvc_NetFileClose *r)
333 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
340 static WERROR srvsvc_NetSessEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
341 struct srvsvc_NetSessEnum *r)
343 r->out.level = r->in.level;
344 r->out.totalentries = 0;
345 r->out.resume_handle = NULL;
347 switch (r->in.level) {
350 r->out.ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetSessCtr0);
351 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr0);
353 r->out.ctr.ctr0->count = 0;
354 r->out.ctr.ctr0->array = NULL;
356 return WERR_NOT_SUPPORTED;
360 r->out.ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetSessCtr1);
361 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr1);
363 r->out.ctr.ctr1->count = 0;
364 r->out.ctr.ctr1->array = NULL;
366 return WERR_NOT_SUPPORTED;
370 r->out.ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetSessCtr2);
371 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr2);
373 r->out.ctr.ctr2->count = 0;
374 r->out.ctr.ctr2->array = NULL;
376 return WERR_NOT_SUPPORTED;
380 r->out.ctr.ctr10 = talloc(mem_ctx, struct srvsvc_NetSessCtr10);
381 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr10);
383 r->out.ctr.ctr2->count = 0;
384 r->out.ctr.ctr2->array = NULL;
386 return WERR_NOT_SUPPORTED;
390 r->out.ctr.ctr502 = talloc(mem_ctx, struct srvsvc_NetSessCtr502);
391 W_ERROR_HAVE_NO_MEMORY(r->out.ctr.ctr502);
393 r->out.ctr.ctr2->count = 0;
394 r->out.ctr.ctr2->array = NULL;
396 return WERR_NOT_SUPPORTED;
399 return WERR_UNKNOWN_LEVEL;
402 return WERR_UNKNOWN_LEVEL;
409 static WERROR srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
410 struct srvsvc_NetSessDel *r)
412 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
419 static WERROR srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
420 struct srvsvc_NetShareAdd *r)
422 switch (r->in.level) {
425 if (r->in.parm_error) {
426 r->out.parm_error = r->in.parm_error;
428 return WERR_NOT_SUPPORTED;
432 if (r->in.parm_error) {
433 r->out.parm_error = r->in.parm_error;
435 return WERR_NOT_SUPPORTED;
439 if (r->in.parm_error) {
440 r->out.parm_error = r->in.parm_error;
442 return WERR_NOT_SUPPORTED;
446 if (r->in.parm_error) {
447 r->out.parm_error = r->in.parm_error;
449 return WERR_NOT_SUPPORTED;
453 if (r->in.parm_error) {
454 r->out.parm_error = r->in.parm_error;
456 return WERR_NOT_SUPPORTED;
459 return WERR_UNKNOWN_LEVEL;
462 return WERR_UNKNOWN_LEVEL;
465 static WERROR srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
466 int snum, uint32_t level, union srvsvc_NetShareInfo *info)
468 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
473 info->info0->name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, snum);
474 W_ERROR_HAVE_NO_MEMORY(info->info0->name);
480 info->info1->name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, snum);
481 W_ERROR_HAVE_NO_MEMORY(info->info1->name);
482 info->info1->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, snum);
483 info->info1->comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, snum);
484 W_ERROR_HAVE_NO_MEMORY(info->info1->comment);
490 info->info2->name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, snum);
491 W_ERROR_HAVE_NO_MEMORY(info->info2->name);
492 info->info2->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, snum);
493 info->info2->comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, snum);
494 W_ERROR_HAVE_NO_MEMORY(info->info2->comment);
495 info->info2->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, snum);
496 info->info2->max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, snum);
497 info->info2->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, snum);
498 info->info2->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, snum);
499 W_ERROR_HAVE_NO_MEMORY(info->info2->path);
500 info->info2->password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, snum);
506 info->info501->name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, snum);
507 W_ERROR_HAVE_NO_MEMORY(info->info501->name);
508 info->info501->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, snum);
509 info->info501->comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, snum);
510 W_ERROR_HAVE_NO_MEMORY(info->info501->comment);
511 info->info501->csc_policy = dcesrv_common_get_share_csc_policy(mem_ctx, dce_ctx, snum);
517 info->info502->name = dcesrv_common_get_share_name(mem_ctx, dce_ctx, snum);
518 W_ERROR_HAVE_NO_MEMORY(info->info502->name);
519 info->info502->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, snum);
520 info->info502->comment = dcesrv_common_get_share_comment(mem_ctx, dce_ctx, snum);
521 W_ERROR_HAVE_NO_MEMORY(info->info502->comment);
522 info->info502->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, snum);
523 info->info502->max_users = dcesrv_common_get_share_max_users(mem_ctx, dce_ctx, snum);
524 info->info502->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, snum);
525 info->info502->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, snum);
526 W_ERROR_HAVE_NO_MEMORY(info->info502->path);
527 info->info502->password = dcesrv_common_get_share_password(mem_ctx, dce_ctx, snum);
528 info->info502->unknown = dcesrv_common_get_share_unknown(mem_ctx, dce_ctx, snum);
529 info->info502->sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, snum);
535 info->info1005->dfs_flags = dcesrv_common_get_share_dfs_flags(mem_ctx, dce_ctx, snum);
540 return WERR_UNKNOWN_LEVEL;
543 return WERR_UNKNOWN_LEVEL;
547 srvsvc_NetShareEnumAll
549 static WERROR srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
550 struct srvsvc_NetShareEnumAll *r)
552 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
554 r->out.level = r->in.level;
555 ZERO_STRUCT(r->out.ctr);
556 r->out.totalentries = 0;
557 r->out.resume_handle = NULL;
559 /* TODO: - paging of results
562 switch (r->in.level) {
566 struct srvsvc_NetShareCtr0 *ctr0;
568 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
569 W_ERROR_HAVE_NO_MEMORY(ctr0);
571 ctr0->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
574 if (ctr0->count == 0) {
575 r->out.ctr.ctr0 = ctr0;
579 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, ctr0->count);
580 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
582 for (i=0; i < ctr0->count; i++) {
584 union srvsvc_NetShareInfo info;
586 info.info0 = &ctr0->array[i];
587 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
588 if (!W_ERROR_IS_OK(status)) {
593 r->out.ctr.ctr0 = ctr0;
594 r->out.totalentries = r->out.ctr.ctr0->count;
600 struct srvsvc_NetShareCtr1 *ctr1;
602 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
603 W_ERROR_HAVE_NO_MEMORY(ctr1);
605 ctr1->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
608 if (ctr1->count == 0) {
609 r->out.ctr.ctr1 = ctr1;
613 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, ctr1->count);
614 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
616 for (i=0; i < ctr1->count; i++) {
618 union srvsvc_NetShareInfo info;
620 info.info1 = &ctr1->array[i];
621 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
622 if (!W_ERROR_IS_OK(status)) {
627 r->out.ctr.ctr1 = ctr1;
628 r->out.totalentries = r->out.ctr.ctr1->count;
634 struct srvsvc_NetShareCtr2 *ctr2;
636 SRVSVC_CHECK_ADMIN_ACCESS;
638 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
639 W_ERROR_HAVE_NO_MEMORY(ctr2);
641 ctr2->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
644 if (ctr2->count == 0) {
645 r->out.ctr.ctr2 = ctr2;
649 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, ctr2->count);
650 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
652 for (i=0; i < ctr2->count; i++) {
654 union srvsvc_NetShareInfo info;
656 info.info2 = &ctr2->array[i];
657 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
658 if (!W_ERROR_IS_OK(status)) {
663 r->out.ctr.ctr2 = ctr2;
664 r->out.totalentries = r->out.ctr.ctr2->count;
670 struct srvsvc_NetShareCtr501 *ctr501;
672 SRVSVC_CHECK_ADMIN_ACCESS;
674 ctr501 = talloc(mem_ctx, struct srvsvc_NetShareCtr501);
675 W_ERROR_HAVE_NO_MEMORY(ctr501);
677 ctr501->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
678 ctr501->array = NULL;
680 if (ctr501->count == 0) {
681 r->out.ctr.ctr501 = ctr501;
685 ctr501->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo501, ctr501->count);
686 W_ERROR_HAVE_NO_MEMORY(ctr501->array);
688 for (i=0; i < ctr501->count; i++) {
690 union srvsvc_NetShareInfo info;
692 info.info501 = &ctr501->array[i];
693 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
694 if (!W_ERROR_IS_OK(status)) {
699 r->out.ctr.ctr501 = ctr501;
700 r->out.totalentries = r->out.ctr.ctr501->count;
706 struct srvsvc_NetShareCtr502 *ctr502;
708 SRVSVC_CHECK_ADMIN_ACCESS;
710 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
711 W_ERROR_HAVE_NO_MEMORY(ctr502);
713 ctr502->count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
714 ctr502->array = NULL;
716 if (ctr502->count == 0) {
717 r->out.ctr.ctr502 = ctr502;
721 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, ctr502->count);
722 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
724 for (i=0; i < ctr502->count; i++) {
726 union srvsvc_NetShareInfo info;
728 info.info502 = &ctr502->array[i];
729 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
730 if (!W_ERROR_IS_OK(status)) {
735 r->out.ctr.ctr502 = ctr502;
736 r->out.totalentries = r->out.ctr.ctr502->count;
740 return WERR_UNKNOWN_LEVEL;
743 return WERR_UNKNOWN_LEVEL;
748 srvsvc_NetShareGetInfo
750 static WERROR srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
751 struct srvsvc_NetShareGetInfo *r)
757 /* TODO: - access check
760 if (strcmp("", r->in.share_name) == 0) {
761 return WERR_INVALID_PARAM;
764 snum = lp_servicenumber(r->in.share_name);
766 return WERR_NET_NAME_NOT_FOUND;
769 switch (r->in.level) {
773 union srvsvc_NetShareInfo info;
775 info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0);
776 W_ERROR_HAVE_NO_MEMORY(info.info0);
778 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, snum, r->in.level, &info);
779 if (!W_ERROR_IS_OK(status)) {
783 r->out.info.info0 = info.info0;
789 union srvsvc_NetShareInfo info;
791 info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1);
792 W_ERROR_HAVE_NO_MEMORY(info.info1);
794 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, snum, r->in.level, &info);
795 if (!W_ERROR_IS_OK(status)) {
799 r->out.info.info1 = info.info1;
805 union srvsvc_NetShareInfo info;
807 SRVSVC_CHECK_ADMIN_ACCESS;
809 info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
810 W_ERROR_HAVE_NO_MEMORY(info.info2);
812 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, snum, r->in.level, &info);
813 if (!W_ERROR_IS_OK(status)) {
817 r->out.info.info2 = info.info2;
823 union srvsvc_NetShareInfo info;
825 info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501);
826 W_ERROR_HAVE_NO_MEMORY(info.info501);
828 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, snum, r->in.level, &info);
829 if (!W_ERROR_IS_OK(status)) {
833 r->out.info.info501 = info.info501;
839 union srvsvc_NetShareInfo info;
841 SRVSVC_CHECK_ADMIN_ACCESS;
843 info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502);
844 W_ERROR_HAVE_NO_MEMORY(info.info502);
846 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, snum, r->in.level, &info);
847 if (!W_ERROR_IS_OK(status)) {
851 r->out.info.info502 = info.info502;
857 union srvsvc_NetShareInfo info;
859 info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005);
860 W_ERROR_HAVE_NO_MEMORY(info.info1005);
862 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, snum, r->in.level, &info);
863 if (!W_ERROR_IS_OK(status)) {
867 r->out.info.info1005 = info.info1005;
871 return WERR_UNKNOWN_LEVEL;
874 return WERR_UNKNOWN_LEVEL;
879 srvsvc_NetShareSetInfo
881 static WERROR srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
882 struct srvsvc_NetShareSetInfo *r)
884 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
889 srvsvc_NetShareDelSticky
891 static WERROR srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
892 struct srvsvc_NetShareDelSticky *r)
894 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
901 static WERROR srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
902 struct srvsvc_NetShareCheck *r)
906 /* TODO: - access check
909 if (strcmp("", r->in.device_name) == 0) {
910 r->out.type = STYPE_IPC;
914 if (strcmp("C:\\", r->in.device_name) == 0) {
915 r->out.type = STYPE_DISKTREE;
919 /* TODO: - lookup the share be devicename (path) */
920 return WERR_DEVICE_NOT_SHARED;
927 static WERROR srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
928 struct srvsvc_NetSrvGetInfo *r)
930 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
934 switch (r->in.level) {
937 struct srvsvc_NetSrvInfo100 *info100;
939 info100 = talloc(mem_ctx, struct srvsvc_NetSrvInfo100);
940 W_ERROR_HAVE_NO_MEMORY(info100);
942 info100->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
943 info100->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
944 W_ERROR_HAVE_NO_MEMORY(info100->server_name);
946 r->out.info.info100 = info100;
951 struct srvsvc_NetSrvInfo101 *info101;
953 info101 = talloc(mem_ctx, struct srvsvc_NetSrvInfo101);
954 W_ERROR_HAVE_NO_MEMORY(info101);
956 info101->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
957 info101->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
958 W_ERROR_HAVE_NO_MEMORY(info101->server_name);
960 info101->version_major = dcesrv_common_get_version_major(mem_ctx, dce_ctx);
961 info101->version_minor = dcesrv_common_get_version_minor(mem_ctx, dce_ctx);
962 info101->server_type = dcesrv_common_get_server_type(mem_ctx, dce_ctx);
963 info101->comment = talloc_strdup(mem_ctx, lp_serverstring());
964 W_ERROR_HAVE_NO_MEMORY(info101->comment);
966 r->out.info.info101 = info101;
970 return WERR_UNKNOWN_LEVEL;
973 return WERR_UNKNOWN_LEVEL;
980 static WERROR srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
981 struct srvsvc_NetSrvSetInfo *r)
983 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
990 static WERROR srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
991 struct srvsvc_NetDiskEnum *r)
993 r->out.disks.discs = NULL;
994 r->out.disks.count = 0;
995 r->out.totalentries = 0;
996 r->out.resume_handle = NULL;
998 switch (r->in.level) {
1001 return WERR_NOT_SUPPORTED;
1004 return WERR_UNKNOWN_LEVEL;
1007 return WERR_UNKNOWN_LEVEL;
1012 srvsvc_NetServerStatisticsGet
1014 static WERROR srvsvc_NetServerStatisticsGet(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1015 struct srvsvc_NetServerStatisticsGet *r)
1017 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1022 srvsvc_NetTransportAdd
1024 static WERROR srvsvc_NetTransportAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1025 struct srvsvc_NetTransportAdd *r)
1027 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1032 srvsvc_NetTransportEnum
1034 static WERROR srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1035 struct srvsvc_NetTransportEnum *r)
1037 r->out.level = r->in.level;
1038 r->out.totalentries = 0;
1039 r->out.resume_handle = NULL;
1041 switch (r->in.level) {
1044 r->out.transports.ctr0 = talloc(mem_ctx, struct srvsvc_NetTransportCtr0);
1045 W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr0);
1047 r->out.transports.ctr0->count = 0;
1048 r->out.transports.ctr0->array = NULL;
1050 return WERR_NOT_SUPPORTED;
1054 r->out.transports.ctr1 = talloc(mem_ctx, struct srvsvc_NetTransportCtr1);
1055 W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr1);
1057 r->out.transports.ctr1->count = 0;
1058 r->out.transports.ctr1->array = NULL;
1060 return WERR_NOT_SUPPORTED;
1064 r->out.transports.ctr2 = talloc(mem_ctx, struct srvsvc_NetTransportCtr2);
1065 W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr2);
1067 r->out.transports.ctr2->count = 0;
1068 r->out.transports.ctr2->array = NULL;
1070 return WERR_NOT_SUPPORTED;
1074 r->out.transports.ctr3 = talloc(mem_ctx, struct srvsvc_NetTransportCtr3);
1075 W_ERROR_HAVE_NO_MEMORY(r->out.transports.ctr3);
1077 r->out.transports.ctr3->count = 0;
1078 r->out.transports.ctr3->array = NULL;
1080 return WERR_NOT_SUPPORTED;
1083 return WERR_UNKNOWN_LEVEL;
1086 return WERR_UNKNOWN_LEVEL;
1090 srvsvc_NetTransportDel
1092 static WERROR srvsvc_NetTransportDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1093 struct srvsvc_NetTransportDel *r)
1095 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1102 static WERROR srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1103 struct srvsvc_NetRemoteTOD *r)
1105 struct timeval tval;
1109 r->out.info = talloc(mem_ctx, struct srvsvc_NetRemoteTODInfo);
1110 W_ERROR_HAVE_NO_MEMORY(r->out.info);
1112 GetTimeOfDay(&tval);
1117 r->out.info->elapsed = t;
1118 /* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
1119 r->out.info->msecs = (tm.tm_hour*60*60*1000)
1120 + (tm.tm_min*60*1000)
1122 + (tval.tv_usec/1000);
1123 r->out.info->hours = tm.tm_hour;
1124 r->out.info->mins = tm.tm_min;
1125 r->out.info->secs = tm.tm_sec;
1126 r->out.info->hunds = tval.tv_usec/10000;
1127 r->out.info->timezone = get_time_zone(t)/60;
1128 r->out.info->tinterval = 310; /* just return the same as windows */
1129 r->out.info->day = tm.tm_mday;
1130 r->out.info->month = tm.tm_mon + 1;
1131 r->out.info->year = tm.tm_year + 1900;
1132 r->out.info->weekday = tm.tm_wday;
1140 static WERROR srvsvc_NetPathType(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1141 struct srvsvc_NetPathType *r)
1143 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1148 srvsvc_NetPathCanonicalize
1150 static WERROR srvsvc_NetPathCanonicalize(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1151 struct srvsvc_NetPathCanonicalize *r)
1153 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1158 srvsvc_NetPathCompare
1160 static WERROR srvsvc_NetPathCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1161 struct srvsvc_NetPathCompare *r)
1163 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1168 srvsvc_NetNameValidate
1170 static WERROR srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1171 struct srvsvc_NetNameValidate *r)
1173 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1178 srvsvc_NetPRNameCompare
1180 static WERROR srvsvc_NetPRNameCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1181 struct srvsvc_NetPRNameCompare *r)
1183 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1190 static WERROR srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1191 struct srvsvc_NetShareEnum *r)
1193 struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1195 r->out.level = r->in.level;
1196 ZERO_STRUCT(r->out.ctr);
1197 r->out.totalentries = 0;
1198 r->out.resume_handle = NULL;
1200 /* TODO: - paging of results
1203 switch (r->in.level) {
1208 struct srvsvc_NetShareCtr0 *ctr0;
1210 ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
1211 W_ERROR_HAVE_NO_MEMORY(ctr0);
1213 count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
1214 ctr0->count = count;
1217 if (ctr0->count == 0) {
1218 r->out.ctr.ctr0 = ctr0;
1222 ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, count);
1223 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
1225 for (i=0; i < count; i++) {
1227 union srvsvc_NetShareInfo info;
1228 enum srvsvc_ShareType type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
1230 if (type & STYPE_HIDDEN) {
1235 info.info0 = &ctr0->array[y];
1236 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
1237 W_ERROR_NOT_OK_RETURN(status);
1241 r->out.ctr.ctr0 = ctr0;
1242 r->out.totalentries = r->out.ctr.ctr0->count;
1249 struct srvsvc_NetShareCtr1 *ctr1;
1251 ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
1252 W_ERROR_HAVE_NO_MEMORY(ctr1);
1254 count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
1255 ctr1->count = count;
1258 if (ctr1->count == 0) {
1259 r->out.ctr.ctr1 = ctr1;
1263 ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, count);
1264 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
1266 for (i=0; i < count; i++) {
1268 union srvsvc_NetShareInfo info;
1269 enum srvsvc_ShareType type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
1271 if (type & STYPE_HIDDEN) {
1276 info.info1 = &ctr1->array[y];
1277 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
1278 W_ERROR_NOT_OK_RETURN(status);
1282 r->out.ctr.ctr1 = ctr1;
1283 r->out.totalentries = r->out.ctr.ctr1->count;
1290 struct srvsvc_NetShareCtr2 *ctr2;
1292 SRVSVC_CHECK_ADMIN_ACCESS;
1294 ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
1295 W_ERROR_HAVE_NO_MEMORY(ctr2);
1297 count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
1298 ctr2->count = count;
1301 if (ctr2->count == 0) {
1302 r->out.ctr.ctr2 = ctr2;
1306 ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, count);
1307 W_ERROR_HAVE_NO_MEMORY(ctr2->array);
1309 for (i=0; i < count; i++) {
1311 union srvsvc_NetShareInfo info;
1312 enum srvsvc_ShareType type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
1314 if (type & STYPE_HIDDEN) {
1319 info.info2 = &ctr2->array[y];
1320 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
1321 W_ERROR_NOT_OK_RETURN(status);
1325 r->out.ctr.ctr2 = ctr2;
1326 r->out.totalentries = r->out.ctr.ctr2->count;
1333 struct srvsvc_NetShareCtr502 *ctr502;
1335 SRVSVC_CHECK_ADMIN_ACCESS;
1337 ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
1338 W_ERROR_HAVE_NO_MEMORY(ctr502);
1340 count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
1341 ctr502->count = count;
1342 ctr502->array = NULL;
1344 if (ctr502->count == 0) {
1345 r->out.ctr.ctr502 = ctr502;
1349 ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, count);
1350 W_ERROR_HAVE_NO_MEMORY(ctr502->array);
1352 for (i=0; i < count; i++) {
1354 union srvsvc_NetShareInfo info;
1355 enum srvsvc_ShareType type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
1357 if (type & STYPE_HIDDEN) {
1362 info.info502 = &ctr502->array[y];
1363 status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
1364 W_ERROR_NOT_OK_RETURN(status);
1368 r->out.ctr.ctr502 = ctr502;
1369 r->out.totalentries = r->out.ctr.ctr502->count;
1373 return WERR_UNKNOWN_LEVEL;
1376 return WERR_UNKNOWN_LEVEL;
1381 srvsvc_NetShareDelStart
1383 static WERROR srvsvc_NetShareDelStart(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1384 struct srvsvc_NetShareDelStart *r)
1386 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1391 srvsvc_NetShareDelCommit
1393 static WERROR srvsvc_NetShareDelCommit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1394 struct srvsvc_NetShareDelCommit *r)
1396 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1401 srvsvc_NetGetFileSecurity
1403 static WERROR srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1404 struct srvsvc_NetGetFileSecurity *r)
1406 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1411 srvsvc_NetSetFileSecurity
1413 static WERROR srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1414 struct srvsvc_NetSetFileSecurity *r)
1416 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1421 srvsvc_NetServerTransportAddEx
1423 static WERROR srvsvc_NetServerTransportAddEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1424 struct srvsvc_NetServerTransportAddEx *r)
1426 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1431 srvsvc_NetServerSetServiceBitsEx
1433 static WERROR srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1434 struct srvsvc_NetServerSetServiceBitsEx *r)
1436 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1441 srvsvc_NETRDFSGETVERSION
1443 static WERROR srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1444 struct srvsvc_NETRDFSGETVERSION *r)
1446 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1451 srvsvc_NETRDFSCREATELOCALPARTITION
1453 static WERROR srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1454 struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
1456 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1461 srvsvc_NETRDFSDELETELOCALPARTITION
1463 static WERROR srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1464 struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
1466 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1471 srvsvc_NETRDFSSETLOCALVOLUMESTATE
1473 static WERROR srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1474 struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
1476 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1481 srvsvc_NETRDFSSETSERVERINFO
1483 static WERROR srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1484 struct srvsvc_NETRDFSSETSERVERINFO *r)
1486 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1491 srvsvc_NETRDFSCREATEEXITPOINT
1493 static WERROR srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1494 struct srvsvc_NETRDFSCREATEEXITPOINT *r)
1496 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1501 srvsvc_NETRDFSDELETEEXITPOINT
1503 static WERROR srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1504 struct srvsvc_NETRDFSDELETEEXITPOINT *r)
1506 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1511 srvsvc_NETRDFSMODIFYPREFIX
1513 static WERROR srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1514 struct srvsvc_NETRDFSMODIFYPREFIX *r)
1516 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1521 srvsvc_NETRDFSFIXLOCALVOLUME
1523 static WERROR srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1524 struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
1526 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1531 srvsvc_NETRDFSMANAGERREPORTSITEINFO
1533 static WERROR srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1534 struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
1536 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1541 srvsvc_NETRSERVERTRANSPORTDELEX
1543 static WERROR srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1544 struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
1546 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1552 static WERROR srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1553 struct srvsvc_NetShareDel *r)
1555 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1559 srvsvc_NetSetServiceBits
1561 static WERROR srvsvc_NetSetServiceBits(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1562 struct srvsvc_NetSetServiceBits *r)
1564 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1568 srvsvc_NETRPRNAMECANONICALIZE
1570 static WERROR srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1571 struct srvsvc_NETRPRNAMECANONICALIZE *r)
1573 DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1576 /* include the generated boilerplate */
1577 #include "librpc/gen_ndr/ndr_srvsvc_s.c"