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 {
41 struct sess_file_count {
47 /****************************************************************************
48 Count the entries belonging to a service in the connection db.
49 ****************************************************************************/
51 static int pipe_enum_fn( struct db_record *rec, void *p)
53 struct pipe_open_rec prec;
54 struct file_enum_count *fenum = (struct file_enum_count *)p;
57 char *fullpath = NULL;
60 if (rec->value.dsize != sizeof(struct pipe_open_rec))
63 memcpy(&prec, rec->value.dptr, sizeof(struct pipe_open_rec));
65 if ( !process_exists(prec.pid) ) {
69 username = uidtoname(prec.uid);
71 if ((fenum->username != NULL)
72 && !strequal(username, fenum->username)) {
76 fullpath = talloc_asprintf(fenum->ctx, "\\PIPE\\%s", prec.name );
81 f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 );
83 DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
90 (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum),
91 (FILE_READ_DATA|FILE_WRITE_DATA),
92 0, username, fullpath);
94 TALLOC_FREE(fullpath);
100 /*******************************************************************
101 ********************************************************************/
103 static WERROR net_enum_pipes( TALLOC_CTX *ctx, const char *username,
105 uint32 *count, uint32 resume )
107 struct file_enum_count fenum;
110 fenum.username = username;
111 fenum.count = *count;
114 if (connections_traverse(pipe_enum_fn, &fenum) == -1) {
115 DEBUG(0,("net_enum_pipes: traverse of connections.tdb "
121 *count = fenum.count;
126 /*******************************************************************
127 ********************************************************************/
129 static void enum_file_fn( const struct share_mode_entry *e,
130 const char *sharepath, const char *fname,
133 struct file_enum_count *fenum =
134 (struct file_enum_count *)private_data;
137 int i = fenum->count;
139 struct byte_range_lock *brl;
141 char *fullpath = NULL;
143 const char *username;
145 /* If the pid was not found delete the entry from connections.tdb */
147 if ( !process_exists(e->pid) ) {
151 username = uidtoname(e->uid);
153 if ((fenum->username != NULL)
154 && !strequal(username, fenum->username)) {
158 f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 );
160 DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
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 FILE_INFO_3 struct */
190 init_srv_file_info3( &fenum->info[i],
197 TALLOC_FREE(fullpath);
201 /*******************************************************************
202 ********************************************************************/
204 static WERROR net_enum_files( TALLOC_CTX *ctx, const char *username,
206 uint32 *count, uint32 resume )
208 struct file_enum_count f_enum_cnt;
210 f_enum_cnt.ctx = ctx;
211 f_enum_cnt.username = username;
212 f_enum_cnt.count = *count;
213 f_enum_cnt.info = *info;
215 share_mode_forall( enum_file_fn, (void *)&f_enum_cnt );
217 *info = f_enum_cnt.info;
218 *count = f_enum_cnt.count;
223 /*******************************************************************
224 Utility function to get the 'type' of a share from an snum.
225 ********************************************************************/
226 static uint32 get_share_type(int snum)
228 /* work out the share type */
229 uint32 type = STYPE_DISKTREE;
231 if (lp_print_ok(snum))
233 if (strequal(lp_fstype(snum), "IPC"))
236 type |= STYPE_HIDDEN;
241 /*******************************************************************
242 Fill in a share info level 0 structure.
243 ********************************************************************/
245 static void init_srv_share_info_0(pipes_struct *p, SRV_SHARE_INFO_0 *sh0, int snum)
247 const char *net_name = lp_servicename(snum);
249 init_srv_share_info0(&sh0->info_0, net_name);
250 init_srv_share_info0_str(&sh0->info_0_str, net_name);
253 /*******************************************************************
254 Fill in a share info level 1 structure.
255 ********************************************************************/
257 static void init_srv_share_info_1(pipes_struct *p, SRV_SHARE_INFO_1 *sh1, int snum)
259 char *net_name = lp_servicename(snum);
260 char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
263 remark = standard_sub_conn(p->mem_ctx,
268 init_srv_share_info1(&sh1->info_1,
270 get_share_type(snum),
271 remark ? remark: "");
272 init_srv_share_info1_str(&sh1->info_1_str,
274 remark ? remark: "");
277 /*******************************************************************
278 Fill in a share info level 2 structure.
279 ********************************************************************/
281 static void init_srv_share_info_2(pipes_struct *p, SRV_SHARE_INFO_2 *sh2, int snum)
285 int max_connections = lp_max_connections(snum);
286 uint32 max_uses = max_connections!=0 ? max_connections : 0xffffffff;
288 char *net_name = lp_servicename(snum);
290 remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
292 remark = standard_sub_conn(p->mem_ctx,
296 path = talloc_asprintf(p->mem_ctx,
297 "C:%s", lp_pathname(snum));
301 * Change / to \\ so that win2k will see it as a valid path.
302 * This was added to enable use of browsing in win2k add
306 string_replace(path, '/', '\\');
309 count = count_current_connections(net_name, false);
310 init_srv_share_info2(&sh2->info_2,
312 get_share_type(snum),
313 remark ? remark : "",
320 init_srv_share_info2_str(&sh2->info_2_str,
322 remark ? remark : "",
327 /*******************************************************************
328 Map any generic bits to file specific bits.
329 ********************************************************************/
331 static void map_generic_share_sd_bits(SEC_DESC *psd)
334 SEC_ACL *ps_dacl = NULL;
343 for (i = 0; i < ps_dacl->num_aces; i++) {
344 SEC_ACE *psa = &ps_dacl->aces[i];
345 uint32 orig_mask = psa->access_mask;
347 se_map_generic(&psa->access_mask, &file_generic_mapping);
348 psa->access_mask |= orig_mask;
352 /*******************************************************************
353 Fill in a share info level 501 structure.
354 ********************************************************************/
356 static void init_srv_share_info_501(pipes_struct *p, SRV_SHARE_INFO_501 *sh501, int snum)
358 const char *net_name = lp_servicename(snum);
359 char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
362 remark = standard_sub_conn(p->mem_ctx, p->conn, remark);
365 init_srv_share_info501(&sh501->info_501, net_name, get_share_type(snum),
366 remark ? remark : "", (lp_csc_policy(snum) << 4));
367 init_srv_share_info501_str(&sh501->info_501_str,
368 net_name, remark ? remark : "");
371 /*******************************************************************
372 Fill in a share info level 502 structure.
373 ********************************************************************/
375 static void init_srv_share_info_502(pipes_struct *p, SRV_SHARE_INFO_502 *sh502, int snum)
377 const char *net_name = lp_servicename(snum);
381 TALLOC_CTX *ctx = p->mem_ctx;
382 char *remark = talloc_strdup(ctx, lp_comment(snum));;
387 remark = standard_sub_conn(ctx, p->conn, remark);
389 path = talloc_asprintf(ctx, "C:%s", lp_pathname(snum));
392 * Change / to \\ so that win2k will see it as a valid path. This was added to
393 * enable use of browsing in win2k add share dialog.
395 string_replace(path, '/', '\\');
398 sd = get_share_security(ctx, lp_servicename(snum), &sd_size);
400 init_srv_share_info502(&sh502->info_502,
402 get_share_type(snum),
403 remark ? remark : "",
411 init_srv_share_info502_str(&sh502->info_502_str,
413 remark ? remark : "",
420 /***************************************************************************
421 Fill in a share info level 1004 structure.
422 ***************************************************************************/
424 static void init_srv_share_info_1004(pipes_struct *p, SRV_SHARE_INFO_1004* sh1004, int snum)
426 char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
429 remark = standard_sub_conn(p->mem_ctx, p->conn, remark);
432 ZERO_STRUCTP(sh1004);
434 init_srv_share_info1004(&sh1004->info_1004, remark ? remark : "");
435 init_srv_share_info1004_str(&sh1004->info_1004_str,
436 remark ? remark : "");
439 /***************************************************************************
440 Fill in a share info level 1005 structure.
441 ***************************************************************************/
443 static void init_srv_share_info_1005(pipes_struct *p, SRV_SHARE_INFO_1005* sh1005, int snum)
445 sh1005->share_info_flags = 0;
447 if(lp_host_msdfs() && lp_msdfs_root(snum))
448 sh1005->share_info_flags |=
449 SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT;
450 sh1005->share_info_flags |=
451 lp_csc_policy(snum) << SHARE_1005_CSC_POLICY_SHIFT;
453 /***************************************************************************
454 Fill in a share info level 1006 structure.
455 ***************************************************************************/
457 static void init_srv_share_info_1006(pipes_struct *p, SRV_SHARE_INFO_1006* sh1006, int snum)
459 sh1006->max_uses = -1;
462 /***************************************************************************
463 Fill in a share info level 1007 structure.
464 ***************************************************************************/
466 static void init_srv_share_info_1007(pipes_struct *p, SRV_SHARE_INFO_1007* sh1007, int snum)
470 ZERO_STRUCTP(sh1007);
472 init_srv_share_info1007(&sh1007->info_1007, flags, "");
473 init_srv_share_info1007_str(&sh1007->info_1007_str, "");
476 /*******************************************************************
477 Fill in a share info level 1501 structure.
478 ********************************************************************/
480 static void init_srv_share_info_1501(pipes_struct *p, SRV_SHARE_INFO_1501 *sh1501, int snum)
484 TALLOC_CTX *ctx = p->mem_ctx;
486 ZERO_STRUCTP(sh1501);
488 sd = get_share_security(ctx, lp_servicename(snum), &sd_size);
490 sh1501->sdb = make_sec_desc_buf(p->mem_ctx, sd_size, sd);
493 /*******************************************************************
494 True if it ends in '$'.
495 ********************************************************************/
497 static bool is_hidden_share(int snum)
499 const char *net_name = lp_servicename(snum);
501 return (net_name[strlen(net_name) - 1] == '$') ? True : False;
504 /*******************************************************************
505 Fill in a share info structure.
506 ********************************************************************/
508 static bool init_srv_share_info_ctr(pipes_struct *p, SRV_SHARE_INFO_CTR *ctr,
509 uint32 info_level, uint32 *resume_hnd, uint32 *total_entries, bool all_shares)
512 int num_services = 0;
514 TALLOC_CTX *ctx = p->mem_ctx;
516 DEBUG(5,("init_srv_share_info_ctr\n"));
520 ctr->info_level = ctr->switch_value = info_level;
523 /* Ensure all the usershares are loaded. */
525 num_services = load_usershare_shares();
526 load_registry_shares();
529 /* Count the number of entries. */
530 for (snum = 0; snum < num_services; snum++) {
531 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) )
535 *total_entries = num_entries;
536 ctr->num_entries2 = ctr->num_entries = num_entries;
537 ctr->ptr_share_info = ctr->ptr_entries = 1;
542 switch (info_level) {
545 SRV_SHARE_INFO_0 *info0 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_0, num_entries);
552 for (snum = *resume_hnd; snum < num_services; snum++) {
553 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
554 init_srv_share_info_0(p, &info0[i++], snum);
558 ctr->share.info0 = info0;
565 SRV_SHARE_INFO_1 *info1 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1, num_entries);
572 for (snum = *resume_hnd; snum < num_services; snum++) {
573 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
574 init_srv_share_info_1(p, &info1[i++], snum);
578 ctr->share.info1 = info1;
584 SRV_SHARE_INFO_2 *info2 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_2, num_entries);
591 for (snum = *resume_hnd; snum < num_services; snum++) {
592 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
593 init_srv_share_info_2(p, &info2[i++], snum);
597 ctr->share.info2 = info2;
603 SRV_SHARE_INFO_501 *info501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_501, num_entries);
610 for (snum = *resume_hnd; snum < num_services; snum++) {
611 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
612 init_srv_share_info_501(p, &info501[i++], snum);
616 ctr->share.info501 = info501;
622 SRV_SHARE_INFO_502 *info502 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_502, num_entries);
629 for (snum = *resume_hnd; snum < num_services; snum++) {
630 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
631 init_srv_share_info_502(p, &info502[i++], snum);
635 ctr->share.info502 = info502;
639 /* here for completeness but not currently used with enum (1004 - 1501)*/
643 SRV_SHARE_INFO_1004 *info1004 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1004, num_entries);
650 for (snum = *resume_hnd; snum < num_services; snum++) {
651 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
652 init_srv_share_info_1004(p, &info1004[i++], snum);
656 ctr->share.info1004 = info1004;
662 SRV_SHARE_INFO_1005 *info1005 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1005, num_entries);
669 for (snum = *resume_hnd; snum < num_services; snum++) {
670 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
671 init_srv_share_info_1005(p, &info1005[i++], snum);
675 ctr->share.info1005 = info1005;
681 SRV_SHARE_INFO_1006 *info1006 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1006, num_entries);
688 for (snum = *resume_hnd; snum < num_services; snum++) {
689 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
690 init_srv_share_info_1006(p, &info1006[i++], snum);
694 ctr->share.info1006 = info1006;
700 SRV_SHARE_INFO_1007 *info1007 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1007, num_entries);
707 for (snum = *resume_hnd; snum < num_services; snum++) {
708 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
709 init_srv_share_info_1007(p, &info1007[i++], snum);
713 ctr->share.info1007 = info1007;
719 SRV_SHARE_INFO_1501 *info1501 = TALLOC_ARRAY(ctx, SRV_SHARE_INFO_1501, num_entries);
726 for (snum = *resume_hnd; snum < num_services; snum++) {
727 if (lp_browseable(snum) && lp_snum_ok(snum) && (all_shares || !is_hidden_share(snum)) ) {
728 init_srv_share_info_1501(p, &info1501[i++], snum);
732 ctr->share.info1501 = info1501;
736 DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n", info_level));
743 /*******************************************************************
744 Inits a SRV_R_NET_SHARE_ENUM structure.
745 ********************************************************************/
747 static void init_srv_r_net_share_enum(pipes_struct *p, SRV_R_NET_SHARE_ENUM *r_n,
748 uint32 info_level, uint32 resume_hnd, bool all)
750 DEBUG(5,("init_srv_r_net_share_enum: %d\n", __LINE__));
752 if (init_srv_share_info_ctr(p, &r_n->ctr, info_level,
753 &resume_hnd, &r_n->total_entries, all)) {
754 r_n->status = WERR_OK;
756 r_n->status = WERR_UNKNOWN_LEVEL;
759 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
762 /*******************************************************************
763 Inits a SRV_R_NET_SHARE_GET_INFO structure.
764 ********************************************************************/
766 static void init_srv_r_net_share_get_info(pipes_struct *p, SRV_R_NET_SHARE_GET_INFO *r_n,
767 char *share_name, uint32 info_level)
769 WERROR status = WERR_OK;
772 DEBUG(5,("init_srv_r_net_share_get_info: %d\n", __LINE__));
774 r_n->info.switch_value = info_level;
776 snum = find_service(share_name);
779 switch (info_level) {
781 init_srv_share_info_0(p, &r_n->info.share.info0, snum);
784 init_srv_share_info_1(p, &r_n->info.share.info1, snum);
787 init_srv_share_info_2(p, &r_n->info.share.info2, snum);
790 init_srv_share_info_501(p, &r_n->info.share.info501, snum);
793 init_srv_share_info_502(p, &r_n->info.share.info502, snum);
796 /* here for completeness */
798 init_srv_share_info_1004(p, &r_n->info.share.info1004, snum);
801 init_srv_share_info_1005(p, &r_n->info.share.info1005, snum);
804 /* here for completeness 1006 - 1501 */
806 init_srv_share_info_1006(p, &r_n->info.share.info1006, snum);
809 init_srv_share_info_1007(p, &r_n->info.share.info1007, snum);
812 init_srv_share_info_1501(p, &r_n->info.share.info1501, snum);
815 DEBUG(5,("init_srv_net_share_get_info: unsupported switch value %d\n", info_level));
816 status = WERR_UNKNOWN_LEVEL;
820 status = WERR_INVALID_NAME;
823 r_n->info.ptr_share_ctr = W_ERROR_IS_OK(status) ? 1 : 0;
824 r_n->status = status;
827 /*******************************************************************
828 fill in a sess info level 0 structure.
829 ********************************************************************/
831 static void init_srv_sess_info_0(pipes_struct *p, SRV_SESS_INFO_0 *ss0, uint32 *snum, uint32 *stot)
833 struct sessionid *session_list;
834 uint32 num_entries = 0;
835 (*stot) = list_sessions(p->mem_ctx, &session_list);
844 DEBUG(5,("init_srv_sess_0_ss0\n"));
847 for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) {
848 init_srv_sess_info0( &ss0->info_0[num_entries], session_list[(*snum)].remote_machine);
852 ss0->num_entries_read = num_entries;
853 ss0->ptr_sess_info = num_entries > 0 ? 1 : 0;
854 ss0->num_entries_read2 = num_entries;
856 if ((*snum) >= (*stot)) {
861 ss0->num_entries_read = 0;
862 ss0->ptr_sess_info = 0;
863 ss0->num_entries_read2 = 0;
867 /*******************************************************************
868 ********************************************************************/
870 static void sess_file_fn( const struct share_mode_entry *e,
871 const char *sharepath, const char *fname,
874 struct sess_file_count *sess = (struct sess_file_count *)data;
876 if ( procid_equal(&e->pid, &sess->pid) && (sess->uid == e->uid) ) {
883 /*******************************************************************
884 ********************************************************************/
886 static int net_count_files( uid_t uid, struct server_id pid )
888 struct sess_file_count s_file_cnt;
890 s_file_cnt.count = 0;
891 s_file_cnt.uid = uid;
892 s_file_cnt.pid = pid;
894 share_mode_forall( sess_file_fn, &s_file_cnt );
896 return s_file_cnt.count;
899 /*******************************************************************
900 fill in a sess info level 1 structure.
901 ********************************************************************/
903 static void init_srv_sess_info_1(pipes_struct *p, SRV_SESS_INFO_1 *ss1, uint32 *snum, uint32 *stot)
905 struct sessionid *session_list;
906 uint32 num_entries = 0;
907 time_t now = time(NULL);
910 ss1->num_entries_read = 0;
911 ss1->ptr_sess_info = 0;
912 ss1->num_entries_read2 = 0;
924 (*stot) = list_sessions(p->mem_ctx, &session_list);
927 for (; (*snum) < (*stot) && num_entries < MAX_SESS_ENTRIES; (*snum)++) {
930 struct passwd *pw = sys_getpwnam(session_list[*snum].username);
934 DEBUG(10,("init_srv_sess_info_1: failed to find owner: %s\n",
935 session_list[*snum].username));
939 connect_time = (uint32)(now - session_list[*snum].connect_start);
940 num_files = net_count_files(pw->pw_uid, session_list[*snum].pid);
941 guest = strequal( session_list[*snum].username, lp_guestaccount() );
943 init_srv_sess_info1( &ss1->info_1[num_entries],
944 session_list[*snum].remote_machine,
945 session_list[*snum].username,
953 ss1->num_entries_read = num_entries;
954 ss1->ptr_sess_info = num_entries > 0 ? 1 : 0;
955 ss1->num_entries_read2 = num_entries;
957 if ((*snum) >= (*stot)) {
963 /*******************************************************************
964 makes a SRV_R_NET_SESS_ENUM structure.
965 ********************************************************************/
967 static WERROR init_srv_sess_info_ctr(pipes_struct *p, SRV_SESS_INFO_CTR *ctr,
968 int switch_value, uint32 *resume_hnd, uint32 *total_entries)
970 WERROR status = WERR_OK;
971 DEBUG(5,("init_srv_sess_info_ctr: %d\n", __LINE__));
973 ctr->switch_value = switch_value;
975 switch (switch_value) {
977 init_srv_sess_info_0(p, &(ctr->sess.info0), resume_hnd, total_entries);
978 ctr->ptr_sess_ctr = 1;
981 init_srv_sess_info_1(p, &(ctr->sess.info1), resume_hnd, total_entries);
982 ctr->ptr_sess_ctr = 1;
985 DEBUG(5,("init_srv_sess_info_ctr: unsupported switch value %d\n", switch_value));
987 (*total_entries) = 0;
988 ctr->ptr_sess_ctr = 0;
989 status = WERR_UNKNOWN_LEVEL;
996 /*******************************************************************
997 makes a SRV_R_NET_SESS_ENUM structure.
998 ********************************************************************/
1000 static void init_srv_r_net_sess_enum(pipes_struct *p, SRV_R_NET_SESS_ENUM *r_n,
1001 uint32 resume_hnd, int sess_level, int switch_value)
1003 DEBUG(5,("init_srv_r_net_sess_enum: %d\n", __LINE__));
1005 r_n->sess_level = sess_level;
1007 if (sess_level == -1)
1008 r_n->status = WERR_UNKNOWN_LEVEL;
1010 r_n->status = init_srv_sess_info_ctr(p, r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
1012 if (!W_ERROR_IS_OK(r_n->status))
1015 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
1018 /*******************************************************************
1019 fill in a conn info level 0 structure.
1020 ********************************************************************/
1022 static void init_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *stot)
1024 uint32 num_entries = 0;
1032 DEBUG(5,("init_srv_conn_0_ss0\n"));
1035 for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {
1037 init_srv_conn_info0(&ss0->info_0[num_entries], (*stot));
1039 /* move on to creating next connection */
1040 /* move on to creating next conn */
1044 ss0->num_entries_read = num_entries;
1045 ss0->ptr_conn_info = num_entries > 0 ? 1 : 0;
1046 ss0->num_entries_read2 = num_entries;
1048 if ((*snum) >= (*stot)) {
1053 ss0->num_entries_read = 0;
1054 ss0->ptr_conn_info = 0;
1055 ss0->num_entries_read2 = 0;
1061 /*******************************************************************
1062 fill in a conn info level 1 structure.
1063 ********************************************************************/
1065 static void init_srv_conn_1_info(CONN_INFO_1 *se1, CONN_INFO_1_STR *str1,
1066 uint32 id, uint32 type,
1067 uint32 num_opens, uint32 num_users, uint32 open_time,
1068 const char *usr_name, const char *net_name)
1070 init_srv_conn_info1(se1 , id, type, num_opens, num_users, open_time, usr_name, net_name);
1071 init_srv_conn_info1_str(str1, usr_name, net_name);
1074 /*******************************************************************
1075 fill in a conn info level 1 structure.
1076 ********************************************************************/
1078 static void init_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *stot)
1080 uint32 num_entries = 0;
1088 DEBUG(5,("init_srv_conn_1_ss1\n"));
1091 for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) {
1092 init_srv_conn_1_info(&ss1->info_1[num_entries],
1093 &ss1->info_1_str[num_entries],
1094 (*stot), 0x3, 1, 1, 3,"dummy_user", "IPC$");
1096 /* move on to creating next connection */
1097 /* move on to creating next conn */
1101 ss1->num_entries_read = num_entries;
1102 ss1->ptr_conn_info = num_entries > 0 ? 1 : 0;
1103 ss1->num_entries_read2 = num_entries;
1106 if ((*snum) >= (*stot)) {
1111 ss1->num_entries_read = 0;
1112 ss1->ptr_conn_info = 0;
1113 ss1->num_entries_read2 = 0;
1119 /*******************************************************************
1120 makes a SRV_R_NET_CONN_ENUM structure.
1121 ********************************************************************/
1123 static WERROR init_srv_conn_info_ctr(SRV_CONN_INFO_CTR *ctr,
1124 int switch_value, uint32 *resume_hnd, uint32 *total_entries)
1126 WERROR status = WERR_OK;
1127 DEBUG(5,("init_srv_conn_info_ctr: %d\n", __LINE__));
1129 ctr->switch_value = switch_value;
1131 switch (switch_value) {
1133 init_srv_conn_info_0(&ctr->conn.info0, resume_hnd, total_entries);
1134 ctr->ptr_conn_ctr = 1;
1137 init_srv_conn_info_1(&ctr->conn.info1, resume_hnd, total_entries);
1138 ctr->ptr_conn_ctr = 1;
1141 DEBUG(5,("init_srv_conn_info_ctr: unsupported switch value %d\n", switch_value));
1143 (*total_entries) = 0;
1144 ctr->ptr_conn_ctr = 0;
1145 status = WERR_UNKNOWN_LEVEL;
1152 /*******************************************************************
1153 makes a SRV_R_NET_CONN_ENUM structure.
1154 ********************************************************************/
1156 static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n,
1157 uint32 resume_hnd, int conn_level, int switch_value)
1159 DEBUG(5,("init_srv_r_net_conn_enum: %d\n", __LINE__));
1161 r_n->conn_level = conn_level;
1162 if (conn_level == -1)
1163 r_n->status = WERR_UNKNOWN_LEVEL;
1165 r_n->status = init_srv_conn_info_ctr(r_n->ctr, switch_value, &resume_hnd, &r_n->total_entries);
1167 if (!W_ERROR_IS_OK(r_n->status))
1170 init_enum_hnd(&r_n->enum_hnd, resume_hnd);
1173 /*******************************************************************
1174 makes a SRV_R_NET_FILE_ENUM structure.
1175 ********************************************************************/
1177 static WERROR net_file_enum_3( const char *username, SRV_R_NET_FILE_ENUM *r,
1180 TALLOC_CTX *ctx = talloc_tos();
1181 SRV_FILE_INFO_CTR *ctr = &r->ctr;
1183 /* TODO -- Windows enumerates
1185 (c) open directories and files */
1187 r->status = net_enum_files( ctx, username, &ctr->file.info3,
1188 &ctr->num_entries, resume_hnd );
1189 if ( !W_ERROR_IS_OK(r->status))
1192 r->status = net_enum_pipes( ctx, username, &ctr->file.info3,
1193 &ctr->num_entries, resume_hnd );
1194 if ( !W_ERROR_IS_OK(r->status))
1197 r->level = ctr->level = 3;
1198 r->total_entries = ctr->num_entries;
1199 /* ctr->num_entries = r->total_entries - resume_hnd; */
1200 ctr->num_entries2 = ctr->num_entries;
1201 ctr->ptr_file_info = 1;
1203 r->status = WERR_OK;
1206 if ( ctr->num_entries > 0 )
1207 ctr->ptr_entries = 1;
1209 init_enum_hnd(&r->enum_hnd, 0);
1214 /*******************************************************************
1215 *******************************************************************/
1217 WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u)
1219 switch ( q_u->level ) {
1222 if (!(username = rpcstr_pull_unistr2_talloc(
1223 p->mem_ctx, q_u->username))) {
1227 return net_file_enum_3(username, r_u,
1228 get_enum_hnd(&q_u->enum_hnd));
1231 return WERR_UNKNOWN_LEVEL;
1237 /*******************************************************************
1239 ********************************************************************/
1241 WERROR _srv_net_srv_get_info(pipes_struct *p, SRV_Q_NET_SRV_GET_INFO *q_u, SRV_R_NET_SRV_GET_INFO *r_u)
1243 WERROR status = WERR_OK;
1244 SRV_INFO_CTR *ctr = TALLOC_P(p->mem_ctx, SRV_INFO_CTR);
1251 DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__));
1253 if (!pipe_access_check(p)) {
1254 DEBUG(3, ("access denied to srv_net_srv_get_info\n"));
1255 return WERR_ACCESS_DENIED;
1258 switch (q_u->switch_value) {
1260 /* Technically level 102 should only be available to
1261 Administrators but there isn't anything super-secret
1262 here, as most of it is made up. */
1265 init_srv_info_102(&ctr->srv.sv102,
1266 500, global_myname(),
1267 string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH),
1268 lp_major_announce_version(), lp_minor_announce_version(),
1269 lp_default_server_announce(),
1270 0xffffffff, /* users */
1274 3000, /* announce delta */
1275 100000, /* licenses */
1276 "c:\\"); /* user path */
1279 init_srv_info_101(&ctr->srv.sv101,
1280 500, global_myname(),
1281 lp_major_announce_version(), lp_minor_announce_version(),
1282 lp_default_server_announce(),
1283 string_truncate(lp_serverstring(), MAX_SERVER_STRING_LENGTH));
1286 init_srv_info_100(&ctr->srv.sv100, 500, global_myname());
1289 status = WERR_UNKNOWN_LEVEL;
1293 /* set up the net server get info structure */
1294 init_srv_r_net_srv_get_info(r_u, q_u->switch_value, ctr, status);
1296 DEBUG(5,("srv_net_srv_get_info: %d\n", __LINE__));
1301 /*******************************************************************
1303 ********************************************************************/
1305 WERROR _srv_net_srv_set_info(pipes_struct *p, SRV_Q_NET_SRV_SET_INFO *q_u, SRV_R_NET_SRV_SET_INFO *r_u)
1307 WERROR status = WERR_OK;
1309 DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__));
1311 /* Set up the net server set info structure. */
1313 init_srv_r_net_srv_set_info(r_u, 0x0, status);
1315 DEBUG(5,("srv_net_srv_set_info: %d\n", __LINE__));
1320 /*******************************************************************
1322 ********************************************************************/
1324 WERROR _srv_net_conn_enum(pipes_struct *p, SRV_Q_NET_CONN_ENUM *q_u, SRV_R_NET_CONN_ENUM *r_u)
1326 DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));
1328 r_u->ctr = TALLOC_P(p->mem_ctx, SRV_CONN_INFO_CTR);
1332 ZERO_STRUCTP(r_u->ctr);
1335 init_srv_r_net_conn_enum(r_u,
1336 get_enum_hnd(&q_u->enum_hnd),
1338 q_u->ctr->switch_value);
1340 DEBUG(5,("srv_net_conn_enum: %d\n", __LINE__));
1345 /*******************************************************************
1347 ********************************************************************/
1349 WERROR _srv_net_sess_enum(pipes_struct *p, SRV_Q_NET_SESS_ENUM *q_u, SRV_R_NET_SESS_ENUM *r_u)
1351 DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));
1353 r_u->ctr = TALLOC_P(p->mem_ctx, SRV_SESS_INFO_CTR);
1357 ZERO_STRUCTP(r_u->ctr);
1360 init_srv_r_net_sess_enum(p, r_u,
1361 get_enum_hnd(&q_u->enum_hnd),
1363 q_u->ctr->switch_value);
1365 DEBUG(5,("_srv_net_sess_enum: %d\n", __LINE__));
1370 /*******************************************************************
1372 ********************************************************************/
1374 WERROR _srv_net_sess_del(pipes_struct *p, SRV_Q_NET_SESS_DEL *q_u, SRV_R_NET_SESS_DEL *r_u)
1376 struct sessionid *session_list;
1377 struct current_user user;
1378 int num_sessions, snum;
1381 bool not_root = False;
1383 rpcstr_pull_unistr2_fstring(username, &q_u->uni_user_name);
1384 rpcstr_pull_unistr2_fstring(machine, &q_u->uni_cli_name);
1386 /* strip leading backslashes if any */
1387 while (machine[0] == '\\') {
1388 memmove(machine, &machine[1], strlen(machine));
1391 num_sessions = list_sessions(p->mem_ctx, &session_list);
1393 DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
1395 r_u->status = WERR_ACCESS_DENIED;
1397 get_current_user(&user, p);
1399 /* fail out now if you are not root or not a domain admin */
1401 if ((user.ut.uid != sec_initial_uid()) &&
1402 ( ! nt_token_check_domain_rid(p->pipe_user.nt_user_token, DOMAIN_GROUP_RID_ADMINS))) {
1407 for (snum = 0; snum < num_sessions; snum++) {
1409 if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) &&
1410 strequal(session_list[snum].remote_machine, machine)) {
1414 if (user.ut.uid != sec_initial_uid()) {
1419 ntstat = messaging_send(smbd_messaging_context(),
1420 session_list[snum].pid,
1421 MSG_SHUTDOWN, &data_blob_null);
1423 if (NT_STATUS_IS_OK(ntstat))
1424 r_u->status = WERR_OK;
1431 DEBUG(5,("_srv_net_sess_del: %d\n", __LINE__));
1439 /*******************************************************************
1441 ********************************************************************/
1443 WERROR _srv_net_share_enum_all(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
1445 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1447 if (!pipe_access_check(p)) {
1448 DEBUG(3, ("access denied to srv_net_share_enum_all\n"));
1449 return WERR_ACCESS_DENIED;
1452 /* Create the list of shares for the response. */
1453 init_srv_r_net_share_enum(p, r_u,
1454 q_u->ctr.info_level,
1455 get_enum_hnd(&q_u->enum_hnd), True);
1457 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1462 /*******************************************************************
1464 ********************************************************************/
1466 WERROR _srv_net_share_enum(pipes_struct *p, SRV_Q_NET_SHARE_ENUM *q_u, SRV_R_NET_SHARE_ENUM *r_u)
1468 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1470 if (!pipe_access_check(p)) {
1471 DEBUG(3, ("access denied to srv_net_share_enum\n"));
1472 return WERR_ACCESS_DENIED;
1475 /* Create the list of shares for the response. */
1476 init_srv_r_net_share_enum(p, r_u,
1477 q_u->ctr.info_level,
1478 get_enum_hnd(&q_u->enum_hnd), False);
1480 DEBUG(5,("_srv_net_share_enum: %d\n", __LINE__));
1485 /*******************************************************************
1487 ********************************************************************/
1489 WERROR _srv_net_share_get_info(pipes_struct *p, SRV_Q_NET_SHARE_GET_INFO *q_u, SRV_R_NET_SHARE_GET_INFO *r_u)
1493 DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
1495 /* Create the list of shares for the response. */
1496 unistr2_to_ascii(share_name, &q_u->uni_share_name, sizeof(share_name));
1497 init_srv_r_net_share_get_info(p, r_u, share_name, q_u->info_level);
1499 DEBUG(5,("_srv_net_share_get_info: %d\n", __LINE__));
1504 /*******************************************************************
1505 Check a given DOS pathname is valid for a share.
1506 ********************************************************************/
1508 char *valid_share_pathname(TALLOC_CTX *ctx, const char *dos_pathname)
1512 if (!dos_pathname) {
1516 ptr = talloc_strdup(ctx, dos_pathname);
1520 /* Convert any '\' paths to '/' */
1522 ptr = unix_clean_name(ctx, ptr);
1527 /* NT is braindead - it wants a C: prefix to a pathname ! So strip it. */
1528 if (strlen(ptr) > 2 && ptr[1] == ':' && ptr[0] != '/')
1531 /* Only absolute paths allowed. */
1538 /*******************************************************************
1539 Net share set info. Modify share details.
1540 ********************************************************************/
1542 WERROR _srv_net_share_set_info(pipes_struct *p, SRV_Q_NET_SHARE_SET_INFO *q_u, SRV_R_NET_SHARE_SET_INFO *r_u)
1544 struct current_user user;
1545 char *command = NULL;
1546 char *share_name = NULL;
1547 char *comment = NULL;
1548 char *pathname = NULL;
1553 SEC_DESC *psd = NULL;
1554 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1555 bool is_disk_op = False;
1556 int max_connections = 0;
1557 TALLOC_CTX *ctx = p->mem_ctx;
1559 DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__));
1561 share_name = unistr2_to_ascii_talloc(ctx, &q_u->uni_share_name);
1563 return WERR_NET_NAME_NOT_FOUND;
1566 r_u->parm_error = 0;
1568 if ( strequal(share_name,"IPC$")
1569 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") )
1570 || strequal(share_name,"global") )
1572 return WERR_ACCESS_DENIED;
1575 snum = find_service(share_name);
1577 /* Does this share exist ? */
1579 return WERR_NET_NAME_NOT_FOUND;
1581 /* No change to printer shares. */
1582 if (lp_print_ok(snum))
1583 return WERR_ACCESS_DENIED;
1585 get_current_user(&user,p);
1587 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1589 /* fail out now if you are not root and not a disk op */
1591 if ( user.ut.uid != sec_initial_uid() && !is_disk_op )
1592 return WERR_ACCESS_DENIED;
1594 switch (q_u->info_level) {
1596 pathname = talloc_strdup(ctx, lp_pathname(snum));
1597 comment = unistr2_to_ascii_talloc(ctx,
1598 &q_u->info.share.info2.info_2_str.uni_remark);
1599 type = q_u->info.share.info2.info_2.type;
1603 comment = unistr2_to_ascii_talloc(ctx,
1604 &q_u->info.share.info2.info_2_str.uni_remark);
1605 pathname = unistr2_to_ascii_talloc(ctx,
1606 &q_u->info.share.info2.info_2_str.uni_path);
1607 type = q_u->info.share.info2.info_2.type;
1608 max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses;
1612 /* not supported on set but here for completeness */
1614 unistr2_to_ascii(comment, &q_u->info.share.info501.info_501_str.uni_remark, sizeof(comment));
1615 type = q_u->info.share.info501.info_501.type;
1620 comment = unistr2_to_ascii_talloc(ctx,
1621 &q_u->info.share.info502.info_502_str.uni_remark);
1622 pathname = unistr2_to_ascii_talloc(ctx,
1623 &q_u->info.share.info502.info_502_str.uni_path);
1624 type = q_u->info.share.info502.info_502.type;
1625 psd = q_u->info.share.info502.info_502_str.sd;
1626 map_generic_share_sd_bits(psd);
1629 pathname = talloc_strdup(ctx, lp_pathname(snum));
1630 comment = unistr2_to_ascii_talloc(ctx,
1631 &q_u->info.share.info1004.info_1004_str.uni_remark);
1632 type = STYPE_DISKTREE;
1635 /* XP re-sets the csc policy even if it wasn't changed by the
1636 user, so we must compare it to see if it's what is set in
1637 smb.conf, so that we can contine other ops like setting
1639 if (((q_u->info.share.info1005.share_info_flags &
1640 SHARE_1005_CSC_POLICY_MASK) >>
1641 SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum))
1644 DEBUG(3, ("_srv_net_share_set_info: client is trying to change csc policy from the network; must be done with smb.conf\n"));
1645 return WERR_ACCESS_DENIED;
1649 return WERR_ACCESS_DENIED;
1651 pathname = talloc_strdup(ctx, lp_pathname(snum));
1652 comment = talloc_strdup(ctx, lp_comment(snum));
1653 psd = q_u->info.share.info1501.sdb->sd;
1654 map_generic_share_sd_bits(psd);
1655 type = STYPE_DISKTREE;
1658 DEBUG(5,("_srv_net_share_set_info: unsupported switch value %d\n", q_u->info_level));
1659 return WERR_UNKNOWN_LEVEL;
1662 /* We can only modify disk shares. */
1663 if (type != STYPE_DISKTREE)
1664 return WERR_ACCESS_DENIED;
1666 /* Check if the pathname is valid. */
1667 if (!(path = valid_share_pathname(p->mem_ctx, pathname )))
1668 return WERR_OBJECT_PATH_INVALID;
1670 /* Ensure share name, pathname and comment don't contain '"' characters. */
1671 string_replace(share_name, '"', ' ');
1672 string_replace(path, '"', ' ');
1674 string_replace(comment, '"', ' ');
1677 DEBUG(10,("_srv_net_share_set_info: change share command = %s\n",
1678 lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" ));
1680 /* Only call modify function if something changed. */
1682 if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum))
1683 || (lp_max_connections(snum) != max_connections)) {
1684 if (!lp_change_share_cmd() || !*lp_change_share_cmd()) {
1685 DEBUG(10,("_srv_net_share_set_info: No change share command\n"));
1686 return WERR_ACCESS_DENIED;
1689 command = talloc_asprintf(p->mem_ctx,
1690 "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1691 lp_change_share_cmd(),
1692 get_dyn_CONFIGFILE(),
1695 comment ? comment : "",
1701 DEBUG(10,("_srv_net_share_set_info: Running [%s]\n", command ));
1703 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1708 if ( (ret = smbrun(command, NULL)) == 0 ) {
1709 /* Tell everyone we updated smb.conf. */
1710 message_send_all(smbd_messaging_context(),
1711 MSG_SMB_CONF_UPDATED, NULL, 0,
1718 /********* END SeDiskOperatorPrivilege BLOCK *********/
1720 DEBUG(3,("_srv_net_share_set_info: Running [%s] returned (%d)\n", command, ret ));
1722 TALLOC_FREE(command);
1725 return WERR_ACCESS_DENIED;
1727 DEBUG(10,("_srv_net_share_set_info: No change to share name (%s)\n", share_name ));
1730 /* Replace SD if changed. */
1735 old_sd = get_share_security(p->mem_ctx, lp_servicename(snum), &sd_size);
1737 if (old_sd && !sec_desc_equal(old_sd, psd)) {
1738 if (!set_share_security(share_name, psd))
1739 DEBUG(0,("_srv_net_share_set_info: Failed to change security info in share %s.\n",
1744 DEBUG(5,("_srv_net_share_set_info: %d\n", __LINE__));
1749 /*******************************************************************
1750 Net share add. Call 'add_share_command "sharename" "pathname"
1751 "comment" "max connections = "
1752 ********************************************************************/
1754 WERROR _srv_net_share_add(pipes_struct *p, SRV_Q_NET_SHARE_ADD *q_u, SRV_R_NET_SHARE_ADD *r_u)
1756 struct current_user user;
1757 char *command = NULL;
1758 char *share_name = NULL;
1759 char *comment = NULL;
1760 char *pathname = NULL;
1765 SEC_DESC *psd = NULL;
1766 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1768 int max_connections = 0;
1769 TALLOC_CTX *ctx = p->mem_ctx;
1771 DEBUG(5,("_srv_net_share_add: %d\n", __LINE__));
1773 r_u->parm_error = 0;
1775 get_current_user(&user,p);
1777 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1779 if (user.ut.uid != sec_initial_uid() && !is_disk_op )
1780 return WERR_ACCESS_DENIED;
1782 if (!lp_add_share_cmd() || !*lp_add_share_cmd()) {
1783 DEBUG(10,("_srv_net_share_add: No add share command\n"));
1784 return WERR_ACCESS_DENIED;
1787 switch (q_u->info_level) {
1789 /* No path. Not enough info in a level 0 to do anything. */
1790 return WERR_ACCESS_DENIED;
1792 /* Not enough info in a level 1 to do anything. */
1793 return WERR_ACCESS_DENIED;
1795 share_name = unistr2_to_ascii_talloc(ctx,
1796 &q_u->info.share.info2.info_2_str.uni_netname);
1797 comment = unistr2_to_ascii_talloc(ctx,
1798 &q_u->info.share.info2.info_2_str.uni_remark);
1799 pathname = unistr2_to_ascii_talloc(ctx,
1800 &q_u->info.share.info2.info_2_str.uni_path);
1801 max_connections = (q_u->info.share.info2.info_2.max_uses == 0xffffffff) ? 0 : q_u->info.share.info2.info_2.max_uses;
1802 type = q_u->info.share.info2.info_2.type;
1805 /* No path. Not enough info in a level 501 to do anything. */
1806 return WERR_ACCESS_DENIED;
1808 share_name = unistr2_to_ascii_talloc(ctx,
1809 &q_u->info.share.info502.info_502_str.uni_netname);
1810 comment = unistr2_to_ascii_talloc(ctx,
1811 &q_u->info.share.info502.info_502_str.uni_remark);
1812 pathname = unistr2_to_ascii_talloc(ctx,
1813 &q_u->info.share.info502.info_502_str.uni_path);
1814 type = q_u->info.share.info502.info_502.type;
1815 psd = q_u->info.share.info502.info_502_str.sd;
1816 map_generic_share_sd_bits(psd);
1819 /* none of the following contain share names. NetShareAdd does not have a separate parameter for the share name */
1825 return WERR_ACCESS_DENIED;
1827 /* DFS only level. */
1828 return WERR_ACCESS_DENIED;
1830 DEBUG(5,("_srv_net_share_add: unsupported switch value %d\n", q_u->info_level));
1831 return WERR_UNKNOWN_LEVEL;
1834 /* check for invalid share names */
1836 if (!share_name || !validate_net_name(share_name,
1837 INVALID_SHARENAME_CHARS,
1838 strlen(share_name))) {
1839 DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n",
1840 share_name ? share_name : ""));
1841 return WERR_INVALID_NAME;
1844 if (strequal(share_name,"IPC$") || strequal(share_name,"global")
1845 || (lp_enable_asu_support() &&
1846 strequal(share_name,"ADMIN$"))) {
1847 return WERR_ACCESS_DENIED;
1850 snum = find_service(share_name);
1852 /* Share already exists. */
1854 return WERR_ALREADY_EXISTS;
1857 /* We can only add disk shares. */
1858 if (type != STYPE_DISKTREE) {
1859 return WERR_ACCESS_DENIED;
1862 /* Check if the pathname is valid. */
1863 if (!(path = valid_share_pathname(p->mem_ctx, pathname))) {
1864 return WERR_OBJECT_PATH_INVALID;
1867 /* Ensure share name, pathname and comment don't contain '"' characters. */
1868 string_replace(share_name, '"', ' ');
1869 string_replace(path, '"', ' ');
1871 string_replace(comment, '"', ' ');
1874 command = talloc_asprintf(ctx,
1875 "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1877 get_dyn_CONFIGFILE(),
1880 comment ? comment : "",
1886 DEBUG(10,("_srv_net_share_add: Running [%s]\n", command ));
1888 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1893 if ( (ret = smbrun(command, NULL)) == 0 ) {
1894 /* Tell everyone we updated smb.conf. */
1895 message_send_all(smbd_messaging_context(),
1896 MSG_SMB_CONF_UPDATED, NULL, 0, NULL);
1902 /********* END SeDiskOperatorPrivilege BLOCK *********/
1904 DEBUG(3,("_srv_net_share_add: Running [%s] returned (%d)\n", command, ret ));
1906 TALLOC_FREE(command);
1909 return WERR_ACCESS_DENIED;
1912 if (!set_share_security(share_name, psd)) {
1913 DEBUG(0,("_srv_net_share_add: Failed to add security info to share %s.\n", share_name ));
1918 * We don't call reload_services() here, the message will
1919 * cause this to be done before the next packet is read
1920 * from the client. JRA.
1923 DEBUG(5,("_srv_net_share_add: %d\n", __LINE__));
1928 /*******************************************************************
1929 Net share delete. Call "delete share command" with the share name as
1931 ********************************************************************/
1933 WERROR _srv_net_share_del(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
1935 struct current_user user;
1936 char *command = NULL;
1937 char *share_name = NULL;
1940 SE_PRIV se_diskop = SE_DISK_OPERATOR;
1942 struct share_params *params;
1943 TALLOC_CTX *ctx = p->mem_ctx;
1945 DEBUG(5,("_srv_net_share_del: %d\n", __LINE__));
1947 share_name = unistr2_to_ascii_talloc(ctx, &q_u->uni_share_name);
1950 return WERR_NET_NAME_NOT_FOUND;
1952 if ( strequal(share_name,"IPC$")
1953 || ( lp_enable_asu_support() && strequal(share_name,"ADMIN$") )
1954 || strequal(share_name,"global") )
1956 return WERR_ACCESS_DENIED;
1959 if (!(params = get_share_params(p->mem_ctx, share_name))) {
1960 return WERR_NO_SUCH_SHARE;
1963 snum = find_service(share_name);
1965 /* No change to printer shares. */
1966 if (lp_print_ok(snum))
1967 return WERR_ACCESS_DENIED;
1969 get_current_user(&user,p);
1971 is_disk_op = user_has_privileges( p->pipe_user.nt_user_token, &se_diskop );
1973 if (user.ut.uid != sec_initial_uid() && !is_disk_op )
1974 return WERR_ACCESS_DENIED;
1976 if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) {
1977 DEBUG(10,("_srv_net_share_del: No delete share command\n"));
1978 return WERR_ACCESS_DENIED;
1981 command = talloc_asprintf(ctx,
1983 lp_delete_share_cmd(),
1984 get_dyn_CONFIGFILE(),
1985 lp_servicename(snum));
1990 DEBUG(10,("_srv_net_share_del: Running [%s]\n", command ));
1992 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1997 if ( (ret = smbrun(command, NULL)) == 0 ) {
1998 /* Tell everyone we updated smb.conf. */
1999 message_send_all(smbd_messaging_context(),
2000 MSG_SMB_CONF_UPDATED, NULL, 0, NULL);
2006 /********* END SeDiskOperatorPrivilege BLOCK *********/
2008 DEBUG(3,("_srv_net_share_del: Running [%s] returned (%d)\n", command, ret ));
2011 return WERR_ACCESS_DENIED;
2013 /* Delete the SD in the database. */
2014 delete_share_security(lp_servicename(params->service));
2016 lp_killservice(params->service);
2021 WERROR _srv_net_share_del_sticky(pipes_struct *p, SRV_Q_NET_SHARE_DEL *q_u, SRV_R_NET_SHARE_DEL *r_u)
2023 DEBUG(5,("_srv_net_share_del_stick: %d\n", __LINE__));
2025 return _srv_net_share_del(p, q_u, r_u);
2028 /*******************************************************************
2030 ********************************************************************/
2032 WERROR _srv_net_remote_tod(pipes_struct *p, SRV_Q_NET_REMOTE_TOD *q_u, SRV_R_NET_REMOTE_TOD *r_u)
2034 TIME_OF_DAY_INFO *tod;
2036 time_t unixdate = time(NULL);
2038 /* We do this call first as if we do it *after* the gmtime call
2039 it overwrites the pointed-to values. JRA */
2041 uint32 zone = get_time_zone(unixdate)/60;
2043 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
2045 if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, TIME_OF_DAY_INFO)) )
2049 r_u->ptr_srv_tod = 0x1;
2050 r_u->status = WERR_OK;
2052 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
2054 t = gmtime(&unixdate);
2057 init_time_of_day_info(tod,
2071 DEBUG(5,("_srv_net_remote_tod: %d\n", __LINE__));
2076 /***********************************************************************************
2077 Win9x NT tools get security descriptor.
2078 ***********************************************************************************/
2080 WERROR _srv_net_file_query_secdesc(pipes_struct *p, SRV_Q_NET_FILE_QUERY_SECDESC *q_u,
2081 SRV_R_NET_FILE_QUERY_SECDESC *r_u)
2083 SEC_DESC *psd = NULL;
2086 char *filename_in = NULL;
2087 char *filename = NULL;
2088 char *qualname = NULL;
2091 struct current_user user;
2092 connection_struct *conn = NULL;
2093 bool became_user = False;
2094 TALLOC_CTX *ctx = p->mem_ctx;
2098 r_u->status = WERR_OK;
2100 qualname = unistr2_to_ascii_talloc(ctx, &q_u->uni_qual_name);
2102 r_u->status = WERR_ACCESS_DENIED;
2106 /* Null password is ok - we are already an authenticated user... */
2107 null_pw = data_blob_null;
2109 get_current_user(&user, p);
2112 conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status);
2116 DEBUG(3,("_srv_net_file_query_secdesc: Unable to connect to %s\n", qualname));
2117 r_u->status = ntstatus_to_werror(nt_status);
2121 if (!become_user(conn, conn->vuid)) {
2122 DEBUG(0,("_srv_net_file_query_secdesc: Can't become connected user!\n"));
2123 r_u->status = WERR_ACCESS_DENIED;
2128 filename_in = unistr2_to_ascii_talloc(ctx, &q_u->uni_file_name);
2130 r_u->status = WERR_ACCESS_DENIED;
2134 nt_status = unix_convert(ctx, conn, filename_in, False, &filename, NULL, &st);
2135 if (!NT_STATUS_IS_OK(nt_status)) {
2136 DEBUG(3,("_srv_net_file_query_secdesc: bad pathname %s\n", filename));
2137 r_u->status = WERR_ACCESS_DENIED;
2141 nt_status = check_name(conn, filename);
2142 if (!NT_STATUS_IS_OK(nt_status)) {
2143 DEBUG(3,("_srv_net_file_query_secdesc: can't access %s\n", filename));
2144 r_u->status = WERR_ACCESS_DENIED;
2148 nt_status = SMB_VFS_GET_NT_ACL(conn, filename,
2149 (OWNER_SECURITY_INFORMATION
2150 |GROUP_SECURITY_INFORMATION
2151 |DACL_SECURITY_INFORMATION), &psd);
2153 if (!NT_STATUS_IS_OK(nt_status)) {
2154 DEBUG(3,("_srv_net_file_query_secdesc: Unable to get NT ACL for file %s\n", filename));
2155 r_u->status = ntstatus_to_werror(nt_status);
2159 sd_size = ndr_size_security_descriptor(psd, 0);
2161 r_u->ptr_response = 1;
2162 r_u->size_response = sd_size;
2163 r_u->ptr_secdesc = 1;
2164 r_u->size_secdesc = sd_size;
2165 r_u->sec_desc = psd;
2167 psd->dacl->revision = NT4_ACL_REVISION;
2170 close_cnum(conn, user.vuid);
2179 close_cnum(conn, user.vuid);
2184 /***********************************************************************************
2185 Win9x NT tools set security descriptor.
2186 ***********************************************************************************/
2188 WERROR _srv_net_file_set_secdesc(pipes_struct *p, SRV_Q_NET_FILE_SET_SECDESC *q_u,
2189 SRV_R_NET_FILE_SET_SECDESC *r_u)
2191 char *filename_in = NULL;
2192 char *filename = NULL;
2193 char *qualname = NULL;
2195 files_struct *fsp = NULL;
2198 struct current_user user;
2199 connection_struct *conn = NULL;
2200 bool became_user = False;
2201 TALLOC_CTX *ctx = p->mem_ctx;
2205 r_u->status = WERR_OK;
2207 qualname = unistr2_to_ascii_talloc(ctx, &q_u->uni_qual_name);
2209 r_u->status = WERR_ACCESS_DENIED;
2213 /* Null password is ok - we are already an authenticated user... */
2214 null_pw = data_blob_null;
2216 get_current_user(&user, p);
2219 conn = make_connection(qualname, null_pw, "A:", user.vuid, &nt_status);
2223 DEBUG(3,("_srv_net_file_set_secdesc: Unable to connect to %s\n", qualname));
2224 r_u->status = ntstatus_to_werror(nt_status);
2228 if (!become_user(conn, conn->vuid)) {
2229 DEBUG(0,("_srv_net_file_set_secdesc: Can't become connected user!\n"));
2230 r_u->status = WERR_ACCESS_DENIED;
2235 filename_in= unistr2_to_ascii_talloc(ctx, &q_u->uni_file_name);
2237 r_u->status = WERR_ACCESS_DENIED;
2241 nt_status = unix_convert(ctx, conn, filename, False, &filename, NULL, &st);
2242 if (!NT_STATUS_IS_OK(nt_status)) {
2243 DEBUG(3,("_srv_net_file_set_secdesc: bad pathname %s\n", filename));
2244 r_u->status = WERR_ACCESS_DENIED;
2248 nt_status = check_name(conn, filename);
2249 if (!NT_STATUS_IS_OK(nt_status)) {
2250 DEBUG(3,("_srv_net_file_set_secdesc: can't access %s\n", filename));
2251 r_u->status = WERR_ACCESS_DENIED;
2255 nt_status = open_file_stat(conn, NULL, filename, &st, &fsp);
2257 if ( !NT_STATUS_IS_OK(nt_status) ) {
2258 /* Perhaps it is a directory */
2259 if (NT_STATUS_EQUAL(nt_status, NT_STATUS_FILE_IS_A_DIRECTORY))
2260 nt_status = open_directory(conn, NULL, filename, &st,
2261 FILE_READ_ATTRIBUTES,
2262 FILE_SHARE_READ|FILE_SHARE_WRITE,
2265 FILE_ATTRIBUTE_DIRECTORY,
2268 if ( !NT_STATUS_IS_OK(nt_status) ) {
2269 DEBUG(3,("_srv_net_file_set_secdesc: Unable to open file %s\n", filename));
2270 r_u->status = ntstatus_to_werror(nt_status);
2275 nt_status = SMB_VFS_SET_NT_ACL(fsp, fsp->fsp_name, q_u->sec_info, q_u->sec_desc);
2277 if (!NT_STATUS_IS_OK(nt_status) ) {
2278 DEBUG(3,("_srv_net_file_set_secdesc: Unable to set NT ACL on file %s\n", filename));
2279 r_u->status = WERR_ACCESS_DENIED;
2283 close_file(fsp, NORMAL_CLOSE);
2285 close_cnum(conn, user.vuid);
2291 close_file(fsp, NORMAL_CLOSE);
2299 close_cnum(conn, user.vuid);
2305 /***********************************************************************************
2306 It may be that we want to limit users to creating shares on certain areas of the UNIX file area.
2307 We could define areas by mapping Windows style disks to points on the UNIX directory hierarchy.
2308 These disks would the disks listed by this function.
2309 Users could then create shares relative to these disks. Watch out for moving these disks around.
2310 "Nigel Williams" <nigel@veritas.com>.
2311 ***********************************************************************************/
2313 static const char *server_disks[] = {"C:"};
2315 static uint32 get_server_disk_count(void)
2317 return sizeof(server_disks)/sizeof(server_disks[0]);
2320 static uint32 init_server_disk_enum(uint32 *resume)
2322 uint32 server_disk_count = get_server_disk_count();
2324 /*resume can be an offset into the list for now*/
2326 if(*resume & 0x80000000)
2329 if(*resume > server_disk_count)
2330 *resume = server_disk_count;
2332 return server_disk_count - *resume;
2335 static const char *next_server_disk_enum(uint32 *resume)
2339 if(init_server_disk_enum(resume) == 0)
2342 disk = server_disks[*resume];
2346 DEBUG(10, ("next_server_disk_enum: reporting disk %s. resume handle %d.\n", disk, *resume));
2351 WERROR _srv_net_disk_enum(pipes_struct *p, SRV_Q_NET_DISK_ENUM *q_u, SRV_R_NET_DISK_ENUM *r_u)
2354 const char *disk_name;
2355 TALLOC_CTX *ctx = p->mem_ctx;
2356 uint32 resume=get_enum_hnd(&q_u->enum_hnd);
2358 r_u->status=WERR_OK;
2360 r_u->total_entries = init_server_disk_enum(&resume);
2362 r_u->disk_enum_ctr.unknown = 0;
2364 if(!(r_u->disk_enum_ctr.disk_info = TALLOC_ARRAY(ctx, DISK_INFO, MAX_SERVER_DISK_ENTRIES))) {
2368 r_u->disk_enum_ctr.disk_info_ptr = r_u->disk_enum_ctr.disk_info ? 1 : 0;
2370 /*allow one DISK_INFO for null terminator*/
2372 for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(&resume)); i++) {
2374 r_u->disk_enum_ctr.entries_read++;
2376 /*copy disk name into a unicode string*/
2378 init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, disk_name);
2381 /* add a terminating null string. Is this there if there is more data to come? */
2383 r_u->disk_enum_ctr.entries_read++;
2385 init_unistr3(&r_u->disk_enum_ctr.disk_info[i].disk_name, "");
2387 init_enum_hnd(&r_u->enum_hnd, resume);
2392 /********************************************************************
2393 ********************************************************************/
2395 WERROR _srv_net_name_validate(pipes_struct *p, SRV_Q_NET_NAME_VALIDATE *q_u, SRV_R_NET_NAME_VALIDATE *r_u)
2399 switch ( q_u->type ) {
2401 rpcstr_pull(sharename, q_u->sharename.buffer, sizeof(sharename), q_u->sharename.uni_str_len*2, 0);
2402 if ( !validate_net_name( sharename, INVALID_SHARENAME_CHARS, sizeof(sharename) ) ) {
2403 DEBUG(5,("_srv_net_name_validate: Bad sharename \"%s\"\n", sharename));
2404 return WERR_INVALID_NAME;
2409 return WERR_UNKNOWN_LEVEL;
2416 /********************************************************************
2417 ********************************************************************/
2419 WERROR _srvsvc_NetFileClose(pipes_struct *p, struct srvsvc_NetFileClose *r)
2421 return WERR_ACCESS_DENIED;
2425 /********************************************************************
2426 ********************************************************************/
2428 WERROR _srvsvc_NetCharDevEnum(pipes_struct *p, struct srvsvc_NetCharDevEnum *r)
2430 p->rng_fault_state = True;
2431 return WERR_NOT_SUPPORTED;
2434 WERROR _srvsvc_NetCharDevGetInfo(pipes_struct *p, struct srvsvc_NetCharDevGetInfo *r)
2436 p->rng_fault_state = True;
2437 return WERR_NOT_SUPPORTED;
2440 WERROR _srvsvc_NetCharDevControl(pipes_struct *p, struct srvsvc_NetCharDevControl *r)
2442 p->rng_fault_state = True;
2443 return WERR_NOT_SUPPORTED;
2446 WERROR _srvsvc_NetCharDevQEnum(pipes_struct *p, struct srvsvc_NetCharDevQEnum *r)
2448 p->rng_fault_state = True;
2449 return WERR_NOT_SUPPORTED;
2452 WERROR _srvsvc_NetCharDevQGetInfo(pipes_struct *p, struct srvsvc_NetCharDevQGetInfo *r)
2454 p->rng_fault_state = True;
2455 return WERR_NOT_SUPPORTED;
2458 WERROR _srvsvc_NetCharDevQSetInfo(pipes_struct *p, struct srvsvc_NetCharDevQSetInfo *r)
2460 p->rng_fault_state = True;
2461 return WERR_NOT_SUPPORTED;
2464 WERROR _srvsvc_NetCharDevQPurge(pipes_struct *p, struct srvsvc_NetCharDevQPurge *r)
2466 p->rng_fault_state = True;
2467 return WERR_NOT_SUPPORTED;
2470 WERROR _srvsvc_NetCharDevQPurgeSelf(pipes_struct *p, struct srvsvc_NetCharDevQPurgeSelf *r)
2472 p->rng_fault_state = True;
2473 return WERR_NOT_SUPPORTED;
2476 WERROR _srvsvc_NetConnEnum(pipes_struct *p, struct srvsvc_NetConnEnum *r)
2478 p->rng_fault_state = True;
2479 return WERR_NOT_SUPPORTED;
2482 WERROR _srvsvc_NetFileEnum(pipes_struct *p, struct srvsvc_NetFileEnum *r)
2484 p->rng_fault_state = True;
2485 return WERR_NOT_SUPPORTED;
2488 WERROR _srvsvc_NetFileGetInfo(pipes_struct *p, struct srvsvc_NetFileGetInfo *r)
2490 p->rng_fault_state = True;
2491 return WERR_NOT_SUPPORTED;
2494 WERROR _srvsvc_NetSessEnum(pipes_struct *p, struct srvsvc_NetSessEnum *r)
2496 p->rng_fault_state = True;
2497 return WERR_NOT_SUPPORTED;
2500 WERROR _srvsvc_NetSessDel(pipes_struct *p, struct srvsvc_NetSessDel *r)
2502 p->rng_fault_state = True;
2503 return WERR_NOT_SUPPORTED;
2506 WERROR _srvsvc_NetShareAdd(pipes_struct *p, struct srvsvc_NetShareAdd *r)
2508 p->rng_fault_state = True;
2509 return WERR_NOT_SUPPORTED;
2512 WERROR _srvsvc_NetShareEnumAll(pipes_struct *p, struct srvsvc_NetShareEnumAll *r)
2514 p->rng_fault_state = True;
2515 return WERR_NOT_SUPPORTED;
2518 WERROR _srvsvc_NetShareGetInfo(pipes_struct *p, struct srvsvc_NetShareGetInfo *r)
2520 p->rng_fault_state = True;
2521 return WERR_NOT_SUPPORTED;
2524 WERROR _srvsvc_NetShareSetInfo(pipes_struct *p, struct srvsvc_NetShareSetInfo *r)
2526 p->rng_fault_state = True;
2527 return WERR_NOT_SUPPORTED;
2530 WERROR _srvsvc_NetShareDel(pipes_struct *p, struct srvsvc_NetShareDel *r)
2532 p->rng_fault_state = True;
2533 return WERR_NOT_SUPPORTED;
2536 WERROR _srvsvc_NetShareDelSticky(pipes_struct *p, struct srvsvc_NetShareDelSticky *r)
2538 p->rng_fault_state = True;
2539 return WERR_NOT_SUPPORTED;
2542 WERROR _srvsvc_NetShareCheck(pipes_struct *p, struct srvsvc_NetShareCheck *r)
2544 p->rng_fault_state = True;
2545 return WERR_NOT_SUPPORTED;
2548 WERROR _srvsvc_NetSrvGetInfo(pipes_struct *p, struct srvsvc_NetSrvGetInfo *r)
2550 p->rng_fault_state = True;
2551 return WERR_NOT_SUPPORTED;
2554 WERROR _srvsvc_NetSrvSetInfo(pipes_struct *p, struct srvsvc_NetSrvSetInfo *r)
2556 p->rng_fault_state = True;
2557 return WERR_NOT_SUPPORTED;
2560 WERROR _srvsvc_NetDiskEnum(pipes_struct *p, struct srvsvc_NetDiskEnum *r)
2562 p->rng_fault_state = True;
2563 return WERR_NOT_SUPPORTED;
2566 WERROR _srvsvc_NetServerStatisticsGet(pipes_struct *p, struct srvsvc_NetServerStatisticsGet *r)
2568 p->rng_fault_state = True;
2569 return WERR_NOT_SUPPORTED;
2572 WERROR _srvsvc_NetTransportAdd(pipes_struct *p, struct srvsvc_NetTransportAdd *r)
2574 p->rng_fault_state = True;
2575 return WERR_NOT_SUPPORTED;
2578 WERROR _srvsvc_NetTransportEnum(pipes_struct *p, struct srvsvc_NetTransportEnum *r)
2580 p->rng_fault_state = True;
2581 return WERR_NOT_SUPPORTED;
2584 WERROR _srvsvc_NetTransportDel(pipes_struct *p, struct srvsvc_NetTransportDel *r)
2586 p->rng_fault_state = True;
2587 return WERR_NOT_SUPPORTED;
2590 WERROR _srvsvc_NetRemoteTOD(pipes_struct *p, struct srvsvc_NetRemoteTOD *r)
2592 p->rng_fault_state = True;
2593 return WERR_NOT_SUPPORTED;
2596 WERROR _srvsvc_NetSetServiceBits(pipes_struct *p, struct srvsvc_NetSetServiceBits *r)
2598 p->rng_fault_state = True;
2599 return WERR_NOT_SUPPORTED;
2602 WERROR _srvsvc_NetPathType(pipes_struct *p, struct srvsvc_NetPathType *r)
2604 p->rng_fault_state = True;
2605 return WERR_NOT_SUPPORTED;
2608 WERROR _srvsvc_NetPathCanonicalize(pipes_struct *p, struct srvsvc_NetPathCanonicalize *r)
2610 p->rng_fault_state = True;
2611 return WERR_NOT_SUPPORTED;
2614 WERROR _srvsvc_NetPathCompare(pipes_struct *p, struct srvsvc_NetPathCompare *r)
2616 p->rng_fault_state = True;
2617 return WERR_NOT_SUPPORTED;
2620 WERROR _srvsvc_NetNameValidate(pipes_struct *p, struct srvsvc_NetNameValidate *r)
2622 p->rng_fault_state = True;
2623 return WERR_NOT_SUPPORTED;
2626 WERROR _srvsvc_NETRPRNAMECANONICALIZE(pipes_struct *p, struct srvsvc_NETRPRNAMECANONICALIZE *r)
2628 p->rng_fault_state = True;
2629 return WERR_NOT_SUPPORTED;
2632 WERROR _srvsvc_NetPRNameCompare(pipes_struct *p, struct srvsvc_NetPRNameCompare *r)
2634 p->rng_fault_state = True;
2635 return WERR_NOT_SUPPORTED;
2638 WERROR _srvsvc_NetShareEnum(pipes_struct *p, struct srvsvc_NetShareEnum *r)
2640 p->rng_fault_state = True;
2641 return WERR_NOT_SUPPORTED;
2644 WERROR _srvsvc_NetShareDelStart(pipes_struct *p, struct srvsvc_NetShareDelStart *r)
2646 p->rng_fault_state = True;
2647 return WERR_NOT_SUPPORTED;
2650 WERROR _srvsvc_NetShareDelCommit(pipes_struct *p, struct srvsvc_NetShareDelCommit *r)
2652 p->rng_fault_state = True;
2653 return WERR_NOT_SUPPORTED;
2656 WERROR _srvsvc_NetGetFileSecurity(pipes_struct *p, struct srvsvc_NetGetFileSecurity *r)
2658 p->rng_fault_state = True;
2659 return WERR_NOT_SUPPORTED;
2662 WERROR _srvsvc_NetSetFileSecurity(pipes_struct *p, struct srvsvc_NetSetFileSecurity *r)
2664 p->rng_fault_state = True;
2665 return WERR_NOT_SUPPORTED;
2668 WERROR _srvsvc_NetServerTransportAddEx(pipes_struct *p, struct srvsvc_NetServerTransportAddEx *r)
2670 p->rng_fault_state = True;
2671 return WERR_NOT_SUPPORTED;
2674 WERROR _srvsvc_NetServerSetServiceBitsEx(pipes_struct *p, struct srvsvc_NetServerSetServiceBitsEx *r)
2676 p->rng_fault_state = True;
2677 return WERR_NOT_SUPPORTED;
2680 WERROR _srvsvc_NETRDFSGETVERSION(pipes_struct *p, struct srvsvc_NETRDFSGETVERSION *r)
2682 p->rng_fault_state = True;
2683 return WERR_NOT_SUPPORTED;
2686 WERROR _srvsvc_NETRDFSCREATELOCALPARTITION(pipes_struct *p, struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
2688 p->rng_fault_state = True;
2689 return WERR_NOT_SUPPORTED;
2692 WERROR _srvsvc_NETRDFSDELETELOCALPARTITION(pipes_struct *p, struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
2694 p->rng_fault_state = True;
2695 return WERR_NOT_SUPPORTED;
2698 WERROR _srvsvc_NETRDFSSETLOCALVOLUMESTATE(pipes_struct *p, struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
2700 p->rng_fault_state = True;
2701 return WERR_NOT_SUPPORTED;
2704 WERROR _srvsvc_NETRDFSSETSERVERINFO(pipes_struct *p, struct srvsvc_NETRDFSSETSERVERINFO *r)
2706 p->rng_fault_state = True;
2707 return WERR_NOT_SUPPORTED;
2710 WERROR _srvsvc_NETRDFSCREATEEXITPOINT(pipes_struct *p, struct srvsvc_NETRDFSCREATEEXITPOINT *r)
2712 p->rng_fault_state = True;
2713 return WERR_NOT_SUPPORTED;
2716 WERROR _srvsvc_NETRDFSDELETEEXITPOINT(pipes_struct *p, struct srvsvc_NETRDFSDELETEEXITPOINT *r)
2718 p->rng_fault_state = True;
2719 return WERR_NOT_SUPPORTED;
2722 WERROR _srvsvc_NETRDFSMODIFYPREFIX(pipes_struct *p, struct srvsvc_NETRDFSMODIFYPREFIX *r)
2724 p->rng_fault_state = True;
2725 return WERR_NOT_SUPPORTED;
2728 WERROR _srvsvc_NETRDFSFIXLOCALVOLUME(pipes_struct *p, struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
2730 p->rng_fault_state = True;
2731 return WERR_NOT_SUPPORTED;
2734 WERROR _srvsvc_NETRDFSMANAGERREPORTSITEINFO(pipes_struct *p, struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
2736 p->rng_fault_state = True;
2737 return WERR_NOT_SUPPORTED;
2740 WERROR _srvsvc_NETRSERVERTRANSPORTDELEX(pipes_struct *p, struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
2742 p->rng_fault_state = True;
2743 return WERR_NOT_SUPPORTED;