2
Unix SMB/CIFS implementation.
4
endpoint server for the srvsvc pipe
6
Copyright (C) Stefan (metze) Metzmacher 2004-2006
8
This program is free software; you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation; either version 3 of the License, or
11
(at your option) any later version.
13
This program is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
GNU General Public License for more details.
18
You should have received a copy of the GNU General Public License
19
along with this program. If not, see <http://www.gnu.org/licenses/>.
23
#include "ntvfs/ntvfs.h"
24
#include "rpc_server/dcerpc_server.h"
25
#include "librpc/gen_ndr/ndr_srvsvc.h"
26
#include "rpc_server/common/common.h"
27
#include "rpc_server/common/proto.h"
28
#include "auth/auth.h"
29
#include "libcli/security/security.h"
30
#include "system/time.h"
31
#include "rpc_server/srvsvc/proto.h"
32
#include "param/param.h"
34
#define SRVSVC_CHECK_ADMIN_ACCESS do { \
35
struct security_token *t = dce_call->conn->auth_state.session_info->security_token; \
36
if (!security_token_has_builtin_administrators(t) && \
37
!security_token_has_sid_string(t, SID_BUILTIN_SERVER_OPERATORS)) { \
38
return WERR_ACCESS_DENIED; \
45
static WERROR dcesrv_srvsvc_NetCharDevEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
46
struct srvsvc_NetCharDevEnum *r)
48
*r->out.totalentries = 0;
50
switch (r->in.info_ctr->level) {
52
r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr0);
53
W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
55
r->out.info_ctr->ctr.ctr0->count = 0;
56
r->out.info_ctr->ctr.ctr0->array = NULL;
58
return WERR_NOT_SUPPORTED;
61
r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevCtr1);
62
W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
64
r->out.info_ctr->ctr.ctr1->count = 0;
65
r->out.info_ctr->ctr.ctr1->array = NULL;
67
return WERR_NOT_SUPPORTED;
70
return WERR_UNKNOWN_LEVEL;
78
srvsvc_NetCharDevGetInfo
80
static WERROR dcesrv_srvsvc_NetCharDevGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
81
struct srvsvc_NetCharDevGetInfo *r)
83
ZERO_STRUCTP(r->out.info);
85
switch (r->in.level) {
88
return WERR_NOT_SUPPORTED;
92
return WERR_NOT_SUPPORTED;
95
return WERR_UNKNOWN_LEVEL;
98
return WERR_UNKNOWN_LEVEL;
103
srvsvc_NetCharDevControl
105
static WERROR dcesrv_srvsvc_NetCharDevControl(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
106
struct srvsvc_NetCharDevControl *r)
108
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
113
srvsvc_NetCharDevQEnum
115
static WERROR dcesrv_srvsvc_NetCharDevQEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
116
struct srvsvc_NetCharDevQEnum *r)
118
*r->out.totalentries = 0;
120
switch (r->in.info_ctr->level) {
123
r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr0);
124
W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
126
r->out.info_ctr->ctr.ctr0->count = 0;
127
r->out.info_ctr->ctr.ctr0->array = NULL;
129
return WERR_NOT_SUPPORTED;
133
r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetCharDevQCtr1);
134
W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
136
r->out.info_ctr->ctr.ctr1->count = 0;
137
r->out.info_ctr->ctr.ctr1->array = NULL;
139
return WERR_NOT_SUPPORTED;
142
return WERR_UNKNOWN_LEVEL;
145
return WERR_UNKNOWN_LEVEL;
150
srvsvc_NetCharDevQGetInfo
152
static WERROR dcesrv_srvsvc_NetCharDevQGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
153
struct srvsvc_NetCharDevQGetInfo *r)
155
ZERO_STRUCTP(r->out.info);
157
switch (r->in.level) {
160
return WERR_NOT_SUPPORTED;
164
return WERR_NOT_SUPPORTED;
167
return WERR_UNKNOWN_LEVEL;
170
return WERR_UNKNOWN_LEVEL;
175
srvsvc_NetCharDevQSetInfo
177
static WERROR dcesrv_srvsvc_NetCharDevQSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
178
struct srvsvc_NetCharDevQSetInfo *r)
180
switch (r->in.level) {
183
if (r->in.parm_error) {
184
r->out.parm_error = r->in.parm_error;
186
return WERR_NOT_SUPPORTED;
190
if (r->in.parm_error) {
191
r->out.parm_error = r->in.parm_error;
193
return WERR_NOT_SUPPORTED;
196
return WERR_UNKNOWN_LEVEL;
199
return WERR_UNKNOWN_LEVEL;
204
srvsvc_NetCharDevQPurge
206
static WERROR dcesrv_srvsvc_NetCharDevQPurge(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
207
struct srvsvc_NetCharDevQPurge *r)
209
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
214
srvsvc_NetCharDevQPurgeSelf
216
static WERROR dcesrv_srvsvc_NetCharDevQPurgeSelf(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
217
struct srvsvc_NetCharDevQPurgeSelf *r)
219
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
226
static WERROR dcesrv_srvsvc_NetConnEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
227
struct srvsvc_NetConnEnum *r)
229
*r->out.totalentries = 0;
231
switch (r->in.info_ctr->level) {
234
r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetConnCtr0);
235
W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
237
r->out.info_ctr->ctr.ctr0->count = 0;
238
r->out.info_ctr->ctr.ctr0->array = NULL;
240
return WERR_NOT_SUPPORTED;
244
r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetConnCtr1);
245
W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
247
r->out.info_ctr->ctr.ctr1->count = 0;
248
r->out.info_ctr->ctr.ctr1->array = NULL;
250
return WERR_NOT_SUPPORTED;
253
return WERR_UNKNOWN_LEVEL;
256
return WERR_UNKNOWN_LEVEL;
263
static WERROR dcesrv_srvsvc_NetFileEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
264
struct srvsvc_NetFileEnum *r)
266
*r->out.totalentries = 0;
268
switch (r->in.info_ctr->level) {
271
r->out.info_ctr->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetFileCtr2);
272
W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr2);
274
r->out.info_ctr->ctr.ctr2->count = 0;
275
r->out.info_ctr->ctr.ctr2->array = NULL;
277
return WERR_NOT_SUPPORTED;
281
r->out.info_ctr->ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetFileCtr3);
282
W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr3);
284
r->out.info_ctr->ctr.ctr3->count = 0;
285
r->out.info_ctr->ctr.ctr3->array = NULL;
287
return WERR_NOT_SUPPORTED;
290
return WERR_UNKNOWN_LEVEL;
293
return WERR_UNKNOWN_LEVEL;
298
srvsvc_NetFileGetInfo
300
static WERROR dcesrv_srvsvc_NetFileGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
301
struct srvsvc_NetFileGetInfo *r)
303
ZERO_STRUCTP(r->out.info);
305
switch (r->in.level) {
308
return WERR_NOT_SUPPORTED;
312
return WERR_NOT_SUPPORTED;
315
return WERR_UNKNOWN_LEVEL;
318
return WERR_UNKNOWN_LEVEL;
325
static WERROR dcesrv_srvsvc_NetFileClose(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
326
struct srvsvc_NetFileClose *r)
328
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
335
static WERROR dcesrv_srvsvc_NetSessEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
336
struct srvsvc_NetSessEnum *r)
338
*r->out.totalentries = 0;
340
switch (r->in.info_ctr->level) {
343
r->out.info_ctr->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetSessCtr0);
344
W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr0);
346
r->out.info_ctr->ctr.ctr0->count = 0;
347
r->out.info_ctr->ctr.ctr0->array = NULL;
349
return WERR_NOT_SUPPORTED;
353
r->out.info_ctr->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetSessCtr1);
354
W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr1);
356
r->out.info_ctr->ctr.ctr1->count = 0;
357
r->out.info_ctr->ctr.ctr1->array = NULL;
359
return WERR_NOT_SUPPORTED;
363
r->out.info_ctr->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetSessCtr2);
364
W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr2);
366
r->out.info_ctr->ctr.ctr2->count = 0;
367
r->out.info_ctr->ctr.ctr2->array = NULL;
369
return WERR_NOT_SUPPORTED;
373
r->out.info_ctr->ctr.ctr10 = talloc(mem_ctx, struct srvsvc_NetSessCtr10);
374
W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr10);
376
r->out.info_ctr->ctr.ctr10->count = 0;
377
r->out.info_ctr->ctr.ctr10->array = NULL;
379
return WERR_NOT_SUPPORTED;
383
r->out.info_ctr->ctr.ctr502 = talloc(mem_ctx, struct srvsvc_NetSessCtr502);
384
W_ERROR_HAVE_NO_MEMORY(r->out.info_ctr->ctr.ctr502);
386
r->out.info_ctr->ctr.ctr502->count = 0;
387
r->out.info_ctr->ctr.ctr502->array = NULL;
389
return WERR_NOT_SUPPORTED;
392
return WERR_UNKNOWN_LEVEL;
395
return WERR_UNKNOWN_LEVEL;
402
static WERROR dcesrv_srvsvc_NetSessDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
403
struct srvsvc_NetSessDel *r)
405
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
412
static WERROR dcesrv_srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
413
struct srvsvc_NetShareAdd *r)
415
switch (r->in.level) {
418
if (r->in.parm_error) {
419
r->out.parm_error = r->in.parm_error;
421
return WERR_NOT_SUPPORTED;
425
if (r->in.parm_error) {
426
r->out.parm_error = r->in.parm_error;
428
return WERR_NOT_SUPPORTED;
433
struct share_info *info;
434
struct share_context *sctx;
438
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);
439
if (!NT_STATUS_IS_OK(nterr)) {
440
return ntstatus_to_werror(nterr);
443
/* there are no more than 8 options in struct srvsvc_NetShareInfo2 */
444
info = talloc_array(mem_ctx, struct share_info, count);
445
W_ERROR_HAVE_NO_MEMORY(info);
449
info[i].name = SHARE_TYPE;
450
info[i].type = SHARE_INFO_STRING;
451
switch (r->in.info->info2->type) {
453
info[i].value = talloc_strdup(info, "DISK");
456
info[i].value = talloc_strdup(info, "PRINTER");
459
info[i].value = talloc_strdup(info, "IPC");
462
return WERR_INVALID_PARAM;
464
W_ERROR_HAVE_NO_MEMORY(info[i].value);
467
if (r->in.info->info2->path && r->in.info->info2->path[0]) {
468
info[i].name = SHARE_PATH;
469
info[i].type = SHARE_INFO_STRING;
471
/* Windows will send a path in a form of C:\example\path */
472
if (r->in.info->info2->path[1] == ':') {
473
info[i].value = talloc_strdup(info, &r->in.info->info2->path[2]);
475
/* very strange let's try to set as is */
476
info[i].value = talloc_strdup(info, r->in.info->info2->path);
478
W_ERROR_HAVE_NO_MEMORY(info[i].value);
479
all_string_sub((char *)info[i].value, "\\", "/", 0);
484
if (r->in.info->info2->comment && r->in.info->info2->comment[0]) {
485
info[i].name = SHARE_COMMENT;
486
info[i].type = SHARE_INFO_STRING;
487
info[i].value = talloc_strdup(info, r->in.info->info2->comment);
488
W_ERROR_HAVE_NO_MEMORY(info[i].value);
493
if (r->in.info->info2->password && r->in.info->info2->password[0]) {
494
info[i].name = SHARE_PASSWORD;
495
info[i].type = SHARE_INFO_STRING;
496
info[i].value = talloc_strdup(info, r->in.info->info2->password);
497
W_ERROR_HAVE_NO_MEMORY(info[i].value);
502
info[i].name = SHARE_MAX_CONNECTIONS;
503
info[i].type = SHARE_INFO_INT;
504
info[i].value = talloc(info, int);
505
*((int *)info[i].value) = r->in.info->info2->max_users;
508
/* TODO: security descriptor */
510
nterr = share_create(sctx, r->in.info->info2->name, info, i);
511
if (!NT_STATUS_IS_OK(nterr)) {
512
return ntstatus_to_werror(nterr);
515
if (r->in.parm_error) {
516
r->out.parm_error = r->in.parm_error;
523
if (r->in.parm_error) {
524
r->out.parm_error = r->in.parm_error;
526
return WERR_NOT_SUPPORTED;
531
struct share_info *info;
532
struct share_context *sctx;
536
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);
537
if (!NT_STATUS_IS_OK(nterr)) {
538
return ntstatus_to_werror(nterr);
541
/* there are no more than 10 options in struct srvsvc_NetShareInfo502 */
542
info = talloc_array(mem_ctx, struct share_info, count);
543
W_ERROR_HAVE_NO_MEMORY(info);
547
info[i].name = SHARE_TYPE;
548
info[i].type = SHARE_INFO_STRING;
549
switch (r->in.info->info502->type) {
551
info[i].value = talloc_strdup(info, "DISK");
554
info[i].value = talloc_strdup(info, "PRINTER");
557
info[i].value = talloc_strdup(info, "IPC");
560
return WERR_INVALID_PARAM;
562
W_ERROR_HAVE_NO_MEMORY(info[i].value);
565
if (r->in.info->info502->path && r->in.info->info502->path[0]) {
566
info[i].name = SHARE_PATH;
567
info[i].type = SHARE_INFO_STRING;
569
/* Windows will send a path in a form of C:\example\path */
570
if (r->in.info->info502->path[1] == ':') {
571
info[i].value = talloc_strdup(info, &r->in.info->info502->path[2]);
573
/* very strange let's try to set as is */
574
info[i].value = talloc_strdup(info, r->in.info->info502->path);
576
W_ERROR_HAVE_NO_MEMORY(info[i].value);
577
all_string_sub((char *)info[i].value, "\\", "/", 0);
582
if (r->in.info->info502->comment && r->in.info->info502->comment[0]) {
583
info[i].name = SHARE_COMMENT;
584
info[i].type = SHARE_INFO_STRING;
585
info[i].value = talloc_strdup(info, r->in.info->info502->comment);
586
W_ERROR_HAVE_NO_MEMORY(info[i].value);
591
if (r->in.info->info502->password && r->in.info->info502->password[0]) {
592
info[i].name = SHARE_PASSWORD;
593
info[i].type = SHARE_INFO_STRING;
594
info[i].value = talloc_strdup(info, r->in.info->info502->password);
595
W_ERROR_HAVE_NO_MEMORY(info[i].value);
600
info[i].name = SHARE_MAX_CONNECTIONS;
601
info[i].type = SHARE_INFO_INT;
602
info[i].value = talloc(info, int);
603
*((int *)info[i].value) = r->in.info->info502->max_users;
606
/* TODO: security descriptor */
608
nterr = share_create(sctx, r->in.info->info502->name, info, i);
609
if (!NT_STATUS_IS_OK(nterr)) {
610
return ntstatus_to_werror(nterr);
613
if (r->in.parm_error) {
614
r->out.parm_error = r->in.parm_error;
620
return WERR_UNKNOWN_LEVEL;
623
return WERR_UNKNOWN_LEVEL;
626
static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
627
struct share_config *scfg, uint32_t level,
628
union srvsvc_NetShareInfo *info)
630
struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
635
info->info0->name = talloc_strdup(mem_ctx, scfg->name);
636
W_ERROR_HAVE_NO_MEMORY(info->info0->name);
642
info->info1->name = talloc_strdup(mem_ctx, scfg->name);
643
W_ERROR_HAVE_NO_MEMORY(info->info1->name);
644
info->info1->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
645
info->info1->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
646
W_ERROR_HAVE_NO_MEMORY(info->info1->comment);
652
info->info2->name = talloc_strdup(mem_ctx, scfg->name);
653
W_ERROR_HAVE_NO_MEMORY(info->info2->name);
654
info->info2->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
655
info->info2->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
656
W_ERROR_HAVE_NO_MEMORY(info->info2->comment);
657
info->info2->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
658
info->info2->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
659
info->info2->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
660
info->info2->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
661
W_ERROR_HAVE_NO_MEMORY(info->info2->path);
662
info->info2->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
668
info->info501->name = talloc_strdup(mem_ctx, scfg->name);
669
W_ERROR_HAVE_NO_MEMORY(info->info501->name);
670
info->info501->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
671
info->info501->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
672
W_ERROR_HAVE_NO_MEMORY(info->info501->comment);
673
info->info501->csc_policy = share_int_option(scfg, SHARE_CSC_POLICY, SHARE_CSC_POLICY_DEFAULT);
679
info->info502->name = talloc_strdup(mem_ctx, scfg->name);
680
W_ERROR_HAVE_NO_MEMORY(info->info502->name);
681
info->info502->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
682
info->info502->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, ""));
683
W_ERROR_HAVE_NO_MEMORY(info->info502->comment);
684
info->info502->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg);
685
info->info502->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT);
686
info->info502->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg);
687
info->info502->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg);
688
W_ERROR_HAVE_NO_MEMORY(info->info502->path);
689
info->info502->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL));
690
info->info502->sd_buf.sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, scfg);
696
info->info1005->dfs_flags = dcesrv_common_get_share_dfs_flags(mem_ctx, dce_ctx, scfg);
701
return WERR_UNKNOWN_LEVEL;
704
return WERR_UNKNOWN_LEVEL;
708
srvsvc_NetShareEnumAll
710
static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
711
struct srvsvc_NetShareEnumAll *r)
716
struct share_context *sctx;
717
struct share_config *scfg;
719
*r->out.totalentries = 0;
721
/* TODO: - paging of results
724
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);
725
if (!NT_STATUS_IS_OK(nterr)) {
726
return ntstatus_to_werror(nterr);
729
nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
730
if (!NT_STATUS_IS_OK(nterr)) {
731
return ntstatus_to_werror(nterr);
734
switch (r->in.info_ctr->level) {
738
struct srvsvc_NetShareCtr0 *ctr0;
740
ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
741
W_ERROR_HAVE_NO_MEMORY(ctr0);
743
ctr0->count = numshares;
746
if (ctr0->count == 0) {
747
r->out.info_ctr->ctr.ctr0 = ctr0;
751
ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, ctr0->count);
752
W_ERROR_HAVE_NO_MEMORY(ctr0->array);
754
for (i = 0; i < ctr0->count; i++) {
756
union srvsvc_NetShareInfo info;
758
nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
759
if (!NT_STATUS_IS_OK(nterr)) {
760
DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
761
return WERR_GENERAL_FAILURE;
763
info.info0 = &ctr0->array[i];
764
status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
765
if (!W_ERROR_IS_OK(status)) {
772
r->out.info_ctr->ctr.ctr0 = ctr0;
773
*r->out.totalentries = r->out.info_ctr->ctr.ctr0->count;
779
struct srvsvc_NetShareCtr1 *ctr1;
781
ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
782
W_ERROR_HAVE_NO_MEMORY(ctr1);
784
ctr1->count = numshares;
787
if (ctr1->count == 0) {
788
r->out.info_ctr->ctr.ctr1 = ctr1;
792
ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, ctr1->count);
793
W_ERROR_HAVE_NO_MEMORY(ctr1->array);
795
for (i=0; i < ctr1->count; i++) {
797
union srvsvc_NetShareInfo info;
799
nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
800
if (!NT_STATUS_IS_OK(nterr)) {
801
DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
802
return WERR_GENERAL_FAILURE;
804
info.info1 = &ctr1->array[i];
805
status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
806
if (!W_ERROR_IS_OK(status)) {
813
r->out.info_ctr->ctr.ctr1 = ctr1;
814
*r->out.totalentries = r->out.info_ctr->ctr.ctr1->count;
821
struct srvsvc_NetShareCtr2 *ctr2;
823
SRVSVC_CHECK_ADMIN_ACCESS;
825
ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
826
W_ERROR_HAVE_NO_MEMORY(ctr2);
828
ctr2->count = numshares;
831
if (ctr2->count == 0) {
832
r->out.info_ctr->ctr.ctr2 = ctr2;
836
ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, ctr2->count);
837
W_ERROR_HAVE_NO_MEMORY(ctr2->array);
839
for (i=0; i < ctr2->count; i++) {
841
union srvsvc_NetShareInfo info;
843
nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
844
if (!NT_STATUS_IS_OK(nterr)) {
845
DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
846
return WERR_GENERAL_FAILURE;
848
info.info2 = &ctr2->array[i];
849
status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
850
if (!W_ERROR_IS_OK(status)) {
857
r->out.info_ctr->ctr.ctr2 = ctr2;
858
*r->out.totalentries = r->out.info_ctr->ctr.ctr2->count;
865
struct srvsvc_NetShareCtr501 *ctr501;
867
SRVSVC_CHECK_ADMIN_ACCESS;
869
ctr501 = talloc(mem_ctx, struct srvsvc_NetShareCtr501);
870
W_ERROR_HAVE_NO_MEMORY(ctr501);
872
ctr501->count = numshares;
873
ctr501->array = NULL;
875
if (ctr501->count == 0) {
876
r->out.info_ctr->ctr.ctr501 = ctr501;
880
ctr501->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo501, ctr501->count);
881
W_ERROR_HAVE_NO_MEMORY(ctr501->array);
883
for (i=0; i < ctr501->count; i++) {
885
union srvsvc_NetShareInfo info;
887
nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
888
if (!NT_STATUS_IS_OK(nterr)) {
889
DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
890
return WERR_GENERAL_FAILURE;
892
info.info501 = &ctr501->array[i];
893
status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
894
if (!W_ERROR_IS_OK(status)) {
901
r->out.info_ctr->ctr.ctr501 = ctr501;
902
*r->out.totalentries = r->out.info_ctr->ctr.ctr501->count;
909
struct srvsvc_NetShareCtr502 *ctr502;
911
SRVSVC_CHECK_ADMIN_ACCESS;
913
ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
914
W_ERROR_HAVE_NO_MEMORY(ctr502);
916
ctr502->count = numshares;
917
ctr502->array = NULL;
919
if (ctr502->count == 0) {
920
r->out.info_ctr->ctr.ctr502 = ctr502;
924
ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, ctr502->count);
925
W_ERROR_HAVE_NO_MEMORY(ctr502->array);
927
for (i=0; i < ctr502->count; i++) {
929
union srvsvc_NetShareInfo info;
931
nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
932
if (!NT_STATUS_IS_OK(nterr)) {
933
DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
934
return WERR_GENERAL_FAILURE;
936
info.info502 = &ctr502->array[i];
937
status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
938
if (!W_ERROR_IS_OK(status)) {
945
r->out.info_ctr->ctr.ctr502 = ctr502;
946
*r->out.totalentries = r->out.info_ctr->ctr.ctr502->count;
951
return WERR_UNKNOWN_LEVEL;
954
return WERR_UNKNOWN_LEVEL;
959
srvsvc_NetShareGetInfo
961
static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
962
struct srvsvc_NetShareGetInfo *r)
965
struct share_context *sctx = NULL;
966
struct share_config *scfg = NULL;
968
ZERO_STRUCTP(r->out.info);
970
/* TODO: - access check
973
if (strcmp("", r->in.share_name) == 0) {
974
return WERR_INVALID_PARAM;
977
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);
978
if (!NT_STATUS_IS_OK(nterr)) {
979
return ntstatus_to_werror(nterr);
982
nterr = share_get_config(mem_ctx, sctx, r->in.share_name, &scfg);
983
if (!NT_STATUS_IS_OK(nterr)) {
984
return ntstatus_to_werror(nterr);
987
switch (r->in.level) {
991
union srvsvc_NetShareInfo info;
993
info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0);
994
W_ERROR_HAVE_NO_MEMORY(info.info0);
996
status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
997
if (!W_ERROR_IS_OK(status)) {
1001
r->out.info->info0 = info.info0;
1007
union srvsvc_NetShareInfo info;
1009
info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1);
1010
W_ERROR_HAVE_NO_MEMORY(info.info1);
1012
status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1013
if (!W_ERROR_IS_OK(status)) {
1017
r->out.info->info1 = info.info1;
1023
union srvsvc_NetShareInfo info;
1025
SRVSVC_CHECK_ADMIN_ACCESS;
1027
info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2);
1028
W_ERROR_HAVE_NO_MEMORY(info.info2);
1030
status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1031
if (!W_ERROR_IS_OK(status)) {
1035
r->out.info->info2 = info.info2;
1041
union srvsvc_NetShareInfo info;
1043
info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501);
1044
W_ERROR_HAVE_NO_MEMORY(info.info501);
1046
status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1047
if (!W_ERROR_IS_OK(status)) {
1051
r->out.info->info501 = info.info501;
1057
union srvsvc_NetShareInfo info;
1059
SRVSVC_CHECK_ADMIN_ACCESS;
1061
info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502);
1062
W_ERROR_HAVE_NO_MEMORY(info.info502);
1064
status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1065
if (!W_ERROR_IS_OK(status)) {
1069
r->out.info->info502 = info.info502;
1075
union srvsvc_NetShareInfo info;
1077
info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005);
1078
W_ERROR_HAVE_NO_MEMORY(info.info1005);
1080
status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info);
1081
if (!W_ERROR_IS_OK(status)) {
1085
r->out.info->info1005 = info.info1005;
1089
return WERR_UNKNOWN_LEVEL;
1092
return WERR_UNKNOWN_LEVEL;
1095
static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count,
1096
const char *share_name, int level,
1099
const char *comment,
1100
const char *password,
1101
enum srvsvc_ShareType type,
1103
uint32_t csc_policy,
1104
struct security_descriptor *sd)
1109
info[i].name = SHARE_CSC_POLICY;
1110
info[i].type = SHARE_INFO_INT;
1111
info[i].value = talloc(info, int);
1112
*((int *)info[i].value) = csc_policy;
1119
/* TODO: check if unknown is csc_policy */
1121
/* TODO: security descriptor */
1124
if (path && path[0]) {
1125
info[i].name = SHARE_PATH;
1126
info[i].type = SHARE_INFO_STRING;
1128
/* Windows will send a path in a form of C:\example\path */
1129
if (path[1] == ':') {
1130
info[i].value = talloc_strdup(info, &path[2]);
1132
/* very strange let's try to set as is */
1133
info[i].value = talloc_strdup(info, path);
1135
W_ERROR_HAVE_NO_MEMORY(info[i].value);
1136
all_string_sub((char *)info[i].value, "\\", "/", 0);
1141
if (password && password[0]) {
1142
info[i].name = SHARE_PASSWORD;
1143
info[i].type = SHARE_INFO_STRING;
1144
info[i].value = talloc_strdup(info, password);
1145
W_ERROR_HAVE_NO_MEMORY(info[i].value);
1150
info[i].name = SHARE_MAX_CONNECTIONS;
1151
info[i].type = SHARE_INFO_INT;
1152
info[i].value = talloc(info, int);
1153
*((int *)info[i].value) = max_users;
1158
info[i].name = SHARE_TYPE;
1159
info[i].type = SHARE_INFO_STRING;
1162
info[i].value = talloc_strdup(info, "DISK");
1165
info[i].value = talloc_strdup(info, "PRINTER");
1168
info[i].value = talloc_strdup(info, "IPC");
1171
return WERR_INVALID_PARAM;
1173
W_ERROR_HAVE_NO_MEMORY(info[i].value);
1178
info[i].name = SHARE_COMMENT;
1179
info[i].type = SHARE_INFO_STRING;
1180
info[i].value = talloc_strdup(info, comment);
1181
W_ERROR_HAVE_NO_MEMORY(info[i].value);
1187
strcasecmp(share_name, name) != 0) {
1188
info[i].name = SHARE_NAME;
1189
info[i].type = SHARE_INFO_STRING;
1190
info[i].value = talloc_strdup(info, name);
1191
W_ERROR_HAVE_NO_MEMORY(info[i].value);
1198
return WERR_UNKNOWN_LEVEL;
1207
srvsvc_NetShareSetInfo
1209
static WERROR dcesrv_srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1210
struct srvsvc_NetShareSetInfo *r)
1214
struct share_context *sctx = NULL;
1215
struct share_info *info;
1218
/* TODO: - access check
1221
/* there are no more than 10 options in all struct srvsvc_NetShareInfoXXX */
1222
info = talloc_array(mem_ctx, struct share_info, 10);
1223
W_ERROR_HAVE_NO_MEMORY(info);
1225
ZERO_STRUCT(r->out);
1227
if (strcmp("", r->in.share_name) == 0) {
1228
return WERR_INVALID_PARAM;
1231
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);
1232
if (!NT_STATUS_IS_OK(nterr)) {
1233
return ntstatus_to_werror(nterr);
1236
switch (r->in.level) {
1239
status = dcesrv_srvsvc_fill_share_info(info, &count,
1240
r->in.share_name, r->in.level,
1241
r->in.info->info0->name,
1249
if (W_ERROR_EQUAL(status, WERR_OK)) {
1256
status = dcesrv_srvsvc_fill_share_info(info, &count,
1257
r->in.share_name, r->in.level,
1258
r->in.info->info1->name,
1260
r->in.info->info1->comment,
1262
r->in.info->info1->type,
1266
if (W_ERROR_EQUAL(status, WERR_OK)) {
1273
status = dcesrv_srvsvc_fill_share_info(info, &count,
1274
r->in.share_name, r->in.level,
1275
r->in.info->info2->name,
1276
r->in.info->info2->path,
1277
r->in.info->info2->comment,
1278
r->in.info->info2->password,
1279
r->in.info->info2->type,
1280
r->in.info->info2->max_users,
1283
if (W_ERROR_EQUAL(status, WERR_OK)) {
1290
status = dcesrv_srvsvc_fill_share_info(info, &count,
1291
r->in.share_name, r->in.level,
1292
r->in.info->info501->name,
1294
r->in.info->info501->comment,
1296
r->in.info->info501->type,
1298
r->in.info->info501->csc_policy,
1300
if (W_ERROR_EQUAL(status, WERR_OK)) {
1307
status = dcesrv_srvsvc_fill_share_info(info, &count,
1308
r->in.share_name, r->in.level,
1309
r->in.info->info502->name,
1310
r->in.info->info502->path,
1311
r->in.info->info502->comment,
1312
r->in.info->info502->password,
1313
r->in.info->info502->type,
1314
r->in.info->info502->max_users,
1316
r->in.info->info502->sd_buf.sd);
1317
if (W_ERROR_EQUAL(status, WERR_OK)) {
1324
status = dcesrv_srvsvc_fill_share_info(info, &count,
1325
r->in.share_name, r->in.level,
1328
r->in.info->info1004->comment,
1334
if (W_ERROR_EQUAL(status, WERR_OK)) {
1341
/* r->in.info.dfs_flags; */
1343
if (r->in.parm_error) {
1344
r->out.parm_error = r->in.parm_error;
1350
return WERR_UNKNOWN_LEVEL;
1353
nterr = share_set(sctx, r->in.share_name, info, count);
1354
if (!NT_STATUS_IS_OK(nterr)) {
1355
return ntstatus_to_werror(nterr);
1358
if (r->in.parm_error) {
1359
r->out.parm_error = r->in.parm_error;
1367
srvsvc_NetShareDelSticky
1369
static WERROR dcesrv_srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1370
struct srvsvc_NetShareDelSticky *r)
1372
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1377
srvsvc_NetShareCheck
1379
static WERROR dcesrv_srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1380
struct srvsvc_NetShareCheck *r)
1383
struct share_context *sctx = NULL;
1384
struct share_config *scfg = NULL;
1391
/* TODO: - access check
1394
if (strcmp("", r->in.device_name) == 0) {
1395
*r->out.type = STYPE_IPC;
1399
/* copy the path skipping C:\ */
1400
if (strncasecmp(r->in.device_name, "C:", 2) == 0) {
1401
device = talloc_strdup(mem_ctx, &r->in.device_name[2]);
1403
/* no chance we have a share that doesn't start with C:\ */
1404
return WERR_DEVICE_NOT_SHARED;
1406
all_string_sub(device, "\\", "/", 0);
1408
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);
1409
if (!NT_STATUS_IS_OK(nterr)) {
1410
return ntstatus_to_werror(nterr);
1413
nterr = share_list_all(mem_ctx, sctx, &count, &names);
1414
if (!NT_STATUS_IS_OK(nterr)) {
1415
return ntstatus_to_werror(nterr);
1418
for (i = 0; i < count; i++) {
1422
nterr = share_get_config(mem_ctx, sctx, names[i], &scfg);
1423
if (!NT_STATUS_IS_OK(nterr)) {
1424
return ntstatus_to_werror(nterr);
1426
path = share_string_option(scfg, SHARE_PATH, NULL);
1427
if (!path) continue;
1429
if (strcmp(device, path) == 0) {
1430
type = share_string_option(scfg, SHARE_TYPE, NULL);
1431
if (!type) continue;
1433
if (strcmp(type, "DISK") == 0) {
1434
*r->out.type = STYPE_DISKTREE;
1438
if (strcmp(type, "IPC") == 0) {
1439
*r->out.type = STYPE_IPC;
1443
if (strcmp(type, "PRINTER") == 0) {
1444
*r->out.type = STYPE_PRINTQ;
1450
return WERR_DEVICE_NOT_SHARED;
1455
srvsvc_NetSrvGetInfo
1457
static WERROR dcesrv_srvsvc_NetSrvGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1458
struct srvsvc_NetSrvGetInfo *r)
1460
struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1461
struct dcerpc_server_info *server_info = lp_dcerpc_server_info(mem_ctx, dce_ctx->lp_ctx);
1463
ZERO_STRUCTP(r->out.info);
1465
switch (r->in.level) {
1468
struct srvsvc_NetSrvInfo100 *info100;
1470
info100 = talloc(mem_ctx, struct srvsvc_NetSrvInfo100);
1471
W_ERROR_HAVE_NO_MEMORY(info100);
1473
info100->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1474
info100->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1475
W_ERROR_HAVE_NO_MEMORY(info100->server_name);
1477
r->out.info->info100 = info100;
1482
struct srvsvc_NetSrvInfo101 *info101;
1484
info101 = talloc(mem_ctx, struct srvsvc_NetSrvInfo101);
1485
W_ERROR_HAVE_NO_MEMORY(info101);
1487
info101->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1488
info101->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1489
W_ERROR_HAVE_NO_MEMORY(info101->server_name);
1491
info101->version_major = server_info->version_major;
1492
info101->version_minor = server_info->version_minor;
1493
info101->server_type = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
1494
info101->comment = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
1495
W_ERROR_HAVE_NO_MEMORY(info101->comment);
1497
r->out.info->info101 = info101;
1502
struct srvsvc_NetSrvInfo102 *info102;
1504
info102 = talloc(mem_ctx, struct srvsvc_NetSrvInfo102);
1505
W_ERROR_HAVE_NO_MEMORY(info102);
1507
info102->platform_id = dcesrv_common_get_platform_id(mem_ctx, dce_ctx);
1508
info102->server_name = dcesrv_common_get_server_name(mem_ctx, dce_ctx, r->in.server_unc);
1509
W_ERROR_HAVE_NO_MEMORY(info102->server_name);
1511
info102->version_major = server_info->version_major;
1512
info102->version_minor = server_info->version_minor;
1513
info102->server_type = dcesrv_common_get_server_type(mem_ctx, dce_call->event_ctx, dce_ctx);
1514
info102->comment = talloc_strdup(mem_ctx, lp_serverstring(dce_ctx->lp_ctx));
1515
W_ERROR_HAVE_NO_MEMORY(info102->comment);
1517
info102->users = dcesrv_common_get_users(mem_ctx, dce_ctx);
1518
info102->disc = dcesrv_common_get_disc(mem_ctx, dce_ctx);
1519
info102->hidden = dcesrv_common_get_hidden(mem_ctx, dce_ctx);
1520
info102->announce = dcesrv_common_get_announce(mem_ctx, dce_ctx);
1521
info102->anndelta = dcesrv_common_get_anndelta(mem_ctx, dce_ctx);
1522
info102->licenses = dcesrv_common_get_licenses(mem_ctx, dce_ctx);
1523
info102->userpath = dcesrv_common_get_userpath(mem_ctx, dce_ctx);
1524
W_ERROR_HAVE_NO_MEMORY(info102->userpath);
1526
r->out.info->info102 = info102;
1530
return WERR_UNKNOWN_LEVEL;
1533
return WERR_UNKNOWN_LEVEL;
1538
srvsvc_NetSrvSetInfo
1540
static WERROR dcesrv_srvsvc_NetSrvSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1541
struct srvsvc_NetSrvSetInfo *r)
1543
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1550
static WERROR dcesrv_srvsvc_NetDiskEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1551
struct srvsvc_NetDiskEnum *r)
1553
r->out.info->disks = NULL;
1554
r->out.info->count = 0;
1555
*r->out.totalentries = 0;
1557
switch (r->in.level) {
1560
/* we can safely hardcode the reply and report we have only one disk (C:) */
1561
/* for some reason Windows wants 2 entries with the second being empty */
1562
r->out.info->disks = talloc_array(mem_ctx, struct srvsvc_NetDiskInfo0, 2);
1563
W_ERROR_HAVE_NO_MEMORY(r->out.info->disks);
1564
r->out.info->count = 2;
1566
r->out.info->disks[0].disk = talloc_strdup(mem_ctx, "C:");
1567
W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[0].disk);
1569
r->out.info->disks[1].disk = talloc_strdup(mem_ctx, "");
1570
W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[1].disk);
1572
*r->out.totalentries = 1;
1573
r->out.resume_handle = r->in.resume_handle;
1578
return WERR_UNKNOWN_LEVEL;
1581
return WERR_UNKNOWN_LEVEL;
1586
srvsvc_NetServerStatisticsGet
1588
static WERROR dcesrv_srvsvc_NetServerStatisticsGet(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1589
struct srvsvc_NetServerStatisticsGet *r)
1591
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1596
srvsvc_NetTransportAdd
1598
static WERROR dcesrv_srvsvc_NetTransportAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1599
struct srvsvc_NetTransportAdd *r)
1601
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1606
srvsvc_NetTransportEnum
1608
static WERROR dcesrv_srvsvc_NetTransportEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1609
struct srvsvc_NetTransportEnum *r)
1611
r->out.transports->level = r->in.transports->level;
1612
*r->out.totalentries = 0;
1613
if (r->out.resume_handle) {
1614
*r->out.resume_handle = 0;
1617
switch (r->in.transports->level) {
1620
r->out.transports->ctr.ctr0 = talloc(mem_ctx, struct srvsvc_NetTransportCtr0);
1621
W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr0);
1623
r->out.transports->ctr.ctr0->count = 0;
1624
r->out.transports->ctr.ctr0->array = NULL;
1626
return WERR_NOT_SUPPORTED;
1630
r->out.transports->ctr.ctr1 = talloc(mem_ctx, struct srvsvc_NetTransportCtr1);
1631
W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr1);
1633
r->out.transports->ctr.ctr1->count = 0;
1634
r->out.transports->ctr.ctr1->array = NULL;
1636
return WERR_NOT_SUPPORTED;
1640
r->out.transports->ctr.ctr2 = talloc(mem_ctx, struct srvsvc_NetTransportCtr2);
1641
W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr2);
1643
r->out.transports->ctr.ctr2->count = 0;
1644
r->out.transports->ctr.ctr2->array = NULL;
1646
return WERR_NOT_SUPPORTED;
1650
r->out.transports->ctr.ctr3 = talloc(mem_ctx, struct srvsvc_NetTransportCtr3);
1651
W_ERROR_HAVE_NO_MEMORY(r->out.transports->ctr.ctr3);
1653
r->out.transports->ctr.ctr3->count = 0;
1654
r->out.transports->ctr.ctr3->array = NULL;
1656
return WERR_NOT_SUPPORTED;
1659
return WERR_UNKNOWN_LEVEL;
1662
return WERR_UNKNOWN_LEVEL;
1666
srvsvc_NetTransportDel
1668
static WERROR dcesrv_srvsvc_NetTransportDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1669
struct srvsvc_NetTransportDel *r)
1671
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1678
static WERROR dcesrv_srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1679
struct srvsvc_NetRemoteTOD *r)
1681
struct timeval tval;
1684
struct srvsvc_NetRemoteTODInfo *info;
1686
info = talloc(mem_ctx, struct srvsvc_NetRemoteTODInfo);
1687
W_ERROR_HAVE_NO_MEMORY(info);
1689
GetTimeOfDay(&tval);
1695
/* TODO: fake the uptime: just return the milliseconds till 0:00:00 today */
1696
info->msecs = (tm.tm_hour*60*60*1000)
1697
+ (tm.tm_min*60*1000)
1699
+ (tval.tv_usec/1000);
1700
info->hours = tm.tm_hour;
1701
info->mins = tm.tm_min;
1702
info->secs = tm.tm_sec;
1703
info->hunds = tval.tv_usec/10000;
1704
info->timezone = get_time_zone(t)/60;
1705
info->tinterval = 310; /* just return the same as windows */
1706
info->day = tm.tm_mday;
1707
info->month = tm.tm_mon + 1;
1708
info->year = tm.tm_year + 1900;
1709
info->weekday = tm.tm_wday;
1711
*r->out.info = info;
1719
static WERROR dcesrv_srvsvc_NetPathType(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1720
struct srvsvc_NetPathType *r)
1722
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1727
srvsvc_NetPathCanonicalize
1729
static WERROR dcesrv_srvsvc_NetPathCanonicalize(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1730
struct srvsvc_NetPathCanonicalize *r)
1732
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1737
srvsvc_NetPathCompare
1739
static WERROR dcesrv_srvsvc_NetPathCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1740
struct srvsvc_NetPathCompare *r)
1742
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1747
srvsvc_NetNameValidate
1749
static WERROR dcesrv_srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1750
struct srvsvc_NetNameValidate *r)
1754
if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) {
1755
return WERR_INVALID_NAME;
1758
switch (r->in.name_type) {
1767
return WERR_NOT_SUPPORTED;
1769
case 9: /* validate share name */
1771
len = strlen_m(r->in.name);
1772
if ((r->in.flags == 0x0) && (len > 81)) {
1773
return WERR_INVALID_NAME;
1775
if ((r->in.flags == 0x80000000) && (len > 13)) {
1776
return WERR_INVALID_NAME;
1778
if (! dcesrv_common_validate_share_name(mem_ctx, r->in.name)) {
1779
return WERR_INVALID_NAME;
1787
return WERR_NOT_SUPPORTED;
1789
return WERR_INVALID_PARAM;
1792
return WERR_INVALID_PARAM;
1797
srvsvc_NetPRNameCompare
1799
static WERROR dcesrv_srvsvc_NetPRNameCompare(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1800
struct srvsvc_NetPRNameCompare *r)
1802
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
1809
static WERROR dcesrv_srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
1810
struct srvsvc_NetShareEnum *r)
1814
const char **snames;
1815
struct share_context *sctx;
1816
struct share_config *scfg;
1817
struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
1819
*r->out.totalentries = 0;
1821
/* TODO: - paging of results
1824
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);
1825
if (!NT_STATUS_IS_OK(nterr)) {
1826
return ntstatus_to_werror(nterr);
1829
nterr = share_list_all(mem_ctx, sctx, &numshares, &snames);
1830
if (!NT_STATUS_IS_OK(nterr)) {
1831
return ntstatus_to_werror(nterr);
1834
switch (r->in.info_ctr->level) {
1839
struct srvsvc_NetShareCtr0 *ctr0;
1841
ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
1842
W_ERROR_HAVE_NO_MEMORY(ctr0);
1845
ctr0->count = count;
1848
if (ctr0->count == 0) {
1849
r->out.info_ctr->ctr.ctr0 = ctr0;
1853
ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, count);
1854
W_ERROR_HAVE_NO_MEMORY(ctr0->array);
1856
for (i=0; i < count; i++) {
1858
union srvsvc_NetShareInfo info;
1859
enum srvsvc_ShareType type;
1861
nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1862
if (!NT_STATUS_IS_OK(nterr)) {
1863
DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1864
return WERR_GENERAL_FAILURE;
1867
type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1868
if (type & STYPE_HIDDEN) {
1874
info.info0 = &ctr0->array[y];
1875
status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
1876
W_ERROR_NOT_OK_RETURN(status);
1880
talloc_free(snames);
1882
r->out.info_ctr->ctr.ctr0 = ctr0;
1883
*r->out.totalentries = r->out.info_ctr->ctr.ctr0->count;
1891
struct srvsvc_NetShareCtr1 *ctr1;
1893
ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
1894
W_ERROR_HAVE_NO_MEMORY(ctr1);
1897
ctr1->count = count;
1900
if (ctr1->count == 0) {
1901
r->out.info_ctr->ctr.ctr1 = ctr1;
1905
ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, count);
1906
W_ERROR_HAVE_NO_MEMORY(ctr1->array);
1908
for (i=0; i < count; i++) {
1910
union srvsvc_NetShareInfo info;
1911
enum srvsvc_ShareType type;
1913
nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1914
if (!NT_STATUS_IS_OK(nterr)) {
1915
DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1916
return WERR_GENERAL_FAILURE;
1919
type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1920
if (type & STYPE_HIDDEN) {
1926
info.info1 = &ctr1->array[y];
1927
status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
1928
W_ERROR_NOT_OK_RETURN(status);
1932
talloc_free(snames);
1934
r->out.info_ctr->ctr.ctr1 = ctr1;
1935
*r->out.totalentries = r->out.info_ctr->ctr.ctr1->count;
1943
struct srvsvc_NetShareCtr2 *ctr2;
1945
SRVSVC_CHECK_ADMIN_ACCESS;
1947
ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
1948
W_ERROR_HAVE_NO_MEMORY(ctr2);
1951
ctr2->count = count;
1954
if (ctr2->count == 0) {
1955
r->out.info_ctr->ctr.ctr2 = ctr2;
1959
ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, count);
1960
W_ERROR_HAVE_NO_MEMORY(ctr2->array);
1962
for (i=0; i < count; i++) {
1964
union srvsvc_NetShareInfo info;
1965
enum srvsvc_ShareType type;
1967
nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
1968
if (!NT_STATUS_IS_OK(nterr)) {
1969
DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
1970
return WERR_GENERAL_FAILURE;
1973
type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
1974
if (type & STYPE_HIDDEN) {
1980
info.info2 = &ctr2->array[y];
1981
status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
1982
W_ERROR_NOT_OK_RETURN(status);
1986
talloc_free(snames);
1988
r->out.info_ctr->ctr.ctr2 = ctr2;
1989
*r->out.totalentries = r->out.info_ctr->ctr.ctr2->count;
1997
struct srvsvc_NetShareCtr502 *ctr502;
1999
SRVSVC_CHECK_ADMIN_ACCESS;
2001
ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
2002
W_ERROR_HAVE_NO_MEMORY(ctr502);
2005
ctr502->count = count;
2006
ctr502->array = NULL;
2008
if (ctr502->count == 0) {
2009
r->out.info_ctr->ctr.ctr502 = ctr502;
2013
ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, count);
2014
W_ERROR_HAVE_NO_MEMORY(ctr502->array);
2016
for (i=0; i < count; i++) {
2018
union srvsvc_NetShareInfo info;
2019
enum srvsvc_ShareType type;
2021
nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
2022
if (!NT_STATUS_IS_OK(nterr)) {
2023
DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
2024
return WERR_GENERAL_FAILURE;
2027
type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
2028
if (type & STYPE_HIDDEN) {
2034
info.info502 = &ctr502->array[y];
2035
status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.info_ctr->level, &info);
2036
W_ERROR_NOT_OK_RETURN(status);
2040
talloc_free(snames);
2042
r->out.info_ctr->ctr.ctr502 = ctr502;
2043
*r->out.totalentries = r->out.info_ctr->ctr.ctr502->count;
2048
return WERR_UNKNOWN_LEVEL;
2051
return WERR_UNKNOWN_LEVEL;
2056
srvsvc_NetShareDelStart
2058
static WERROR dcesrv_srvsvc_NetShareDelStart(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2059
struct srvsvc_NetShareDelStart *r)
2061
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2066
srvsvc_NetShareDelCommit
2068
static WERROR dcesrv_srvsvc_NetShareDelCommit(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2069
struct srvsvc_NetShareDelCommit *r)
2071
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2076
srvsvc_NetGetFileSecurity
2078
static WERROR dcesrv_srvsvc_NetGetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2079
struct srvsvc_NetGetFileSecurity *r)
2081
struct sec_desc_buf *sd_buf;
2082
struct ntvfs_context *ntvfs_ctx = NULL;
2083
struct ntvfs_request *ntvfs_req;
2084
union smb_fileinfo *io;
2087
nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
2088
if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2090
ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
2091
dce_call->conn->auth_state.session_info,
2095
W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
2097
sd_buf = talloc(mem_ctx, struct sec_desc_buf);
2098
W_ERROR_HAVE_NO_MEMORY(sd_buf);
2100
io = talloc(mem_ctx, union smb_fileinfo);
2101
W_ERROR_HAVE_NO_MEMORY(io);
2103
io->query_secdesc.level = RAW_FILEINFO_SEC_DESC;
2104
io->query_secdesc.in.file.path = r->in.file;
2105
io->query_secdesc.in.secinfo_flags = r->in.securityinformation;
2107
nt_status = ntvfs_qpathinfo(ntvfs_req, io);
2108
if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2110
sd_buf->sd = io->query_secdesc.out.sd;
2112
*r->out.sd_buf = sd_buf;
2118
srvsvc_NetSetFileSecurity
2120
static WERROR dcesrv_srvsvc_NetSetFileSecurity(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2121
struct srvsvc_NetSetFileSecurity *r)
2123
struct ntvfs_context *ntvfs_ctx;
2124
struct ntvfs_request *ntvfs_req;
2125
union smb_setfileinfo *io;
2128
nt_status = srvsvc_create_ntvfs_context(dce_call, mem_ctx, r->in.share, &ntvfs_ctx);
2129
if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2131
ntvfs_req = ntvfs_request_create(ntvfs_ctx, mem_ctx,
2132
dce_call->conn->auth_state.session_info,
2136
W_ERROR_HAVE_NO_MEMORY(ntvfs_req);
2138
io = talloc(mem_ctx, union smb_setfileinfo);
2139
W_ERROR_HAVE_NO_MEMORY(io);
2141
io->set_secdesc.level = RAW_FILEINFO_SEC_DESC;
2142
io->set_secdesc.in.file.path = r->in.file;
2143
io->set_secdesc.in.secinfo_flags = r->in.securityinformation;
2144
io->set_secdesc.in.sd = r->in.sd_buf->sd;
2146
nt_status = ntvfs_setpathinfo(ntvfs_req, io);
2147
if (!NT_STATUS_IS_OK(nt_status)) return ntstatus_to_werror(nt_status);
2154
srvsvc_NetServerTransportAddEx
2156
static WERROR dcesrv_srvsvc_NetServerTransportAddEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2157
struct srvsvc_NetServerTransportAddEx *r)
2159
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2164
srvsvc_NetServerSetServiceBitsEx
2166
static WERROR dcesrv_srvsvc_NetServerSetServiceBitsEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2167
struct srvsvc_NetServerSetServiceBitsEx *r)
2169
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2174
srvsvc_NETRDFSGETVERSION
2176
static WERROR dcesrv_srvsvc_NETRDFSGETVERSION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2177
struct srvsvc_NETRDFSGETVERSION *r)
2179
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2184
srvsvc_NETRDFSCREATELOCALPARTITION
2186
static WERROR dcesrv_srvsvc_NETRDFSCREATELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2187
struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
2189
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2194
srvsvc_NETRDFSDELETELOCALPARTITION
2196
static WERROR dcesrv_srvsvc_NETRDFSDELETELOCALPARTITION(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2197
struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
2199
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2204
srvsvc_NETRDFSSETLOCALVOLUMESTATE
2206
static WERROR dcesrv_srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2207
struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
2209
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2214
srvsvc_NETRDFSSETSERVERINFO
2216
static WERROR dcesrv_srvsvc_NETRDFSSETSERVERINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2217
struct srvsvc_NETRDFSSETSERVERINFO *r)
2219
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2224
srvsvc_NETRDFSCREATEEXITPOINT
2226
static WERROR dcesrv_srvsvc_NETRDFSCREATEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2227
struct srvsvc_NETRDFSCREATEEXITPOINT *r)
2229
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2234
srvsvc_NETRDFSDELETEEXITPOINT
2236
static WERROR dcesrv_srvsvc_NETRDFSDELETEEXITPOINT(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2237
struct srvsvc_NETRDFSDELETEEXITPOINT *r)
2239
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2244
srvsvc_NETRDFSMODIFYPREFIX
2246
static WERROR dcesrv_srvsvc_NETRDFSMODIFYPREFIX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2247
struct srvsvc_NETRDFSMODIFYPREFIX *r)
2249
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2254
srvsvc_NETRDFSFIXLOCALVOLUME
2256
static WERROR dcesrv_srvsvc_NETRDFSFIXLOCALVOLUME(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2257
struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
2259
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2264
srvsvc_NETRDFSMANAGERREPORTSITEINFO
2266
static WERROR dcesrv_srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2267
struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
2269
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2274
srvsvc_NETRSERVERTRANSPORTDELEX
2276
static WERROR dcesrv_srvsvc_NETRSERVERTRANSPORTDELEX(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2277
struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
2279
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2285
static WERROR dcesrv_srvsvc_NetShareDel(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2286
struct srvsvc_NetShareDel *r)
2289
struct share_context *sctx;
2291
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);
2292
if (!NT_STATUS_IS_OK(nterr)) {
2293
return ntstatus_to_werror(nterr);
2296
nterr = share_remove(sctx, r->in.share_name);
2297
if (!NT_STATUS_IS_OK(nterr)) {
2298
return ntstatus_to_werror(nterr);
2305
srvsvc_NetSetServiceBits
2307
static WERROR dcesrv_srvsvc_NetSetServiceBits(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2308
struct srvsvc_NetSetServiceBits *r)
2310
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2314
srvsvc_NETRPRNAMECANONICALIZE
2316
static WERROR dcesrv_srvsvc_NETRPRNAMECANONICALIZE(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
2317
struct srvsvc_NETRPRNAMECANONICALIZE *r)
2319
DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
2322
/* include the generated boilerplate */
2323
#include "librpc/gen_ndr/ndr_srvsvc_s.c"