2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-1997,
5 * Copyright (C) Jeremy Allison 2001.
6 * Copyright (C) Nigel Williams 2001.
7 * Copyright (C) Gerald (Jerry) Carter 2006.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, see <http://www.gnu.org/licenses/>.
23 /* This is the implementation of the srvsvc pipe. */
27 extern const struct generic_mapping file_generic_mapping;
30 #define DBGC_CLASS DBGC_RPC_SRV
32 /* Use for enumerating connections, pipes, & files */
34 struct file_enum_count {
37 struct srvsvc_NetFileCtr3 *ctr3;
40 struct sess_file_count {
46 /****************************************************************************
47 Count the entries belonging to a service in the connection db.
48 ****************************************************************************/
50 static int pipe_enum_fn( struct db_record *rec, void *p)
52 struct pipe_open_rec prec;
53 struct file_enum_count *fenum = (struct file_enum_count *)p;
54 struct srvsvc_NetFileInfo3 *f;
55 int i = fenum->ctr3->count;
56 char *fullpath = NULL;
59 if (rec->value.dsize != sizeof(struct pipe_open_rec))
62 memcpy(&prec, rec->value.dptr, sizeof(struct pipe_open_rec));
64 if ( !process_exists(prec.pid) ) {
68 username = uidtoname(prec.uid);
70 if ((fenum->username != NULL)
71 && !strequal(username, fenum->username)) {
75 fullpath = talloc_asprintf(fenum->ctx, "\\PIPE\\%s", prec.name );
80 f = TALLOC_REALLOC_ARRAY(fenum->ctx, fenum->ctr3->array,
81 struct srvsvc_NetFileInfo3, i+1);
83 DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
86 fenum->ctr3->array = f;
88 init_srvsvc_NetFileInfo3(&fenum->ctr3->array[i],
89 (uint32_t)((procid_to_pid(&prec.pid)<<16) & prec.pnum),
90 (FILE_READ_DATA|FILE_WRITE_DATA),
100 /*******************************************************************
101 ********************************************************************/
103 static WERROR net_enum_pipes(TALLOC_CTX *ctx,
104 const char *username,
105 struct srvsvc_NetFileCtr3 **ctr3,
108 struct file_enum_count fenum;
111 fenum.username = username;
114 if (connections_traverse(pipe_enum_fn, &fenum) == -1) {
115 DEBUG(0,("net_enum_pipes: traverse of connections.tdb "
125 /*******************************************************************
126 ********************************************************************/
128 static void enum_file_fn( const struct share_mode_entry *e,
129 const char *sharepath, const char *fname,
132 struct file_enum_count *fenum =
133 (struct file_enum_count *)private_data;
135 struct srvsvc_NetFileInfo3 *f;
136 int i = fenum->ctr3->count;
138 struct byte_range_lock *brl;
140 char *fullpath = NULL;
142 const char *username;
144 /* If the pid was not found delete the entry from connections.tdb */
146 if ( !process_exists(e->pid) ) {
150 username = uidtoname(e->uid);
152 if ((fenum->username != NULL)
153 && !strequal(username, fenum->username)) {
157 f = TALLOC_REALLOC_ARRAY(fenum->ctx, fenum->ctr3->array,
158 struct srvsvc_NetFileInfo3, i+1);
160 DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
163 fenum->ctr3->array = f;
165 /* need to count the number of locks on a file */
170 if ( (brl = brl_get_locks(talloc_tos(), &fsp)) != NULL ) {
171 num_locks = brl->num_locks;
175 if ( strcmp( fname, "." ) == 0 ) {
176 fullpath = talloc_asprintf(fenum->ctx, "C:%s", sharepath );
178 fullpath = talloc_asprintf(fenum->ctx, "C:%s/%s",
184 string_replace( fullpath, '/', '\\' );
186 /* mask out create (what ever that is) */
187 permissions = e->share_access & (FILE_READ_DATA|FILE_WRITE_DATA);
189 /* now fill in the srvsvc_NetFileInfo3 struct */
190 init_srvsvc_NetFileInfo3(&fenum->ctr3->array[i],
196 fenum->ctr3->count++;
199 /*******************************************************************
200 ********************************************************************/
202 static WERROR net_enum_files(TALLOC_CTX *ctx,
203 const char *username,
204 struct srvsvc_NetFileCtr3 **ctr3,
207 struct file_enum_count f_enum_cnt;
209 f_enum_cnt.ctx = ctx;
210 f_enum_cnt.username = username;
211 f_enum_cnt.ctr3 = *ctr3;
213 share_mode_forall( enum_file_fn, (void *)&f_enum_cnt );
215 *ctr3 = f_enum_cnt.ctr3;
220 /*******************************************************************
221 Utility function to get the 'type' of a share from an snum.
222 ********************************************************************/
223 static uint32 get_share_type(int snum)
225 /* work out the share type */
226 uint32 type = STYPE_DISKTREE;
228 if (lp_print_ok(snum))
230 if (strequal(lp_fstype(snum), "IPC"))
232 if (lp_administrative_share(snum))
233 type |= STYPE_HIDDEN;
238 /*******************************************************************
239 Fill in a share info level 0 structure.
240 ********************************************************************/
242 static void init_srv_share_info_0(pipes_struct *p, struct srvsvc_NetShareInfo0 *r, int snum)
244 const char *net_name = lp_servicename(snum);
246 init_srvsvc_NetShareInfo0(r, net_name);
249 /*******************************************************************
250 Fill in a share info level 1 structure.
251 ********************************************************************/
253 static void init_srv_share_info_1(pipes_struct *p, struct srvsvc_NetShareInfo1 *r, int snum)
255 char *net_name = lp_servicename(snum);
256 char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
259 remark = standard_sub_conn(p->mem_ctx,
264 init_srvsvc_NetShareInfo1(r, net_name,
265 get_share_type(snum),
266 remark ? remark : "");
269 /*******************************************************************
270 Fill in a share info level 2 structure.
271 ********************************************************************/
273 static void init_srv_share_info_2(pipes_struct *p, struct srvsvc_NetShareInfo2 *r, int snum)
277 int max_connections = lp_max_connections(snum);
278 uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff;
280 char *net_name = lp_servicename(snum);
282 remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
284 remark = standard_sub_conn(p->mem_ctx,
288 path = talloc_asprintf(p->mem_ctx,
289 "C:%s", lp_pathname(snum));
293 * Change / to \\ so that win2k will see it as a valid path.
294 * This was added to enable use of browsing in win2k add
298 string_replace(path, '/', '\\');
301 count = count_current_connections(net_name, false);
303 init_srvsvc_NetShareInfo2(r, net_name,
304 get_share_type(snum),
305 remark ? remark : "",
313 /*******************************************************************
314 Map any generic bits to file specific bits.
315 ********************************************************************/
317 static void map_generic_share_sd_bits(SEC_DESC *psd)
320 SEC_ACL *ps_dacl = NULL;
329 for (i = 0; i < ps_dacl->num_aces; i++) {
330 SEC_ACE *psa = &ps_dacl->aces[i];
331 uint32 orig_mask = psa->access_mask;
333 se_map_generic(&psa->access_mask, &file_generic_mapping);
334 psa->access_mask |= orig_mask;
338 /*******************************************************************
339 Fill in a share info level 501 structure.
340 ********************************************************************/
342 static void init_srv_share_info_501(pipes_struct *p, struct srvsvc_NetShareInfo501 *r, int snum)
344 const char *net_name = lp_servicename(snum);
345 char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
348 remark = standard_sub_conn(p->mem_ctx, p->conn, remark);
351 init_srvsvc_NetShareInfo501(r, net_name,
352 get_share_type(snum),
353 remark ? remark : "",
354 (lp_csc_policy(snum) << 4));
357 /*******************************************************************
358 Fill in a share info level 502 structure.
359 ********************************************************************/
361 static void init_srv_share_info_502(pipes_struct *p, struct srvsvc_NetShareInfo502 *r, int snum)
363 const char *net_name = lp_servicename(snum);
367 TALLOC_CTX *ctx = p->mem_ctx;
368 char *remark = talloc_strdup(ctx, lp_comment(snum));;
371 remark = standard_sub_conn(ctx, p->conn, remark);
373 path = talloc_asprintf(ctx, "C:%s", lp_pathname(snum));
376 * Change / to \\ so that win2k will see it as a valid path. This was added to
377 * enable use of browsing in win2k add share dialog.
379 string_replace(path, '/', '\\');
382 sd = get_share_security(ctx, lp_servicename(snum), &sd_size);
384 init_srvsvc_NetShareInfo502(r, net_name,
385 get_share_type(snum),
386 remark ? remark : "",
396 /***************************************************************************
397 Fill in a share info level 1004 structure.
398 ***************************************************************************/
400 static void init_srv_share_info_1004(pipes_struct *p, struct srvsvc_NetShareInfo1004 *r, int snum)
402 char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
405 remark = standard_sub_conn(p->mem_ctx, p->conn, remark);
408 init_srvsvc_NetShareInfo1004(r, remark ? remark : "");
411 /***************************************************************************
412 Fill in a share info level 1005 structure.
413 ***************************************************************************/
415 static void init_srv_share_info_1005(pipes_struct *p, struct srvsvc_NetShareInfo1005 *r, int snum)
417 uint32_t dfs_flags = 0;
419 if (lp_host_msdfs() && lp_msdfs_root(snum)) {
420 dfs_flags |= SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT;
423 dfs_flags |= lp_csc_policy(snum) << SHARE_1005_CSC_POLICY_SHIFT;
425 init_srvsvc_NetShareInfo1005(r, dfs_flags);
428 /***************************************************************************
429 Fill in a share info level 1006 structure.
430 ***************************************************************************/
432 static void init_srv_share_info_1006(pipes_struct *p, struct srvsvc_NetShareInfo1006 *r, int snum)
434 init_srvsvc_NetShareInfo1006(r, 0xffffffff);
437 /***************************************************************************
438 Fill in a share info level 1007 structure.
439 ***************************************************************************/
441 static void init_srv_share_info_1007(pipes_struct *p, struct srvsvc_NetShareInfo1007 *r, int snum)
445 init_srvsvc_NetShareInfo1007(r, flags, "");
448 /*******************************************************************
449 Fill in a share info level 1501 structure.
450 ********************************************************************/
452 static void init_srv_share_info_1501(pipes_struct *p, struct sec_desc_buf *r, int snum)
456 TALLOC_CTX *ctx = p->mem_ctx;
458 sd = get_share_security(ctx, lp_servicename(snum), &sd_size);
460 r = make_sec_desc_buf(p->mem_ctx, sd_size, sd);
463 /*******************************************************************
464 True if it ends in '$'.
465 ********************************************************************/
467 static bool is_hidden_share(int snum)
469 const char *net_name = lp_servicename(snum);
471 return (net_name[strlen(net_name) - 1] == '$') ? True : False;
474 /*******************************************************************
475 Fill in a share info structure.
476 ********************************************************************/
478 static WERROR init_srv_share_info_ctr(pipes_struct *p,
479 struct srvsvc_NetShareInfoCtr *info_ctr,
480 uint32_t *resume_handle_p,
481 uint32_t *total_entries,
485 int alloc_entries = 0;
486 int num_services = 0;
488 TALLOC_CTX *ctx = p->mem_ctx;
490 int valid_share_count = 0;
491 union srvsvc_NetShareCtr ctr;
492 uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0;
494 DEBUG(5,("init_srv_share_info_ctr\n"));
496 /* Ensure all the usershares are loaded. */
498 load_usershare_shares();
499 load_registry_shares();
500 num_services = lp_numservices();
503 /* Count the number of entries. */
504 for (snum = 0; snum < num_services; snum++) {
505 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
506 DEBUG(10, ("counting service %s\n", lp_servicename(snum)));
509 DEBUG(10, ("NOT counting service %s\n", lp_servicename(snum)));
513 if (!num_entries || (resume_handle >= num_entries)) {
517 /* Calculate alloc entries. */
518 alloc_entries = num_entries - resume_handle;
519 switch (info_ctr->level) {
521 ctr.ctr0 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr0);
522 W_ERROR_HAVE_NO_MEMORY(ctr.ctr0);
524 ctr.ctr0->count = alloc_entries;
525 ctr.ctr0->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo0, alloc_entries);
526 W_ERROR_HAVE_NO_MEMORY(ctr.ctr0->array);
528 for (snum = 0; snum < num_services; snum++) {
529 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) &&
530 (resume_handle <= (i + valid_share_count++)) ) {
531 init_srv_share_info_0(p, &ctr.ctr0->array[i++], snum);
538 ctr.ctr1 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1);
539 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1);
541 ctr.ctr1->count = alloc_entries;
542 ctr.ctr1->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1, alloc_entries);
543 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1->array);
545 for (snum = 0; snum < num_services; snum++) {
546 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) &&
547 (resume_handle <= (i + valid_share_count++)) ) {
548 init_srv_share_info_1(p, &ctr.ctr1->array[i++], snum);
555 ctr.ctr2 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr2);
556 W_ERROR_HAVE_NO_MEMORY(ctr.ctr2);
558 ctr.ctr2->count = alloc_entries;
559 ctr.ctr2->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo2, alloc_entries);
560 W_ERROR_HAVE_NO_MEMORY(ctr.ctr2->array);
562 for (snum = 0; snum < num_services; snum++) {
563 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) &&
564 (resume_handle <= (i + valid_share_count++)) ) {
565 init_srv_share_info_2(p, &ctr.ctr2->array[i++], snum);
572 ctr.ctr501 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr501);
573 W_ERROR_HAVE_NO_MEMORY(ctr.ctr501);
575 ctr.ctr501->count = alloc_entries;
576 ctr.ctr501->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo501, alloc_entries);
577 W_ERROR_HAVE_NO_MEMORY(ctr.ctr501->array);
579 for (snum = 0; snum < num_services; snum++) {
580 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) &&
581 (resume_handle <= (i + valid_share_count++)) ) {
582 init_srv_share_info_501(p, &ctr.ctr501->array[i++], snum);
589 ctr.ctr502 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr502);
590 W_ERROR_HAVE_NO_MEMORY(ctr.ctr502);
592 ctr.ctr502->count = alloc_entries;
593 ctr.ctr502->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo502, alloc_entries);
594 W_ERROR_HAVE_NO_MEMORY(ctr.ctr502->array);
596 for (snum = 0; snum < num_services; snum++) {
597 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) &&
598 (resume_handle <= (i + valid_share_count++)) ) {
599 init_srv_share_info_502(p, &ctr.ctr502->array[i++], snum);
606 ctr.ctr1004 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1004);
607 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1004);
609 ctr.ctr1004->count = alloc_entries;
610 ctr.ctr1004->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1004, alloc_entries);
611 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1004->array);
613 for (snum = 0; snum < num_services; snum++) {
614 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) &&
615 (resume_handle <= (i + valid_share_count++)) ) {
616 init_srv_share_info_1004(p, &ctr.ctr1004->array[i++], snum);
623 ctr.ctr1005 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1005);
624 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1005);
626 ctr.ctr1005->count = alloc_entries;
627 ctr.ctr1005->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1005, alloc_entries);
628 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1005->array);
630 for (snum = 0; snum < num_services; snum++) {
631 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) &&
632 (resume_handle <= (i + valid_share_count++)) ) {
633 init_srv_share_info_1005(p, &ctr.ctr1005->array[i++], snum);
640 ctr.ctr1006 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1006);
641 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1006);
643 ctr.ctr1006->count = alloc_entries;
644 ctr.ctr1006->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1006, alloc_entries);
645 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1006->array);
647 for (snum = 0; snum < num_services; snum++) {
648 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) &&
649 (resume_handle <= (i + valid_share_count++)) ) {
650 init_srv_share_info_1006(p, &ctr.ctr1006->array[i++], snum);
657 ctr.ctr1007 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1007);
658 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1007);
660 ctr.ctr1007->count = alloc_entries;
661 ctr.ctr1007->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1007, alloc_entries);
662 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1007->array);
664 for (snum = 0; snum < num_services; snum++) {
665 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) &&
666 (resume_handle <= (i + valid_share_count++)) ) {
667 init_srv_share_info_1007(p, &ctr.ctr1007->array[i++], snum);
674 ctr.ctr1501 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1501);
675 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1501);
677 ctr.ctr1501->count = alloc_entries;
678 ctr.ctr1501->array = TALLOC_ZERO_ARRAY(ctx, struct sec_desc_buf, alloc_entries);
679 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1501->array);
681 for (snum = 0; snum < num_services; snum++) {
682 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) &&
683 (resume_handle <= (i + valid_share_count++)) ) {
684 init_srv_share_info_1501(p, &ctr.ctr1501->array[i++], snum);
691 DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n",
693 return WERR_UNKNOWN_LEVEL;
696 *total_entries = alloc_entries;
697 if (resume_handle_p) {
699 *resume_handle_p = (num_entries == 0) ? *resume_handle_p : 0;
701 *resume_handle_p = num_entries;
710 /*******************************************************************
711 fill in a sess info level 0 structure.
712 ********************************************************************/
714 static void init_srv_sess_info_0(pipes_struct *p, SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *stot)
716 struct sessionid *session_list;
717 uint32 num_entries = 0;
718 (*stot) = list_sessions(p->mem_ctx, &session_list);
727 DEBUG(5,("init_srv_sess_0_ss0\n"));
730 for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) {
731 init_srv_sess_info0( &ss0->info_0[num_entries], session_list[(*snum)].remote_machine);
735 ss0->num_entries_read = num_entries;
736 ss0->ptr_sess_info = num_entries > 0 ? 1 : 0;
737 ss0->num_entries_read2 = num_entries;
739 if ((*snum) >= (*stot)) {
744 ss0->num_entries_read = 0;
745 ss0->ptr_sess_info = 0;
746 ss0->num_entries_read2 = 0;
750 /*******************************************************************
751 ********************************************************************/
753 static void sess_file_fn( const struct share_mode_entry *e,
754 const char *sharepath, const char *fname,
757 struct sess_file_count *sess = (struct sess_file_count *)data;
759 if ( procid_equal(&e->pid, &sess->pid) && (sess->uid == e->uid) ) {
766 /*******************************************************************
767 ********************************************************************/
769 static int net_count_files( uid_t uid, struct server_id pid )
771 struct sess_file_count s_file_cnt;
773 s_file_cnt.count = 0;
774 s_file_cnt.uid = uid;
775 s_file_cnt.pid = pid;
777 share_mode_forall( sess_file_fn, &s_file_cnt );
779 return s_file_cnt.count;
782 /*******************************************************************
783 fill in a sess info level 1 structure.
784 ********************************************************************/
786 static void init_srv_sess_info_1(pipes_struct *p, SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *stot)
788 struct sessionid *session_list;
789 uint32 num_entries = 0;
790 time_t now = time(NULL);
793 ss1->num_entries_read = 0;
794 ss1->ptr_sess_info = 0;
795 ss1->num_entries_read2 = 0;
807 (*stot) = list_sessions(p->mem_ctx, &session_list);
810 for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) {
813 struct passwd *pw = sys_getpwnam(session_list[*snum].username);
817 DEBUG(10,("init_srv_sess_info_1: failed to find owner: %s\n",
818 session_list[*snum].username));
822 connect_time = (uint32)(now - session_list[*snum].connect_start);
823 num_files = net_count_files(pw->pw_uid, session_list[*snum].pid);
824 guest = strequal( session_list[*snum].username, lp_guestaccount() );
826 init_srv_sess_info1( &ss1->info_1[num_entries],
827 session_list[*snum].remote_machine,
828 session_list[*snum].username,
836 ss1->num_entries_read = num_entries;
837 ss1->ptr_sess_info = num_entries > 0 ? 1 : 0;
838 ss1->num_entries_read2 = num_entries;
840 if ((*snum) >= (*stot)) {
846 /*******************************************************************
847 makes a SRV_R_NET_SESS_ENUM structure.
848 ********************************************************************/
850 static WERROR init_srv_sess_info_ctr(pipes_struct *p, SRV_SESS_INFO_CTR *ctr,
851 int switch_value, uint32 *resume_hnd, uint32 *total_entries)
853 WERROR status = WERR_OK;
854 DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__));
856 ctr->switch_value = switch_value;
858 switch (switch_value) {
860 init_srv_sess_info_0(p, &(ctr->sess.info0), resume_hnd, total_entries);
861 ctr->ptr_sess_ctr = 1;
864 init_srv_sess_info_1(p, &(ctr->sess.info1), resume_hnd, total_entries);
865 ctr->ptr_sess_ctr = 1;
868 DEBUG(5,("init_srv_sess_info_ctr: unsupported switch value %d\n", switch_value));
870 (*total_entries) = 0;
871 ctr->ptr_sess_ctr = 0;
872 status = WERR_UNKNOWN_LEVEL;
879 /*******************************************************************
880 makes a SRV_R_NET_SESS_ENUM structure.
881 ********************************************************************/
883 static void init_srv_r_net_sess_enum(pipes_struct *p, SRV_R_NET_SESS_ENUM *r_n,
884 uint32 resume_hnd, int sess_level, int switch_value)
886 DEBUG(5,("init_srv_r_net_sess_enum: %d\n", __LINE__));
888 r_n->sess_level = sess_level;
890 if (sess_level == -1)
891 r_n->status = WERR_UNKNOWN_LEVEL;
893 r_n->status = init_srv_sess_info_ctr(p, r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
895 if (!W_ERROR_IS_OK(r_n->status))
898 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
901 /*******************************************************************
902 fill in a conn info level 0 structure.
903 ********************************************************************/
905 static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *stot)
907 uint32 num_entries = 0;
915 DEBUG(5,("init_srv_conn_0_ss0\n"));
918 for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {
920 init_srv_conn_info0(&ss0->info_0[num_entries], (*stot));
922 /* move on to creating next connection */
923 /* move on to creating next conn */
927 ss0->num_entries_read = num_entries;
928 ss0->ptr_conn_info = num_entries > 0 ? 1 : 0;
929 ss0->num_entries_read2 = num_entries;
931 if ((*snum) >= (*stot)) {
936 ss0->num_entries_read = 0;
937 ss0->ptr_conn_info = 0;
938 ss0->num_entries_read2 = 0;
944 /*******************************************************************
945 fill in a conn info level 1 structure.
946 ********************************************************************/
948 static void init_srv_conn_1_info(CONN_INFO_1 *se1, CONN_INFO_1_STR *str1,
949 uint32 id, uint32 type,
950 uint32 num_opens, uint32 num_users, uint32 open_time,
951 const char *usr_name, const char *net_name)
953 init_srv_conn_info1(se1 , id, type, num_opens, num_users, open_time, usr_name, net_name);
954 init_srv_conn_info1_str(str1, usr_name, net_name);
957 /*******************************************************************
958 fill in a conn info level 1 structure.
959 ********************************************************************/
961 static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *stot)
963 uint32 num_entries = 0;
971 DEBUG(5,("init_srv_conn_1_ss1\n"));
974 for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {
975 init_srv_conn_1_info(&ss1->info_1[num_entries],
976 &ss1->info_1_str[num_entries],
977 (*stot), 0x3, 1, 1, 3,"dummy_user", "IPC$");
979 /* move on to creating next connection */
980 /* move on to creating next conn */
984 ss1->num_entries_read = num_entries;
985 ss1->ptr_conn_info = num_entries > 0 ? 1 : 0;
986 ss1->num_entries_read2 = num_entries;
989 if ((*snum) >= (*stot)) {
994 ss1->num_entries_read = 0;
995 ss1->ptr_conn_info = 0;
996 ss1->num_entries_read2 = 0;
1002 /*******************************************************************
1003 makes a SRV_R_NET_CONN_ENUM structure.
1004 ********************************************************************/
1006 static WERROR init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr,
1007 int switch_value, uint32 *resume_hnd, uint32 *total_entries)
1009 WERROR status = WERR_OK;
1010 DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__));
1012 ctr->switch_value = switch_value;
1014 switch (switch_value) {
1016 init_srv_conn_info_0(&ctr->conn.info0, resume_hnd, total_entries);
1017 ctr->ptr_conn_ctr = 1;
1020 init_srv_conn_info_1(&ctr->conn.info1, resume_hnd, total_entries);
1021 ctr->ptr_conn_ctr = 1;
1024 DEBUG(5,("init_srv_conn_info_ctr: unsupported switch value %d\n", switch_value));
1026 (*total_entries) = 0;
1027 ctr->ptr_conn_ctr = 0;
1028 status = WERR_UNKNOWN_LEVEL;
1035 /*******************************************************************
1036 makes a SRV_R_NET_CONN_ENUM structure.
1037 ********************************************************************/
1039 static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n,
1040 uint32 resume_hnd, int conn_level, int switch_value)
1042 DEBUG(5,("init_srv_r_net_conn_enum: %d\n", __LINE__));
1044 r_n->conn_level = conn_level;
1045 if (conn_level == -1)
1046 r_n->status = WERR_UNKNOWN_LEVEL;
1048 r_n->status = init_srv_conn_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
1050 if (!W_ERROR_IS_OK(r_n->status))
1053 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
1056 /*******************************************************************
1058 *******************************************************************/
1060 WERROR _srvsvc_NetFileEnum(pipes_struct *p,
1061 struct srvsvc_NetFileEnum *r)
1063 TALLOC_CTX *ctx = NULL;
1064 struct srvsvc_NetFileCtr3 *ctr3;
1065 uint32_t resume_hnd = 0;
1068 switch (r->in.info_ctr->level) {
1072 return WERR_UNKNOWN_LEVEL;
1076 ctr3 = r->in.info_ctr->ctr.ctr3;
1081 /* TODO -- Windows enumerates
1083 (c) open directories and files */
1085 werr = net_enum_files(ctx, r->in.user, &ctr3, resume_hnd);
1086 if (!W_ERROR_IS_OK(werr)) {
1090 werr = net_enum_pipes(ctx, r->in.user, &ctr3, resume_hnd);
1091 if (!W_ERROR_IS_OK(werr)) {
1095 *r->out.totalentries = ctr3->count;
1096 r->out.info_ctr->ctr.ctr3->array = ctr3->array;
1097 r->out.info_ctr->ctr.ctr3->count = ctr3->count;
1105 /*******************************************************************
1106 _srvsvc_NetSrvGetInfo
1107 ********************************************************************/
1109 WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p,
1110 struct srvsvc_NetSrvGetInfo *r)
1112 WERROR status = WERR_OK;
1114 DEBUG(5,("_srvsvc_NetSrvGetInfo: %d\n", __LINE__));
1116 if (!pipe_access_check(p)) {
1117 DEBUG(3, ("access denied to _srvsvc_NetSrvGetInfo\n"));
1118 return WERR_ACCESS_DENIED;
1121 switch (r->in.level) {
1123 /* Technically level 102 should only be available to
1124 Administrators but there isn't anything super-secret
1125 here, as most of it is made up. */
1128 struct srvsvc_NetSrvInfo102 *info102;
1130 info102 = TALLOC_P(p->mem_ctx, struct srvsvc_NetSrvInfo102);
1135 init_srvsvc_NetSrvInfo102(info102,
1138 lp_major_announce_version(),
1139 lp_minor_announce_version(),
1140 lp_default_server_announce(),
1141 string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH),
1142 0xffffffff, /* users */
1146 3000, /* announce delta */
1147 100000, /* licenses */
1148 "c:\\"); /* user path */
1149 r->out.info->info102 = info102;
1153 struct srvsvc_NetSrvInfo101 *info101;
1155 info101 = TALLOC_P(p->mem_ctx, struct srvsvc_NetSrvInfo101);
1160 init_srvsvc_NetSrvInfo101(info101,
1163 lp_major_announce_version(),
1164 lp_minor_announce_version(),
1165 lp_default_server_announce(),
1166 string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH));
1167 r->out.info->info101 = info101;
1171 struct srvsvc_NetSrvInfo100 *info100;
1173 info100 = TALLOC_P(p->mem_ctx, struct srvsvc_NetSrvInfo100);
1178 init_srvsvc_NetSrvInfo100(info100,
1181 r->out.info->info100 = info100;
1186 status = WERR_UNKNOWN_LEVEL;
1190 DEBUG(5,("_srvsvc_NetSrvGetInfo: %d\n", __LINE__));
1195 /*******************************************************************
1196 _srvsvc_NetSrvSetInfo
1197 ********************************************************************/
1199 WERROR _srvsvc_NetSrvSetInfo(pipes_struct *p,
1200 struct srvsvc_NetSrvSetInfo *r)
1202 WERROR status = WERR_OK;
1204 DEBUG(5,("_srvsvc_NetSrvSetInfo: %d\n", __LINE__));
1206 /* Set up the net server set info structure. */
1208 DEBUG(5,("_srvsvc_NetSrvSetInfo: %d\n", __LINE__));
1213 /*******************************************************************
1215 ********************************************************************/
1217 WERROR _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u)
1219 DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));
1221 r_u->ctr = TALLOC_P(p->mem_ctx, SRV_CONN_INFO_CTR);
1225 ZERO_STRUCTP(r_u->ctr);
1228 init_srv_r_net_conn_enum(r_u,
1229 get_enum_hnd(&q_u->enum_hnd),
1231 q_u->ctr->switch_value);
1233 DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));
1238 /*******************************************************************
1240 ********************************************************************/
1242 WERROR _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u)
1244 DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));
1246 r_u->ctr = TALLOC_P(p->mem_ctx, SRV_SESS_INFO_CTR);
1250 ZERO_STRUCTP(r_u->ctr);
1253 init_srv_r_net_sess_enum(p, r_u,
1254 get_enum_hnd(&q_u->enum_hnd),
1256 q_u->ctr->switch_value);
1258 DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));
1263 /*******************************************************************
1265 ********************************************************************/
1267 WERROR _srvsvc_NetSessDel(pipes_struct *p,
1268 struct srvsvc_NetSessDel *r)
1270 struct sessionid *session_list;
1271 struct current_user user;
1272 int num_sessions, snum;
1273 const char *username;
1274 const char *machine;
1275 bool not_root = False;
1278 username = r->in.user;
1279 machine = r->in.client;
1281 /* strip leading backslashes if any */
1282 if (machine && machine[0] == '\\' && machine[1] == '\\') {
1286 num_sessions = list_sessions(p->mem_ctx, &session_list);
1288 DEBUG(5,("_srvsvc_NetSessDel: %d\n", __LINE__));
1290 werr = WERR_ACCESS_DENIED;
1292 get_current_user(&user, p);
1294 /* fail out now if you are not root or not a domain admin */
1296 if ((user.ut.uid != sec_initial_uid()) &&
1297 ( ! nt_token_check_domain_rid(p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS))) {
1302 for (snum = 0; snum < num_sessions; snum++) {
1304 if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) &&
1305 strequal(session_list[snum].remote_machine, machine)) {
1309 if (user.ut.uid != sec_initial_uid()) {
1314 ntstat = messaging_send(smbd_messaging_context(),
1315 session_list[snum].pid,
1316 MSG_SHUTDOWN, &data_blob_null);
1318 if (NT_STATUS_IS_OK(ntstat))
1326 DEBUG(5,("_srvsvc_NetSessDel: %d\n", __LINE__));
1333 /*******************************************************************
1334 _srvsvc_NetShareEnumAll
1335 ********************************************************************/
1337 WERROR _srvsvc_NetShareEnumAll(pipes_struct *p,
1338 struct srvsvc_NetShareEnumAll *r)
1342 DEBUG(5,("_srvsvc_NetShareEnumAll: %d\n", __LINE__));
1344 if (!pipe_access_check(p)) {
1345 DEBUG(3, ("access denied to _srvsvc_NetShareEnumAll\n"));
1346 return WERR_ACCESS_DENIED;
1349 /* Create the list of shares for the response. */
1350 werr = init_srv_share_info_ctr(p,
1352 r->in.resume_handle,
1353 r->out.totalentries,
1356 DEBUG(5,("_srvsvc_NetShareEnumAll: %d\n", __LINE__));
1361 /*******************************************************************
1362 _srvsvc_NetShareEnum
1363 ********************************************************************/
1365 WERROR _srvsvc_NetShareEnum(pipes_struct *p,
1366 struct srvsvc_NetShareEnum *r)
1370 DEBUG(5,("_srvsvc_NetShareEnum: %d\n", __LINE__));
1372 if (!pipe_access_check(p)) {
1373 DEBUG(3, ("access denied to _srvsvc_NetShareEnum\n"));
1374 return WERR_ACCESS_DENIED;
1377 /* Create the list of shares for the response. */
1378 werr = init_srv_share_info_ctr(p,
1380 r->in.resume_handle,
1381 r->out.totalentries,
1384 DEBUG(5,("_srvsvc_NetShareEnum: %d\n", __LINE__));
1389 /*******************************************************************
1390 _srvsvc_NetShareGetInfo
1391 ********************************************************************/
1393 WERROR _srvsvc_NetShareGetInfo(pipes_struct *p,
1394 struct srvsvc_NetShareGetInfo *r)
1396 WERROR status = WERR_OK;
1399 union srvsvc_NetShareInfo *info = r->out.info;
1401 DEBUG(5,("_srvsvc_NetShareGetInfo: %d\n", __LINE__));
1403 fstrcpy(share_name, r->in.share_name);
1405 snum = find_service(share_name);
1407 return WERR_INVALID_NAME;
1410 switch (r->in.level) {
1412 info->info0 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo0);
1413 W_ERROR_HAVE_NO_MEMORY(info->info0);
1414 init_srv_share_info_0(p, info->info0, snum);
1417 info->info1 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo1);
1418 W_ERROR_HAVE_NO_MEMORY(info->info1);
1419 init_srv_share_info_1(p, info->info1, snum);
1422 info->info2 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo2);
1423 W_ERROR_HAVE_NO_MEMORY(info->info2);
1424 init_srv_share_info_2(p, info->info2, snum);
1427 info->info501 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo501);
1428 W_ERROR_HAVE_NO_MEMORY(info->info501);
1429 init_srv_share_info_501(p, info->info501, snum);
1432 info->info502 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo502);
1433 W_ERROR_HAVE_NO_MEMORY(info->info502);
1434 init_srv_share_info_502(p, info->info502, snum);
1437 info->info1004 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo1004);
1438 W_ERROR_HAVE_NO_MEMORY(info->info1004);
1439 init_srv_share_info_1004(p, info->info1004, snum);
1442 info->info1005 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo1005);
1443 W_ERROR_HAVE_NO_MEMORY(info->info1005);
1444 init_srv_share_info_1005(p, info->info1005, snum);
1447 info->info1006 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo1006);
1448 W_ERROR_HAVE_NO_MEMORY(info->info1006);
1449 init_srv_share_info_1006(p, info->info1006, snum);
1452 info->info1007 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo1007);
1453 W_ERROR_HAVE_NO_MEMORY(info->info1007);
1454 init_srv_share_info_1007(p, info->info1007, snum);
1457 init_srv_share_info_1501(p, info->info1501, snum);
1460 DEBUG(5,("_srvsvc_NetShareGetInfo: unsupported switch value %d\n",
1462 status = WERR_UNKNOWN_LEVEL;
1466 DEBUG(5,("_srvsvc_NetShareGetInfo: %d\n", __LINE__));
1471 /*******************************************************************
1472 Check a given DOS pathname is valid for a share.
1473 ********************************************************************/
1475 char *valid_share_pathname(TALLOC_CTX *ctx, const char *dos_pathname)
1479 if (!dos_pathname) {
1483 ptr = talloc_strdup(ctx, dos_pathname);
1487 /* Convert any '\' paths to '/' */
1489 ptr = unix_clean_name(ctx, ptr);
1494 /* NT is braindead - it wants a C: prefix to a pathname ! So strip it. */
1495 if (strlen(ptr) > 2 && ptr[1] == ':' && ptr[0] != '/')
1498 /* Only absolute paths allowed. */
1505 /*******************************************************************
1506 _srvsvc_NetShareSetInfo. Modify share details.
1507 ********************************************************************/
1509 WERROR _srvsvc_NetShareSetInfo(pipes_struct *p,
1510 struct srvsvc_NetShareSetInfo *r)
1512 struct current_user user;
1513 char *command = NULL;
1514 char *share_name = NULL;
1515 char *comment = NULL;
1516 const char *pathname = NULL;
1521 SEC_DESC *psd = NULL;
1522 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1523 bool is_disk_op = False;
1524 int max_connections = 0;
1525 TALLOC_CTX *ctx = p->mem_ctx;
1526 union srvsvc_NetShareInfo *info = r->in.info;
1528 DEBUG(5,("_srvsvc_NetShareSetInfo: %d\n", __LINE__));
1530 share_name = talloc_strdup(p->mem_ctx, r->in.share_name);
1535 *r->out.parm_error = 0;
1537 if ( strequal(share_name,"IPC$")
1538 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") )
1539 || strequal(share_name,"global") )
1541 return WERR_ACCESS_DENIED;
1544 snum = find_service(share_name);
1546 /* Does this share exist ? */
1548 return WERR_NET_NAME_NOT_FOUND;
1550 /* No change to printer shares. */
1551 if (lp_print_ok(snum))
1552 return WERR_ACCESS_DENIED;
1554 get_current_user(&user,p);
1556 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1558 /* fail out now if you are not root and not a disk op */
1560 if ( user.ut.uid != sec_initial_uid() && !is_disk_op )
1561 return WERR_ACCESS_DENIED;
1563 switch (r->in.level) {
1565 pathname = talloc_strdup(ctx, lp_pathname(snum));
1566 comment = talloc_strdup(ctx, info->info2->comment);
1567 type = info->info2->type;
1571 comment = talloc_strdup(ctx, info->info2->comment);
1572 pathname = info->info2->path;
1573 type = info->info2->type;
1574 max_connections = (info->info2->max_users == 0xffffffff) ?
1575 0 : info->info2->max_users;
1579 /* not supported on set but here for completeness */
1581 comment = talloc_strdup(ctx, info->info501->comment);
1582 type = info->info501->type;
1587 comment = talloc_strdup(ctx, info->info502->comment);
1588 pathname = info->info502->path;
1589 type = info->info502->type;
1590 psd = info->info502->sd;
1591 map_generic_share_sd_bits(psd);
1594 pathname = talloc_strdup(ctx, lp_pathname(snum));
1595 comment = talloc_strdup(ctx, info->info1004->comment);
1596 type = STYPE_DISKTREE;
1599 /* XP re-sets the csc policy even if it wasn't changed by the
1600 user, so we must compare it to see if it's what is set in
1601 smb.conf, so that we can contine other ops like setting
1603 if (((info->info1005->dfs_flags &
1604 SHARE_1005_CSC_POLICY_MASK) >>
1605 SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum))
1608 DEBUG(3, ("_srvsvc_NetShareSetInfo: client is trying to change csc policy from the network; must be done with smb.conf\n"));
1609 return WERR_ACCESS_DENIED;
1613 return WERR_ACCESS_DENIED;
1615 pathname = talloc_strdup(ctx, lp_pathname(snum));
1616 comment = talloc_strdup(ctx, lp_comment(snum));
1617 psd = info->info1501->sd;
1618 map_generic_share_sd_bits(psd);
1619 type = STYPE_DISKTREE;
1622 DEBUG(5,("_srvsvc_NetShareSetInfo: unsupported switch value %d\n",
1624 return WERR_UNKNOWN_LEVEL;
1627 /* We can only modify disk shares. */
1628 if (type != STYPE_DISKTREE)
1629 return WERR_ACCESS_DENIED;
1631 /* Check if the pathname is valid. */
1632 if (!(path = valid_share_pathname(p->mem_ctx, pathname )))
1633 return WERR_OBJECT_PATH_INVALID;
1635 /* Ensure share name, pathname and comment don't contain '"' characters. */
1636 string_replace(share_name, '"', ' ');
1637 string_replace(path, '"', ' ');
1639 string_replace(comment, '"', ' ');
1642 DEBUG(10,("_srvsvc_NetShareSetInfo: change share command = %s\n",
1643 lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" ));
1645 /* Only call modify function if something changed. */
1647 if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum))
1648 || (lp_max_connections(snum) != max_connections)) {
1649 if (!lp_change_share_cmd() || !*lp_change_share_cmd()) {
1650 DEBUG(10,("_srvsvc_NetShareSetInfo: No change share command\n"));
1651 return WERR_ACCESS_DENIED;
1654 command = talloc_asprintf(p->mem_ctx,
1655 "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1656 lp_change_share_cmd(),
1657 get_dyn_CONFIGFILE(),
1660 comment ? comment : "",
1666 DEBUG(10,("_srvsvc_NetShareSetInfo: Running [%s]\n", command ));
1668 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1673 if ( (ret = smbrun(command, NULL)) == 0 ) {
1674 /* Tell everyone we updated smb.conf. */
1675 message_send_all(smbd_messaging_context(),
1676 MSG_SMB_CONF_UPDATED, NULL, 0,
1683 /********* END SeDiskOperatorPrivilege BLOCK *********/
1685 DEBUG(3,("_srvsvc_NetShareSetInfo: Running [%s] returned (%d)\n",
1688 TALLOC_FREE(command);
1691 return WERR_ACCESS_DENIED;
1693 DEBUG(10,("_srvsvc_NetShareSetInfo: No change to share name (%s)\n",
1697 /* Replace SD if changed. */
1702 old_sd = get_share_security(p->mem_ctx, lp_servicename(snum), &sd_size);
1704 if (old_sd && !sec_desc_equal(old_sd, psd)) {
1705 if (!set_share_security(share_name, psd))
1706 DEBUG(0,("_srvsvc_NetShareSetInfo: Failed to change security info in share %s.\n",
1711 DEBUG(5,("_srvsvc_NetShareSetInfo: %d\n", __LINE__));
1716 /*******************************************************************
1717 _srvsvc_NetShareAdd.
1718 Call 'add_share_command "sharename" "pathname"
1719 "comment" "max connections = "
1720 ********************************************************************/
1722 WERROR _srvsvc_NetShareAdd(pipes_struct *p,
1723 struct srvsvc_NetShareAdd *r)
1725 struct current_user user;
1726 char *command = NULL;
1727 char *share_name = NULL;
1728 char *comment = NULL;
1729 char *pathname = NULL;
1734 SEC_DESC *psd = NULL;
1735 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1737 int max_connections = 0;
1738 TALLOC_CTX *ctx = p->mem_ctx;
1740 DEBUG(5,("_srvsvc_NetShareAdd: %d\n", __LINE__));
1742 *r->out.parm_error = 0;
1744 get_current_user(&user,p);
1746 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1748 if (user.ut.uid != sec_initial_uid() && !is_disk_op )
1749 return WERR_ACCESS_DENIED;
1751 if (!lp_add_share_cmd() || !*lp_add_share_cmd()) {
1752 DEBUG(10,("_srvsvc_NetShareAdd: No add share command\n"));
1753 return WERR_ACCESS_DENIED;
1756 switch (r->in.level) {
1758 /* No path. Not enough info in a level 0 to do anything. */
1759 return WERR_ACCESS_DENIED;
1761 /* Not enough info in a level 1 to do anything. */
1762 return WERR_ACCESS_DENIED;
1764 share_name = talloc_strdup(ctx, r->in.info->info2->name);
1765 comment = talloc_strdup(ctx, r->in.info->info2->comment);
1766 pathname = talloc_strdup(ctx, r->in.info->info2->path);
1767 max_connections = (r->in.info->info2->max_users == 0xffffffff) ?
1768 0 : r->in.info->info2->max_users;
1769 type = r->in.info->info2->type;
1772 /* No path. Not enough info in a level 501 to do anything. */
1773 return WERR_ACCESS_DENIED;
1775 share_name = talloc_strdup(ctx, r->in.info->info502->name);
1776 comment = talloc_strdup(ctx, r->in.info->info502->comment);
1777 pathname = talloc_strdup(ctx, r->in.info->info502->path);
1778 max_connections = (r->in.info->info502->max_users == 0xffffffff) ?
1779 0 : r->in.info->info502->max_users;
1780 type = r->in.info->info502->type;
1781 psd = r->in.info->info502->sd;
1782 map_generic_share_sd_bits(psd);
1785 /* none of the following contain share names. NetShareAdd does not have a separate parameter for the share name */
1791 return WERR_ACCESS_DENIED;
1793 /* DFS only level. */
1794 return WERR_ACCESS_DENIED;
1796 DEBUG(5,("_srvsvc_NetShareAdd: unsupported switch value %d\n",
1798 return WERR_UNKNOWN_LEVEL;
1801 /* check for invalid share names */
1803 if (!share_name || !validate_net_name(share_name,
1804 INVALID_SHARENAME_CHARS,
1805 strlen(share_name))) {
1806 DEBUG(5,("_srvsvc_NetShareAdd: Bad sharename \"%s\"\n",
1807 share_name ? share_name : ""));
1808 return WERR_INVALID_NAME;
1811 if (strequal(share_name,"IPC$") || strequal(share_name,"global")
1812 || (lp_enable_asu_support() &&
1813 strequal(share_name,"ADMIN$"))) {
1814 return WERR_ACCESS_DENIED;
1817 snum = find_service(share_name);
1819 /* Share already exists. */
1821 return WERR_ALREADY_EXISTS;
1824 /* We can only add disk shares. */
1825 if (type != STYPE_DISKTREE) {
1826 return WERR_ACCESS_DENIED;
1829 /* Check if the pathname is valid. */
1830 if (!(path = valid_share_pathname(p->mem_ctx, pathname))) {
1831 return WERR_OBJECT_PATH_INVALID;
1834 /* Ensure share name, pathname and comment don't contain '"' characters. */
1835 string_replace(share_name, '"', ' ');
1836 string_replace(path, '"', ' ');
1838 string_replace(comment, '"', ' ');
1841 command = talloc_asprintf(ctx,
1842 "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1844 get_dyn_CONFIGFILE(),
1847 comment ? comment : "",
1853 DEBUG(10,("_srvsvc_NetShareAdd: Running [%s]\n", command ));
1855 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1860 /* FIXME: use libnetconf here - gd */
1862 if ( (ret = smbrun(command, NULL)) == 0 ) {
1863 /* Tell everyone we updated smb.conf. */
1864 message_send_all(smbd_messaging_context(),
1865 MSG_SMB_CONF_UPDATED, NULL, 0, NULL);
1871 /********* END SeDiskOperatorPrivilege BLOCK *********/
1873 DEBUG(3,("_srvsvc_NetShareAdd: Running [%s] returned (%d)\n",
1876 TALLOC_FREE(command);
1879 return WERR_ACCESS_DENIED;
1882 if (!set_share_security(share_name, psd)) {
1883 DEBUG(0,("_srvsvc_NetShareAdd: Failed to add security info to share %s.\n",
1889 * We don't call reload_services() here, the message will
1890 * cause this to be done before the next packet is read
1891 * from the client. JRA.
1894 DEBUG(5,("_srvsvc_NetShareAdd: %d\n", __LINE__));
1899 /*******************************************************************
1901 Call "delete share command" with the share name as
1903 ********************************************************************/
1905 WERROR _srvsvc_NetShareDel(pipes_struct *p,
1906 struct srvsvc_NetShareDel *r)
1908 struct current_user user;
1909 char *command = NULL;
1910 char *share_name = NULL;
1913 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1915 struct share_params *params;
1916 TALLOC_CTX *ctx = p->mem_ctx;
1918 DEBUG(5,("_srvsvc_NetShareDel: %d\n", __LINE__));
1920 share_name = talloc_strdup(p->mem_ctx, r->in.share_name);
1922 return WERR_NET_NAME_NOT_FOUND;
1924 if ( strequal(share_name,"IPC$")
1925 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") )
1926 || strequal(share_name,"global") )
1928 return WERR_ACCESS_DENIED;
1931 if (!(params = get_share_params(p->mem_ctx, share_name))) {
1932 return WERR_NO_SUCH_SHARE;
1935 snum = find_service(share_name);
1937 /* No change to printer shares. */
1938 if (lp_print_ok(snum))
1939 return WERR_ACCESS_DENIED;
1941 get_current_user(&user,p);
1943 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1945 if (user.ut.uid != sec_initial_uid() && !is_disk_op )
1946 return WERR_ACCESS_DENIED;
1948 if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) {
1949 DEBUG(10,("_srvsvc_NetShareDel: No delete share command\n"));
1950 return WERR_ACCESS_DENIED;
1953 command = talloc_asprintf(ctx,
1955 lp_delete_share_cmd(),
1956 get_dyn_CONFIGFILE(),
1957 lp_servicename(snum));
1962 DEBUG(10,("_srvsvc_NetShareDel: Running [%s]\n", command ));
1964 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1969 if ( (ret = smbrun(command, NULL)) == 0 ) {
1970 /* Tell everyone we updated smb.conf. */
1971 message_send_all(smbd_messaging_context(),
1972 MSG_SMB_CONF_UPDATED, NULL, 0, NULL);
1978 /********* END SeDiskOperatorPrivilege BLOCK *********/
1980 DEBUG(3,("_srvsvc_NetShareDel: Running [%s] returned (%d)\n", command, ret ));
1983 return WERR_ACCESS_DENIED;
1985 /* Delete the SD in the database. */
1986 delete_share_security(lp_servicename(params->service));
1988 lp_killservice(params->service);
1993 /*******************************************************************
1994 _srvsvc_NetShareDelSticky
1995 ********************************************************************/
1997 WERROR _srvsvc_NetShareDelSticky(pipes_struct *p,
1998 struct srvsvc_NetShareDelSticky *r)
2000 struct srvsvc_NetShareDel q;
2002 DEBUG(5,("_srvsvc_NetShareDelSticky: %d\n", __LINE__));
2004 q.in.server_unc = r->in.server_unc;
2005 q.in.share_name = r->in.share_name;
2006 q.in.reserved = r->in.reserved;
2008 return _srvsvc_NetShareDel(p, &q);
2011 /*******************************************************************
2012 _srvsvc_NetRemoteTOD
2013 ********************************************************************/
2015 WERROR _srvsvc_NetRemoteTOD(pipes_struct *p,
2016 struct srvsvc_NetRemoteTOD *r)
2018 struct srvsvc_NetRemoteTODInfo *tod;
2020 time_t unixdate = time(NULL);
2022 /* We do this call first as if we do it *after* the gmtime call
2023 it overwrites the pointed-to values. JRA */
2025 uint32 zone = get_time_zone(unixdate)/60;
2027 DEBUG(5,("_srvsvc_NetRemoteTOD: %d\n", __LINE__));
2029 if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetRemoteTODInfo)) )
2034 DEBUG(5,("_srvsvc_NetRemoteTOD: %d\n", __LINE__));
2036 t = gmtime(&unixdate);
2039 init_srvsvc_NetRemoteTODInfo(tod,
2053 DEBUG(5,("_srvsvc_NetRemoteTOD: %d\n", __LINE__));
2058 /***********************************************************************************
2059 _srvsvc_NetGetFileSecurity
2060 Win9x NT tools get security descriptor.
2061 ***********************************************************************************/
2063 WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p,
2064 struct srvsvc_NetGetFileSecurity *r)
2066 SEC_DESC *psd = NULL;
2069 char *filename_in = NULL;
2070 char *filename = NULL;
2071 char *qualname = NULL;
2075 struct current_user user;
2076 connection_struct *conn = NULL;
2077 bool became_user = False;
2078 TALLOC_CTX *ctx = p->mem_ctx;
2079 struct sec_desc_buf *sd_buf;
2085 qualname = talloc_strdup(ctx, r->in.share);
2087 werr = WERR_ACCESS_DENIED;
2091 /* Null password is ok - we are already an authenticated user... */
2092 null_pw = data_blob_null;
2094 get_current_user(&user, p);
2097 conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status);
2101 DEBUG(3,("_srvsvc_NetGetFileSecurity: Unable to connect to %s\n",
2103 werr = ntstatus_to_werror(nt_status);
2107 if (!become_user(conn, conn->vuid)) {
2108 DEBUG(0,("_srvsvc_NetGetFileSecurity: Can't become connected user!\n"));
2109 werr = WERR_ACCESS_DENIED;
2114 filename_in = talloc_strdup(ctx, r->in.file);
2116 werr = WERR_ACCESS_DENIED;
2120 nt_status = unix_convert(ctx, conn, filename_in, False, &filename, NULL, &st);
2121 if (!NT_STATUS_IS_OK(nt_status)) {
2122 DEBUG(3,("_srvsvc_NetGetFileSecurity: bad pathname %s\n",
2124 werr = WERR_ACCESS_DENIED;
2128 nt_status = check_name(conn, filename);
2129 if (!NT_STATUS_IS_OK(nt_status)) {
2130 DEBUG(3,("_srvsvc_NetGetFileSecurity: can't access %s\n",
2132 werr = WERR_ACCESS_DENIED;
2136 nt_status = SMB_VFS_GET_NT_ACL(conn, filename,
2137 (OWNER_SECURITY_INFORMATION
2138 |GROUP_SECURITY_INFORMATION
2139 |DACL_SECURITY_INFORMATION), &psd);
2141 if (!NT_STATUS_IS_OK(nt_status)) {
2142 DEBUG(3,("_srvsvc_NetGetFileSecurity: Unable to get NT ACL for file %s\n",
2144 werr = ntstatus_to_werror(nt_status);
2148 sd_size = ndr_size_security_descriptor(psd, 0);
2150 sd_buf = TALLOC_ZERO_P(ctx, struct sec_desc_buf);
2156 sd_buf->sd_size = sd_size;
2159 *r->out.sd_buf = sd_buf;
2161 psd->dacl->revision = NT4_ACL_REVISION;
2164 close_cnum(conn, user.vuid);
2173 close_cnum(conn, user.vuid);
2178 /***********************************************************************************
2179 _srvsvc_NetSetFileSecurity
2180 Win9x NT tools set security descriptor.
2181 ***********************************************************************************/
2183 WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p,
2184 struct srvsvc_NetSetFileSecurity *r)
2186 char *filename_in = NULL;
2187 char *filename = NULL;
2188 char *qualname = NULL;
2190 files_struct *fsp = NULL;
2194 struct current_user user;
2195 connection_struct *conn = NULL;
2196 bool became_user = False;
2197 TALLOC_CTX *ctx = p->mem_ctx;
2203 qualname = talloc_strdup(ctx, r->in.share);
2205 werr = WERR_ACCESS_DENIED;
2209 /* Null password is ok - we are already an authenticated user... */
2210 null_pw = data_blob_null;
2212 get_current_user(&user, p);
2215 conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status);
2219 DEBUG(3,("_srvsvc_NetSetFileSecurity: Unable to connect to %s\n", qualname));
2220 werr = ntstatus_to_werror(nt_status);
2224 if (!become_user(conn, conn->vuid)) {
2225 DEBUG(0,("_srvsvc_NetSetFileSecurity: Can't become connected user!\n"));
2226 werr = WERR_ACCESS_DENIED;
2231 filename_in = talloc_strdup(ctx, r->in.file);
2233 werr = WERR_ACCESS_DENIED;
2237 nt_status = unix_convert(ctx, conn, filename, False, &filename, NULL, &st);
2238 if (!NT_STATUS_IS_OK(nt_status)) {
2239 DEBUG(3,("_srvsvc_NetSetFileSecurity: bad pathname %s\n", filename));
2240 werr = WERR_ACCESS_DENIED;
2244 nt_status = check_name(conn, filename);
2245 if (!NT_STATUS_IS_OK(nt_status)) {
2246 DEBUG(3,("_srvsvc_NetSetFileSecurity: can't access %s\n", filename));
2247 werr = WERR_ACCESS_DENIED;
2251 nt_status = open_file_stat(conn, NULL, filename, &st, &fsp);
2253 if ( !NT_STATUS_IS_OK(nt_status) ) {
2254 /* Perhaps it is a directory */
2255 if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY))
2256 nt_status = open_directory(conn, NULL, filename, &st,
2257 FILE_READ_ATTRIBUTES,
2258 FILE_SHARE_READ|FILE_SHARE_WRITE,
2261 FILE_ATTRIBUTE_DIRECTORY,
2264 if ( !NT_STATUS_IS_OK(nt_status) ) {
2265 DEBUG(3,("_srvsvc_NetSetFileSecurity: Unable to open file %s\n", filename));
2266 werr = ntstatus_to_werror(nt_status);
2271 nt_status = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name,
2272 r->in.securityinformation,
2275 if (!NT_STATUS_IS_OK(nt_status) ) {
2276 DEBUG(3,("_srvsvc_NetSetFileSecurity: Unable to set NT ACL on file %s\n", filename));
2277 werr = WERR_ACCESS_DENIED;
2281 close_file(fsp, NORMAL_CLOSE);
2283 close_cnum(conn, user.vuid);
2289 close_file(fsp, NORMAL_CLOSE);
2297 close_cnum(conn, user.vuid);
2303 /***********************************************************************************
2304 It may be that we want to limit users to creating shares on certain areas of the UNIX file area.
2305 We could define areas by mapping Windows style disks to points on the UNIX directory hierarchy.
2306 These disks would the disks listed by this function.
2307 Users could then create shares relative to these disks. Watch out for moving these disks around.
2308 "Nigel Williams" <nigel@veritas.com>.
2309 ***********************************************************************************/
2311 static const char *server_disks[] = {"C:"};
2313 static uint32 get_server_disk_count(void)
2315 return sizeof(server_disks)/sizeof(server_disks[0]);
2318 static uint32 init_server_disk_enum(uint32 *resume)
2320 uint32 server_disk_count = get_server_disk_count();
2322 /*resume can be an offset into the list for now*/
2324 if(*resume & 0x80000000)
2327 if(*resume > server_disk_count)
2328 *resume = server_disk_count;
2330 return server_disk_count - *resume;
2333 static const char *next_server_disk_enum(uint32 *resume)
2337 if(init_server_disk_enum(resume) == 0)
2340 disk = server_disks[*resume];
2344 DEBUG(10, ("next_server_disk_enum: reporting disk %s. resume handle %d.\n", disk, *resume));
2349 /********************************************************************
2351 ********************************************************************/
2353 WERROR _srvsvc_NetDiskEnum(pipes_struct *p,
2354 struct srvsvc_NetDiskEnum *r)
2357 const char *disk_name;
2358 TALLOC_CTX *ctx = p->mem_ctx;
2360 uint32_t resume = r->in.resume_handle ? *r->in.resume_handle : 0;
2364 *r->out.totalentries = init_server_disk_enum(&resume);
2366 r->out.info->disks = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetDiskInfo0,
2367 MAX_SERVER_DISK_ENTRIES);
2368 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks);
2370 /*allow one struct srvsvc_NetDiskInfo0 for null terminator*/
2372 for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(&resume)); i++) {
2374 r->out.info->count++;
2376 /*copy disk name into a unicode string*/
2378 r->out.info->disks[i].disk = talloc_strdup(ctx, disk_name);
2379 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[i].disk);
2382 /* add a terminating null string. Is this there if there is more data to come? */
2384 r->out.info->count++;
2386 r->out.info->disks[i].disk = talloc_strdup(ctx, "");
2387 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[i].disk);
2389 if (r->out.resume_handle) {
2390 *r->out.resume_handle = resume;
2396 /********************************************************************
2397 _srvsvc_NetNameValidate
2398 ********************************************************************/
2400 WERROR _srvsvc_NetNameValidate(pipes_struct *p,
2401 struct srvsvc_NetNameValidate *r)
2403 switch (r->in.name_type) {
2405 if (!validate_net_name(r->in.name, INVALID_SHARENAME_CHARS,
2406 strlen_m(r->in.name)))
2408 DEBUG(5,("_srvsvc_NetNameValidate: Bad sharename \"%s\"\n",
2410 return WERR_INVALID_NAME;
2415 return WERR_UNKNOWN_LEVEL;
2421 /********************************************************************
2422 ********************************************************************/
2424 WERROR _srvsvc_NetFileClose(pipes_struct *p, struct srvsvc_NetFileClose *r)
2426 return WERR_ACCESS_DENIED;
2430 /********************************************************************
2431 ********************************************************************/
2433 WERROR _srvsvc_NetCharDevEnum(pipes_struct *p, struct srvsvc_NetCharDevEnum *r)
2435 p->rng_fault_state = True;
2436 return WERR_NOT_SUPPORTED;
2439 WERROR _srvsvc_NetCharDevGetInfo(pipes_struct *p, struct srvsvc_NetCharDevGetInfo *r)
2441 p->rng_fault_state = True;
2442 return WERR_NOT_SUPPORTED;
2445 WERROR _srvsvc_NetCharDevControl(pipes_struct *p, struct srvsvc_NetCharDevControl *r)
2447 p->rng_fault_state = True;
2448 return WERR_NOT_SUPPORTED;
2451 WERROR _srvsvc_NetCharDevQEnum(pipes_struct *p, struct srvsvc_NetCharDevQEnum *r)
2453 p->rng_fault_state = True;
2454 return WERR_NOT_SUPPORTED;
2457 WERROR _srvsvc_NetCharDevQGetInfo(pipes_struct *p, struct srvsvc_NetCharDevQGetInfo *r)
2459 p->rng_fault_state = True;
2460 return WERR_NOT_SUPPORTED;
2463 WERROR _srvsvc_NetCharDevQSetInfo(pipes_struct *p, struct srvsvc_NetCharDevQSetInfo *r)
2465 p->rng_fault_state = True;
2466 return WERR_NOT_SUPPORTED;
2469 WERROR _srvsvc_NetCharDevQPurge(pipes_struct *p, struct srvsvc_NetCharDevQPurge *r)
2471 p->rng_fault_state = True;
2472 return WERR_NOT_SUPPORTED;
2475 WERROR _srvsvc_NetCharDevQPurgeSelf(pipes_struct *p, struct srvsvc_NetCharDevQPurgeSelf *r)
2477 p->rng_fault_state = True;
2478 return WERR_NOT_SUPPORTED;
2481 WERROR _srvsvc_NetConnEnum(pipes_struct *p, struct srvsvc_NetConnEnum *r)
2483 p->rng_fault_state = True;
2484 return WERR_NOT_SUPPORTED;
2487 WERROR _srvsvc_NetFileGetInfo(pipes_struct *p, struct srvsvc_NetFileGetInfo *r)
2489 p->rng_fault_state = True;
2490 return WERR_NOT_SUPPORTED;
2493 WERROR _srvsvc_NetSessEnum(pipes_struct *p, struct srvsvc_NetSessEnum *r)
2495 p->rng_fault_state = True;
2496 return WERR_NOT_SUPPORTED;
2499 WERROR _srvsvc_NetShareCheck(pipes_struct *p, struct srvsvc_NetShareCheck *r)
2501 p->rng_fault_state = True;
2502 return WERR_NOT_SUPPORTED;
2505 WERROR _srvsvc_NetServerStatisticsGet(pipes_struct *p, struct srvsvc_NetServerStatisticsGet *r)
2507 p->rng_fault_state = True;
2508 return WERR_NOT_SUPPORTED;
2511 WERROR _srvsvc_NetTransportAdd(pipes_struct *p, struct srvsvc_NetTransportAdd *r)
2513 p->rng_fault_state = True;
2514 return WERR_NOT_SUPPORTED;
2517 WERROR _srvsvc_NetTransportEnum(pipes_struct *p, struct srvsvc_NetTransportEnum *r)
2519 p->rng_fault_state = True;
2520 return WERR_NOT_SUPPORTED;
2523 WERROR _srvsvc_NetTransportDel(pipes_struct *p, struct srvsvc_NetTransportDel *r)
2525 p->rng_fault_state = True;
2526 return WERR_NOT_SUPPORTED;
2529 WERROR _srvsvc_NetSetServiceBits(pipes_struct *p, struct srvsvc_NetSetServiceBits *r)
2531 p->rng_fault_state = True;
2532 return WERR_NOT_SUPPORTED;
2535 WERROR _srvsvc_NetPathType(pipes_struct *p, struct srvsvc_NetPathType *r)
2537 p->rng_fault_state = True;
2538 return WERR_NOT_SUPPORTED;
2541 WERROR _srvsvc_NetPathCanonicalize(pipes_struct *p, struct srvsvc_NetPathCanonicalize *r)
2543 p->rng_fault_state = True;
2544 return WERR_NOT_SUPPORTED;
2547 WERROR _srvsvc_NetPathCompare(pipes_struct *p, struct srvsvc_NetPathCompare *r)
2549 p->rng_fault_state = True;
2550 return WERR_NOT_SUPPORTED;
2553 WERROR _srvsvc_NETRPRNAMECANONICALIZE(pipes_struct *p, struct srvsvc_NETRPRNAMECANONICALIZE *r)
2555 p->rng_fault_state = True;
2556 return WERR_NOT_SUPPORTED;
2559 WERROR _srvsvc_NetPRNameCompare(pipes_struct *p, struct srvsvc_NetPRNameCompare *r)
2561 p->rng_fault_state = True;
2562 return WERR_NOT_SUPPORTED;
2565 WERROR _srvsvc_NetShareDelStart(pipes_struct *p, struct srvsvc_NetShareDelStart *r)
2567 p->rng_fault_state = True;
2568 return WERR_NOT_SUPPORTED;
2571 WERROR _srvsvc_NetShareDelCommit(pipes_struct *p, struct srvsvc_NetShareDelCommit *r)
2573 p->rng_fault_state = True;
2574 return WERR_NOT_SUPPORTED;
2577 WERROR _srvsvc_NetServerTransportAddEx(pipes_struct *p, struct srvsvc_NetServerTransportAddEx *r)
2579 p->rng_fault_state = True;
2580 return WERR_NOT_SUPPORTED;
2583 WERROR _srvsvc_NetServerSetServiceBitsEx(pipes_struct *p, struct srvsvc_NetServerSetServiceBitsEx *r)
2585 p->rng_fault_state = True;
2586 return WERR_NOT_SUPPORTED;
2589 WERROR _srvsvc_NETRDFSGETVERSION(pipes_struct *p, struct srvsvc_NETRDFSGETVERSION *r)
2591 p->rng_fault_state = True;
2592 return WERR_NOT_SUPPORTED;
2595 WERROR _srvsvc_NETRDFSCREATELOCALPARTITION(pipes_struct *p, struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
2597 p->rng_fault_state = True;
2598 return WERR_NOT_SUPPORTED;
2601 WERROR _srvsvc_NETRDFSDELETELOCALPARTITION(pipes_struct *p, struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
2603 p->rng_fault_state = True;
2604 return WERR_NOT_SUPPORTED;
2607 WERROR _srvsvc_NETRDFSSETLOCALVOLUMESTATE(pipes_struct *p, struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
2609 p->rng_fault_state = True;
2610 return WERR_NOT_SUPPORTED;
2613 WERROR _srvsvc_NETRDFSSETSERVERINFO(pipes_struct *p, struct srvsvc_NETRDFSSETSERVERINFO *r)
2615 p->rng_fault_state = True;
2616 return WERR_NOT_SUPPORTED;
2619 WERROR _srvsvc_NETRDFSCREATEEXITPOINT(pipes_struct *p, struct srvsvc_NETRDFSCREATEEXITPOINT *r)
2621 p->rng_fault_state = True;
2622 return WERR_NOT_SUPPORTED;
2625 WERROR _srvsvc_NETRDFSDELETEEXITPOINT(pipes_struct *p, struct srvsvc_NETRDFSDELETEEXITPOINT *r)
2627 p->rng_fault_state = True;
2628 return WERR_NOT_SUPPORTED;
2631 WERROR _srvsvc_NETRDFSMODIFYPREFIX(pipes_struct *p, struct srvsvc_NETRDFSMODIFYPREFIX *r)
2633 p->rng_fault_state = True;
2634 return WERR_NOT_SUPPORTED;
2637 WERROR _srvsvc_NETRDFSFIXLOCALVOLUME(pipes_struct *p, struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
2639 p->rng_fault_state = True;
2640 return WERR_NOT_SUPPORTED;
2643 WERROR _srvsvc_NETRDFSMANAGERREPORTSITEINFO(pipes_struct *p, struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
2645 p->rng_fault_state = True;
2646 return WERR_NOT_SUPPORTED;
2649 WERROR _srvsvc_NETRSERVERTRANSPORTDELEX(pipes_struct *p, struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
2651 p->rng_fault_state = True;
2652 return WERR_NOT_SUPPORTED;