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.
8 * Copyright (C) Guenther Deschner 2008.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, see <http://www.gnu.org/licenses/>.
24 /* This is the implementation of the srvsvc pipe. */
27 #include "system/passwd.h"
28 #include "../librpc/gen_ndr/srv_srvsvc.h"
29 #include "../libcli/security/security.h"
30 #include "../librpc/gen_ndr/ndr_security.h"
33 #include "../lib/util/util_pw.h"
34 #include "smbd/smbd.h"
39 extern const struct generic_mapping file_generic_mapping;
42 #define DBGC_CLASS DBGC_RPC_SRV
44 #define MAX_SERVER_DISK_ENTRIES 15
46 /* Use for enumerating connections, pipes, & files */
48 struct file_enum_count {
51 struct srvsvc_NetFileCtr3 *ctr3;
54 struct sess_file_count {
60 /* Used to store pipe open records for NetFileEnum() */
62 struct pipe_open_rec {
69 /****************************************************************************
70 Count the entries belonging to a service in the connection db.
71 ****************************************************************************/
73 static int pipe_enum_fn( struct db_record *rec, void *p)
75 struct pipe_open_rec prec;
76 struct file_enum_count *fenum = (struct file_enum_count *)p;
77 struct srvsvc_NetFileInfo3 *f;
78 int i = fenum->ctr3->count;
79 char *fullpath = NULL;
82 if (rec->value.dsize != sizeof(struct pipe_open_rec))
85 memcpy(&prec, rec->value.dptr, sizeof(struct pipe_open_rec));
87 if ( !process_exists(prec.pid) ) {
91 username = uidtoname(prec.uid);
93 if ((fenum->username != NULL)
94 && !strequal(username, fenum->username)) {
98 fullpath = talloc_asprintf(fenum->ctx, "\\PIPE\\%s", prec.name );
103 f = TALLOC_REALLOC_ARRAY(fenum->ctx, fenum->ctr3->array,
104 struct srvsvc_NetFileInfo3, i+1);
106 DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
109 fenum->ctr3->array = f;
111 fenum->ctr3->array[i].fid =
112 (((uint32_t)(procid_to_pid(&prec.pid))<<16) | prec.pnum);
113 fenum->ctr3->array[i].permissions =
114 (FILE_READ_DATA|FILE_WRITE_DATA);
115 fenum->ctr3->array[i].num_locks = 0;
116 fenum->ctr3->array[i].path = fullpath;
117 fenum->ctr3->array[i].user = username;
119 fenum->ctr3->count++;
124 /*******************************************************************
125 ********************************************************************/
127 static WERROR net_enum_pipes(TALLOC_CTX *ctx,
128 const char *username,
129 struct srvsvc_NetFileCtr3 **ctr3,
132 struct file_enum_count fenum;
135 fenum.username = username;
138 if (connections_traverse(pipe_enum_fn, &fenum) == -1) {
139 DEBUG(0,("net_enum_pipes: traverse of connections.tdb "
149 /*******************************************************************
150 ********************************************************************/
152 static void enum_file_fn( const struct share_mode_entry *e,
153 const char *sharepath, const char *fname,
156 struct file_enum_count *fenum =
157 (struct file_enum_count *)private_data;
159 struct srvsvc_NetFileInfo3 *f;
160 int i = fenum->ctr3->count;
162 struct byte_range_lock *brl;
164 char *fullpath = NULL;
166 const char *username;
168 /* If the pid was not found delete the entry from connections.tdb */
170 if ( !process_exists(e->pid) ) {
174 username = uidtoname(e->uid);
176 if ((fenum->username != NULL)
177 && !strequal(username, fenum->username)) {
181 f = TALLOC_REALLOC_ARRAY(fenum->ctx, fenum->ctr3->array,
182 struct srvsvc_NetFileInfo3, i+1);
184 DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
187 fenum->ctr3->array = f;
189 /* need to count the number of locks on a file */
194 if ( (brl = brl_get_locks(talloc_tos(), &fsp)) != NULL ) {
195 num_locks = brl->num_locks;
199 if ( strcmp( fname, "." ) == 0 ) {
200 fullpath = talloc_asprintf(fenum->ctx, "C:%s", sharepath );
202 fullpath = talloc_asprintf(fenum->ctx, "C:%s/%s",
208 string_replace( fullpath, '/', '\\' );
210 /* mask out create (what ever that is) */
211 permissions = e->access_mask & (FILE_READ_DATA|FILE_WRITE_DATA);
213 /* now fill in the srvsvc_NetFileInfo3 struct */
215 fenum->ctr3->array[i].fid =
216 (((uint32_t)(procid_to_pid(&e->pid))<<16) | e->share_file_id);
217 fenum->ctr3->array[i].permissions = permissions;
218 fenum->ctr3->array[i].num_locks = num_locks;
219 fenum->ctr3->array[i].path = fullpath;
220 fenum->ctr3->array[i].user = username;
222 fenum->ctr3->count++;
225 /*******************************************************************
226 ********************************************************************/
228 static WERROR net_enum_files(TALLOC_CTX *ctx,
229 const char *username,
230 struct srvsvc_NetFileCtr3 **ctr3,
233 struct file_enum_count f_enum_cnt;
235 f_enum_cnt.ctx = ctx;
236 f_enum_cnt.username = username;
237 f_enum_cnt.ctr3 = *ctr3;
239 share_mode_forall( enum_file_fn, (void *)&f_enum_cnt );
241 *ctr3 = f_enum_cnt.ctr3;
246 /*******************************************************************
247 Utility function to get the 'type' of a share from an snum.
248 ********************************************************************/
249 static uint32 get_share_type(int snum)
251 /* work out the share type */
252 uint32 type = STYPE_DISKTREE;
254 if (lp_print_ok(snum))
256 if (strequal(lp_fstype(snum), "IPC"))
258 if (lp_administrative_share(snum))
259 type |= STYPE_HIDDEN;
264 /*******************************************************************
265 Fill in a share info level 0 structure.
266 ********************************************************************/
268 static void init_srv_share_info_0(struct pipes_struct *p,
269 struct srvsvc_NetShareInfo0 *r, int snum)
271 r->name = lp_servicename(snum);
274 /*******************************************************************
275 Fill in a share info level 1 structure.
276 ********************************************************************/
278 static void init_srv_share_info_1(struct pipes_struct *p,
279 struct srvsvc_NetShareInfo1 *r,
282 char *net_name = lp_servicename(snum);
283 char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
286 remark = talloc_sub_advanced(
287 p->mem_ctx, lp_servicename(snum),
288 get_current_username(), lp_pathname(snum),
289 p->session_info->utok.uid, get_current_username(),
294 r->type = get_share_type(snum);
295 r->comment = remark ? remark : "";
298 /*******************************************************************
299 Fill in a share info level 2 structure.
300 ********************************************************************/
302 static void init_srv_share_info_2(struct pipes_struct *p,
303 struct srvsvc_NetShareInfo2 *r,
308 int max_connections = lp_max_connections(snum);
309 uint32_t max_uses = max_connections!=0 ? max_connections : (uint32_t)-1;
310 char *net_name = lp_servicename(snum);
312 remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
314 remark = talloc_sub_advanced(
315 p->mem_ctx, lp_servicename(snum),
316 get_current_username(), lp_pathname(snum),
317 p->session_info->utok.uid, get_current_username(),
320 path = talloc_asprintf(p->mem_ctx,
321 "C:%s", lp_pathname(snum));
325 * Change / to \\ so that win2k will see it as a valid path.
326 * This was added to enable use of browsing in win2k add
330 string_replace(path, '/', '\\');
334 r->type = get_share_type(snum);
335 r->comment = remark ? remark : "";
337 r->max_users = max_uses;
338 r->current_users = count_current_connections(net_name, false);
339 r->path = path ? path : "";
343 /*******************************************************************
344 Map any generic bits to file specific bits.
345 ********************************************************************/
347 static void map_generic_share_sd_bits(struct security_descriptor *psd)
350 struct security_acl *ps_dacl = NULL;
359 for (i = 0; i < ps_dacl->num_aces; i++) {
360 struct security_ace *psa = &ps_dacl->aces[i];
361 uint32 orig_mask = psa->access_mask;
363 se_map_generic(&psa->access_mask, &file_generic_mapping);
364 psa->access_mask |= orig_mask;
368 /*******************************************************************
369 Fill in a share info level 501 structure.
370 ********************************************************************/
372 static void init_srv_share_info_501(struct pipes_struct *p,
373 struct srvsvc_NetShareInfo501 *r, int snum)
375 const char *net_name = lp_servicename(snum);
376 char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
379 remark = talloc_sub_advanced(
380 p->mem_ctx, lp_servicename(snum),
381 get_current_username(), lp_pathname(snum),
382 p->session_info->utok.uid, get_current_username(),
387 r->type = get_share_type(snum);
388 r->comment = remark ? remark : "";
389 r->csc_policy = (lp_csc_policy(snum) << 4);
392 /*******************************************************************
393 Fill in a share info level 502 structure.
394 ********************************************************************/
396 static void init_srv_share_info_502(struct pipes_struct *p,
397 struct srvsvc_NetShareInfo502 *r, int snum)
399 const char *net_name = lp_servicename(snum);
401 struct security_descriptor *sd = NULL;
402 struct sec_desc_buf *sd_buf = NULL;
404 TALLOC_CTX *ctx = p->mem_ctx;
405 char *remark = talloc_strdup(ctx, lp_comment(snum));
408 remark = talloc_sub_advanced(
409 p->mem_ctx, lp_servicename(snum),
410 get_current_username(), lp_pathname(snum),
411 p->session_info->utok.uid, get_current_username(),
414 path = talloc_asprintf(ctx, "C:%s", lp_pathname(snum));
417 * Change / to \\ so that win2k will see it as a valid path. This was added to
418 * enable use of browsing in win2k add share dialog.
420 string_replace(path, '/', '\\');
423 sd = get_share_security(ctx, lp_servicename(snum), &sd_size);
425 sd_buf = make_sec_desc_buf(p->mem_ctx, sd_size, sd);
428 r->type = get_share_type(snum);
429 r->comment = remark ? remark : "";
431 r->max_users = (uint32_t)-1;
432 r->current_users = 1; /* ??? */
433 r->path = path ? path : "";
438 /***************************************************************************
439 Fill in a share info level 1004 structure.
440 ***************************************************************************/
442 static void init_srv_share_info_1004(struct pipes_struct *p,
443 struct srvsvc_NetShareInfo1004 *r,
446 char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
449 remark = talloc_sub_advanced(
450 p->mem_ctx, lp_servicename(snum),
451 get_current_username(), lp_pathname(snum),
452 p->session_info->utok.uid, get_current_username(),
456 r->comment = remark ? remark : "";
459 /***************************************************************************
460 Fill in a share info level 1005 structure.
461 ***************************************************************************/
463 static void init_srv_share_info_1005(struct pipes_struct *p,
464 struct srvsvc_NetShareInfo1005 *r,
467 uint32_t dfs_flags = 0;
469 if (lp_host_msdfs() && lp_msdfs_root(snum)) {
470 dfs_flags |= SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT;
473 dfs_flags |= lp_csc_policy(snum) << SHARE_1005_CSC_POLICY_SHIFT;
475 r->dfs_flags = dfs_flags;
478 /***************************************************************************
479 Fill in a share info level 1006 structure.
480 ***************************************************************************/
482 static void init_srv_share_info_1006(struct pipes_struct *p,
483 struct srvsvc_NetShareInfo1006 *r,
486 r->max_users = (uint32_t)-1;
489 /***************************************************************************
490 Fill in a share info level 1007 structure.
491 ***************************************************************************/
493 static void init_srv_share_info_1007(struct pipes_struct *p,
494 struct srvsvc_NetShareInfo1007 *r,
498 r->alternate_directory_name = "";
501 /*******************************************************************
502 Fill in a share info level 1501 structure.
503 ********************************************************************/
505 static void init_srv_share_info_1501(struct pipes_struct *p,
506 struct sec_desc_buf **r,
509 struct security_descriptor *sd;
510 struct sec_desc_buf *sd_buf = NULL;
512 TALLOC_CTX *ctx = p->mem_ctx;
514 sd = get_share_security(ctx, lp_servicename(snum), &sd_size);
516 sd_buf = make_sec_desc_buf(p->mem_ctx, sd_size, sd);
522 /*******************************************************************
523 True if it ends in '$'.
524 ********************************************************************/
526 static bool is_hidden_share(int snum)
528 const char *net_name = lp_servicename(snum);
530 return (net_name[strlen(net_name) - 1] == '$') ? True : False;
533 /*******************************************************************
534 Verify user is allowed to view share, access based enumeration
535 ********************************************************************/
536 static bool is_enumeration_allowed(struct pipes_struct *p,
539 if (!lp_access_based_share_enum(snum))
542 return share_access_check(p->session_info->security_token, lp_servicename(snum),
546 /*******************************************************************
547 Fill in a share info structure.
548 ********************************************************************/
550 static WERROR init_srv_share_info_ctr(struct pipes_struct *p,
551 struct srvsvc_NetShareInfoCtr *info_ctr,
552 uint32_t *resume_handle_p,
553 uint32_t *total_entries,
557 int alloc_entries = 0;
558 int num_services = 0;
560 TALLOC_CTX *ctx = p->mem_ctx;
562 int valid_share_count = 0;
564 union srvsvc_NetShareCtr ctr;
565 uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0;
567 DEBUG(5,("init_srv_share_info_ctr\n"));
569 /* Ensure all the usershares are loaded. */
571 load_usershare_shares();
572 load_registry_shares();
573 num_services = lp_numservices();
576 allowed = TALLOC_ZERO_ARRAY(ctx, bool, num_services);
577 W_ERROR_HAVE_NO_MEMORY(allowed);
579 /* Count the number of entries. */
580 for (snum = 0; snum < num_services; snum++) {
581 if (lp_browseable(snum) && lp_snum_ok(snum) &&
582 is_enumeration_allowed(p, snum) &&
583 (all_shares || !is_hidden_share(snum)) ) {
584 DEBUG(10, ("counting service %s\n",
585 lp_servicename(snum) ? lp_servicename(snum) : "(null)"));
586 allowed[snum] = true;
589 DEBUG(10, ("NOT counting service %s\n",
590 lp_servicename(snum) ? lp_servicename(snum) : "(null)"));
594 if (!num_entries || (resume_handle >= num_entries)) {
598 /* Calculate alloc entries. */
599 alloc_entries = num_entries - resume_handle;
600 switch (info_ctr->level) {
602 ctr.ctr0 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr0);
603 W_ERROR_HAVE_NO_MEMORY(ctr.ctr0);
605 ctr.ctr0->count = alloc_entries;
606 ctr.ctr0->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo0, alloc_entries);
607 W_ERROR_HAVE_NO_MEMORY(ctr.ctr0->array);
609 for (snum = 0; snum < num_services; snum++) {
611 (resume_handle <= (i + valid_share_count++)) ) {
612 init_srv_share_info_0(p, &ctr.ctr0->array[i++], snum);
619 ctr.ctr1 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1);
620 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1);
622 ctr.ctr1->count = alloc_entries;
623 ctr.ctr1->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1, alloc_entries);
624 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1->array);
626 for (snum = 0; snum < num_services; snum++) {
628 (resume_handle <= (i + valid_share_count++)) ) {
629 init_srv_share_info_1(p, &ctr.ctr1->array[i++], snum);
636 ctr.ctr2 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr2);
637 W_ERROR_HAVE_NO_MEMORY(ctr.ctr2);
639 ctr.ctr2->count = alloc_entries;
640 ctr.ctr2->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo2, alloc_entries);
641 W_ERROR_HAVE_NO_MEMORY(ctr.ctr2->array);
643 for (snum = 0; snum < num_services; snum++) {
645 (resume_handle <= (i + valid_share_count++)) ) {
646 init_srv_share_info_2(p, &ctr.ctr2->array[i++], snum);
653 ctr.ctr501 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr501);
654 W_ERROR_HAVE_NO_MEMORY(ctr.ctr501);
656 ctr.ctr501->count = alloc_entries;
657 ctr.ctr501->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo501, alloc_entries);
658 W_ERROR_HAVE_NO_MEMORY(ctr.ctr501->array);
660 for (snum = 0; snum < num_services; snum++) {
662 (resume_handle <= (i + valid_share_count++)) ) {
663 init_srv_share_info_501(p, &ctr.ctr501->array[i++], snum);
670 ctr.ctr502 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr502);
671 W_ERROR_HAVE_NO_MEMORY(ctr.ctr502);
673 ctr.ctr502->count = alloc_entries;
674 ctr.ctr502->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo502, alloc_entries);
675 W_ERROR_HAVE_NO_MEMORY(ctr.ctr502->array);
677 for (snum = 0; snum < num_services; snum++) {
679 (resume_handle <= (i + valid_share_count++)) ) {
680 init_srv_share_info_502(p, &ctr.ctr502->array[i++], snum);
687 ctr.ctr1004 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1004);
688 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1004);
690 ctr.ctr1004->count = alloc_entries;
691 ctr.ctr1004->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1004, alloc_entries);
692 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1004->array);
694 for (snum = 0; snum < num_services; snum++) {
696 (resume_handle <= (i + valid_share_count++)) ) {
697 init_srv_share_info_1004(p, &ctr.ctr1004->array[i++], snum);
704 ctr.ctr1005 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1005);
705 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1005);
707 ctr.ctr1005->count = alloc_entries;
708 ctr.ctr1005->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1005, alloc_entries);
709 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1005->array);
711 for (snum = 0; snum < num_services; snum++) {
713 (resume_handle <= (i + valid_share_count++)) ) {
714 init_srv_share_info_1005(p, &ctr.ctr1005->array[i++], snum);
721 ctr.ctr1006 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1006);
722 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1006);
724 ctr.ctr1006->count = alloc_entries;
725 ctr.ctr1006->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1006, alloc_entries);
726 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1006->array);
728 for (snum = 0; snum < num_services; snum++) {
730 (resume_handle <= (i + valid_share_count++)) ) {
731 init_srv_share_info_1006(p, &ctr.ctr1006->array[i++], snum);
738 ctr.ctr1007 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1007);
739 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1007);
741 ctr.ctr1007->count = alloc_entries;
742 ctr.ctr1007->array = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetShareInfo1007, alloc_entries);
743 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1007->array);
745 for (snum = 0; snum < num_services; snum++) {
747 (resume_handle <= (i + valid_share_count++)) ) {
748 init_srv_share_info_1007(p, &ctr.ctr1007->array[i++], snum);
755 ctr.ctr1501 = TALLOC_ZERO_P(ctx, struct srvsvc_NetShareCtr1501);
756 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1501);
758 ctr.ctr1501->count = alloc_entries;
759 ctr.ctr1501->array = TALLOC_ZERO_ARRAY(ctx, struct sec_desc_buf, alloc_entries);
760 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1501->array);
762 for (snum = 0; snum < num_services; snum++) {
764 (resume_handle <= (i + valid_share_count++)) ) {
765 struct sec_desc_buf *sd_buf = NULL;
766 init_srv_share_info_1501(p, &sd_buf, snum);
767 ctr.ctr1501->array[i++] = *sd_buf;
774 DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n",
776 return WERR_UNKNOWN_LEVEL;
779 *total_entries = alloc_entries;
780 if (resume_handle_p) {
782 *resume_handle_p = (num_entries == 0) ? *resume_handle_p : 0;
784 *resume_handle_p = num_entries;
793 /*******************************************************************
794 fill in a sess info level 0 structure.
795 ********************************************************************/
797 static WERROR init_srv_sess_info_0(struct pipes_struct *p,
798 struct srvsvc_NetSessCtr0 *ctr0,
799 uint32_t *resume_handle_p,
800 uint32_t *total_entries)
802 struct sessionid *session_list;
803 uint32_t num_entries = 0;
804 uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0;
805 *total_entries = list_sessions(p->mem_ctx, &session_list);
807 DEBUG(5,("init_srv_sess_info_0\n"));
810 if (resume_handle_p) {
811 *resume_handle_p = 0;
816 for (; resume_handle < *total_entries; resume_handle++) {
818 ctr0->array = TALLOC_REALLOC_ARRAY(p->mem_ctx,
820 struct srvsvc_NetSessInfo0,
822 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
824 ctr0->array[num_entries].client =
825 session_list[resume_handle].remote_machine;
830 ctr0->count = num_entries;
832 if (resume_handle_p) {
833 if (*resume_handle_p >= *total_entries) {
834 *resume_handle_p = 0;
836 *resume_handle_p = resume_handle;
843 /*******************************************************************
844 ********************************************************************/
846 static void sess_file_fn( const struct share_mode_entry *e,
847 const char *sharepath, const char *fname,
850 struct sess_file_count *sess = (struct sess_file_count *)data;
852 if ( procid_equal(&e->pid, &sess->pid) && (sess->uid == e->uid) ) {
859 /*******************************************************************
860 ********************************************************************/
862 static int net_count_files( uid_t uid, struct server_id pid )
864 struct sess_file_count s_file_cnt;
866 s_file_cnt.count = 0;
867 s_file_cnt.uid = uid;
868 s_file_cnt.pid = pid;
870 share_mode_forall( sess_file_fn, &s_file_cnt );
872 return s_file_cnt.count;
875 /*******************************************************************
876 fill in a sess info level 1 structure.
877 ********************************************************************/
879 static WERROR init_srv_sess_info_1(struct pipes_struct *p,
880 struct srvsvc_NetSessCtr1 *ctr1,
881 uint32_t *resume_handle_p,
882 uint32_t *total_entries)
884 struct sessionid *session_list;
885 uint32_t num_entries = 0;
886 time_t now = time(NULL);
887 uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0;
892 if (resume_handle_p) {
893 *resume_handle_p = 0;
898 *total_entries = list_sessions(p->mem_ctx, &session_list);
900 for (; resume_handle < *total_entries; resume_handle++) {
903 struct passwd *pw = sys_getpwnam(session_list[resume_handle].username);
907 DEBUG(10,("init_srv_sess_info_1: failed to find owner: %s\n",
908 session_list[resume_handle].username));
912 connect_time = (uint32_t)(now - session_list[resume_handle].connect_start);
913 num_files = net_count_files(pw->pw_uid, session_list[resume_handle].pid);
914 guest = strequal( session_list[resume_handle].username, lp_guestaccount() );
916 ctr1->array = TALLOC_REALLOC_ARRAY(p->mem_ctx,
918 struct srvsvc_NetSessInfo1,
920 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
922 ctr1->array[num_entries].client = session_list[resume_handle].remote_machine;
923 ctr1->array[num_entries].user = session_list[resume_handle].username;
924 ctr1->array[num_entries].num_open = num_files;
925 ctr1->array[num_entries].time = connect_time;
926 ctr1->array[num_entries].idle_time = 0;
927 ctr1->array[num_entries].user_flags = guest;
932 ctr1->count = num_entries;
934 if (resume_handle_p) {
935 if (*resume_handle_p >= *total_entries) {
936 *resume_handle_p = 0;
938 *resume_handle_p = resume_handle;
945 /*******************************************************************
946 fill in a conn info level 0 structure.
947 ********************************************************************/
949 static WERROR init_srv_conn_info_0(struct srvsvc_NetConnCtr0 *ctr0,
950 uint32_t *resume_handle_p,
951 uint32_t *total_entries)
953 uint32_t num_entries = 0;
954 uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0;
956 DEBUG(5,("init_srv_conn_info_0\n"));
959 if (resume_handle_p) {
960 *resume_handle_p = 0;
969 for (; resume_handle < *total_entries; resume_handle++) {
971 ctr0->array = TALLOC_REALLOC_ARRAY(talloc_tos(),
973 struct srvsvc_NetConnInfo0,
979 ctr0->array[num_entries].conn_id = *total_entries;
981 /* move on to creating next connection */
985 ctr0->count = num_entries;
986 *total_entries = num_entries;
988 if (resume_handle_p) {
989 if (*resume_handle_p >= *total_entries) {
990 *resume_handle_p = 0;
992 *resume_handle_p = resume_handle;
999 /*******************************************************************
1000 fill in a conn info level 1 structure.
1001 ********************************************************************/
1003 static WERROR init_srv_conn_info_1(struct srvsvc_NetConnCtr1 *ctr1,
1004 uint32_t *resume_handle_p,
1005 uint32_t *total_entries)
1007 uint32_t num_entries = 0;
1008 uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0;
1010 DEBUG(5,("init_srv_conn_info_1\n"));
1013 if (resume_handle_p) {
1014 *resume_handle_p = 0;
1023 for (; resume_handle < *total_entries; resume_handle++) {
1025 ctr1->array = TALLOC_REALLOC_ARRAY(talloc_tos(),
1027 struct srvsvc_NetConnInfo1,
1033 ctr1->array[num_entries].conn_id = *total_entries;
1034 ctr1->array[num_entries].conn_type = 0x3;
1035 ctr1->array[num_entries].num_open = 1;
1036 ctr1->array[num_entries].num_users = 1;
1037 ctr1->array[num_entries].conn_time = 3;
1038 ctr1->array[num_entries].user = "dummy_user";
1039 ctr1->array[num_entries].share = "IPC$";
1041 /* move on to creating next connection */
1045 ctr1->count = num_entries;
1046 *total_entries = num_entries;
1048 if (resume_handle_p) {
1049 if (*resume_handle_p >= *total_entries) {
1050 *resume_handle_p = 0;
1052 *resume_handle_p = resume_handle;
1059 /*******************************************************************
1061 *******************************************************************/
1063 WERROR _srvsvc_NetFileEnum(struct pipes_struct *p,
1064 struct srvsvc_NetFileEnum *r)
1066 TALLOC_CTX *ctx = NULL;
1067 struct srvsvc_NetFileCtr3 *ctr3;
1068 uint32_t resume_hnd = 0;
1071 switch (r->in.info_ctr->level) {
1075 return WERR_UNKNOWN_LEVEL;
1078 if (!nt_token_check_sid(&global_sid_Builtin_Administrators,
1079 p->session_info->security_token)) {
1080 DEBUG(1, ("Enumerating files only allowed for "
1081 "administrators\n"));
1082 return WERR_ACCESS_DENIED;
1086 ctr3 = r->in.info_ctr->ctr.ctr3;
1088 werr = WERR_INVALID_PARAM;
1092 /* TODO -- Windows enumerates
1094 (c) open directories and files */
1096 werr = net_enum_files(ctx, r->in.user, &ctr3, resume_hnd);
1097 if (!W_ERROR_IS_OK(werr)) {
1101 werr = net_enum_pipes(ctx, r->in.user, &ctr3, resume_hnd);
1102 if (!W_ERROR_IS_OK(werr)) {
1106 *r->out.totalentries = ctr3->count;
1107 r->out.info_ctr->ctr.ctr3->array = ctr3->array;
1108 r->out.info_ctr->ctr.ctr3->count = ctr3->count;
1116 /*******************************************************************
1117 _srvsvc_NetSrvGetInfo
1118 ********************************************************************/
1120 WERROR _srvsvc_NetSrvGetInfo(struct pipes_struct *p,
1121 struct srvsvc_NetSrvGetInfo *r)
1123 WERROR status = WERR_OK;
1125 DEBUG(5,("_srvsvc_NetSrvGetInfo: %d\n", __LINE__));
1127 if (!pipe_access_check(p)) {
1128 DEBUG(3, ("access denied to _srvsvc_NetSrvGetInfo\n"));
1129 return WERR_ACCESS_DENIED;
1132 switch (r->in.level) {
1134 /* Technically level 102 should only be available to
1135 Administrators but there isn't anything super-secret
1136 here, as most of it is made up. */
1139 struct srvsvc_NetSrvInfo102 *info102;
1141 info102 = TALLOC_P(p->mem_ctx, struct srvsvc_NetSrvInfo102);
1146 info102->platform_id = PLATFORM_ID_NT;
1147 info102->server_name = global_myname();
1148 info102->version_major = lp_major_announce_version();
1149 info102->version_minor = lp_minor_announce_version();
1150 info102->server_type = lp_default_server_announce();
1151 info102->comment = string_truncate(lp_serverstring(),
1152 MAX_SERVER_STRING_LENGTH);
1153 info102->users = 0xffffffff;
1154 info102->disc = 0xf;
1155 info102->hidden = 0;
1156 info102->announce = 240;
1157 info102->anndelta = 3000;
1158 info102->licenses = 100000;
1159 info102->userpath = "C:\\";
1161 r->out.info->info102 = info102;
1165 struct srvsvc_NetSrvInfo101 *info101;
1167 info101 = TALLOC_P(p->mem_ctx, struct srvsvc_NetSrvInfo101);
1172 info101->platform_id = PLATFORM_ID_NT;
1173 info101->server_name = global_myname();
1174 info101->version_major = lp_major_announce_version();
1175 info101->version_minor = lp_minor_announce_version();
1176 info101->server_type = lp_default_server_announce();
1177 info101->comment = string_truncate(lp_serverstring(),
1178 MAX_SERVER_STRING_LENGTH);
1180 r->out.info->info101 = info101;
1184 struct srvsvc_NetSrvInfo100 *info100;
1186 info100 = TALLOC_P(p->mem_ctx, struct srvsvc_NetSrvInfo100);
1191 info100->platform_id = PLATFORM_ID_NT;
1192 info100->server_name = global_myname();
1194 r->out.info->info100 = info100;
1199 status = WERR_UNKNOWN_LEVEL;
1203 DEBUG(5,("_srvsvc_NetSrvGetInfo: %d\n", __LINE__));
1208 /*******************************************************************
1209 _srvsvc_NetSrvSetInfo
1210 ********************************************************************/
1212 WERROR _srvsvc_NetSrvSetInfo(struct pipes_struct *p,
1213 struct srvsvc_NetSrvSetInfo *r)
1215 WERROR status = WERR_OK;
1217 DEBUG(5,("_srvsvc_NetSrvSetInfo: %d\n", __LINE__));
1219 /* Set up the net server set info structure. */
1221 DEBUG(5,("_srvsvc_NetSrvSetInfo: %d\n", __LINE__));
1226 /*******************************************************************
1228 ********************************************************************/
1230 WERROR _srvsvc_NetConnEnum(struct pipes_struct *p,
1231 struct srvsvc_NetConnEnum *r)
1235 DEBUG(5,("_srvsvc_NetConnEnum: %d\n", __LINE__));
1237 if (!nt_token_check_sid(&global_sid_Builtin_Administrators,
1238 p->session_info->security_token)) {
1239 DEBUG(1, ("Enumerating connections only allowed for "
1240 "administrators\n"));
1241 return WERR_ACCESS_DENIED;
1244 switch (r->in.info_ctr->level) {
1246 werr = init_srv_conn_info_0(r->in.info_ctr->ctr.ctr0,
1247 r->in.resume_handle,
1248 r->out.totalentries);
1251 werr = init_srv_conn_info_1(r->in.info_ctr->ctr.ctr1,
1252 r->in.resume_handle,
1253 r->out.totalentries);
1256 return WERR_UNKNOWN_LEVEL;
1259 DEBUG(5,("_srvsvc_NetConnEnum: %d\n", __LINE__));
1264 /*******************************************************************
1266 ********************************************************************/
1268 WERROR _srvsvc_NetSessEnum(struct pipes_struct *p,
1269 struct srvsvc_NetSessEnum *r)
1273 DEBUG(5,("_srvsvc_NetSessEnum: %d\n", __LINE__));
1275 if (!nt_token_check_sid(&global_sid_Builtin_Administrators,
1276 p->session_info->security_token)) {
1277 DEBUG(1, ("Enumerating sessions only allowed for "
1278 "administrators\n"));
1279 return WERR_ACCESS_DENIED;
1282 switch (r->in.info_ctr->level) {
1284 werr = init_srv_sess_info_0(p,
1285 r->in.info_ctr->ctr.ctr0,
1286 r->in.resume_handle,
1287 r->out.totalentries);
1290 werr = init_srv_sess_info_1(p,
1291 r->in.info_ctr->ctr.ctr1,
1292 r->in.resume_handle,
1293 r->out.totalentries);
1296 return WERR_UNKNOWN_LEVEL;
1299 DEBUG(5,("_srvsvc_NetSessEnum: %d\n", __LINE__));
1304 /*******************************************************************
1306 ********************************************************************/
1308 WERROR _srvsvc_NetSessDel(struct pipes_struct *p,
1309 struct srvsvc_NetSessDel *r)
1311 struct sessionid *session_list;
1312 int num_sessions, snum;
1313 const char *username;
1314 const char *machine;
1315 bool not_root = False;
1318 username = r->in.user;
1319 machine = r->in.client;
1321 /* strip leading backslashes if any */
1322 if (machine && machine[0] == '\\' && machine[1] == '\\') {
1326 num_sessions = list_sessions(p->mem_ctx, &session_list);
1328 DEBUG(5,("_srvsvc_NetSessDel: %d\n", __LINE__));
1330 werr = WERR_ACCESS_DENIED;
1332 /* fail out now if you are not root or not a domain admin */
1334 if ((p->session_info->utok.uid != sec_initial_uid()) &&
1335 ( ! nt_token_check_domain_rid(p->session_info->security_token,
1336 DOMAIN_RID_ADMINS))) {
1341 for (snum = 0; snum < num_sessions; snum++) {
1343 if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) &&
1344 strequal(session_list[snum].remote_machine, machine)) {
1348 if (p->session_info->utok.uid != sec_initial_uid()) {
1353 ntstat = messaging_send(p->msg_ctx,
1354 session_list[snum].pid,
1355 MSG_SHUTDOWN, &data_blob_null);
1357 if (NT_STATUS_IS_OK(ntstat))
1365 DEBUG(5,("_srvsvc_NetSessDel: %d\n", __LINE__));
1372 /*******************************************************************
1373 _srvsvc_NetShareEnumAll
1374 ********************************************************************/
1376 WERROR _srvsvc_NetShareEnumAll(struct pipes_struct *p,
1377 struct srvsvc_NetShareEnumAll *r)
1381 DEBUG(5,("_srvsvc_NetShareEnumAll: %d\n", __LINE__));
1383 if (!pipe_access_check(p)) {
1384 DEBUG(3, ("access denied to _srvsvc_NetShareEnumAll\n"));
1385 return WERR_ACCESS_DENIED;
1388 /* Create the list of shares for the response. */
1389 werr = init_srv_share_info_ctr(p,
1391 r->in.resume_handle,
1392 r->out.totalentries,
1395 DEBUG(5,("_srvsvc_NetShareEnumAll: %d\n", __LINE__));
1400 /*******************************************************************
1401 _srvsvc_NetShareEnum
1402 ********************************************************************/
1404 WERROR _srvsvc_NetShareEnum(struct pipes_struct *p,
1405 struct srvsvc_NetShareEnum *r)
1409 DEBUG(5,("_srvsvc_NetShareEnum: %d\n", __LINE__));
1411 if (!pipe_access_check(p)) {
1412 DEBUG(3, ("access denied to _srvsvc_NetShareEnum\n"));
1413 return WERR_ACCESS_DENIED;
1416 /* Create the list of shares for the response. */
1417 werr = init_srv_share_info_ctr(p,
1419 r->in.resume_handle,
1420 r->out.totalentries,
1423 DEBUG(5,("_srvsvc_NetShareEnum: %d\n", __LINE__));
1428 /*******************************************************************
1429 _srvsvc_NetShareGetInfo
1430 ********************************************************************/
1432 WERROR _srvsvc_NetShareGetInfo(struct pipes_struct *p,
1433 struct srvsvc_NetShareGetInfo *r)
1435 WERROR status = WERR_OK;
1436 char *share_name = NULL;
1438 union srvsvc_NetShareInfo *info = r->out.info;
1440 DEBUG(5,("_srvsvc_NetShareGetInfo: %d\n", __LINE__));
1442 if (!r->in.share_name) {
1443 return WERR_INVALID_NAME;
1446 snum = find_service(talloc_tos(), r->in.share_name, &share_name);
1451 return WERR_INVALID_NAME;
1454 switch (r->in.level) {
1456 info->info0 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo0);
1457 W_ERROR_HAVE_NO_MEMORY(info->info0);
1458 init_srv_share_info_0(p, info->info0, snum);
1461 info->info1 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo1);
1462 W_ERROR_HAVE_NO_MEMORY(info->info1);
1463 init_srv_share_info_1(p, info->info1, snum);
1466 info->info2 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo2);
1467 W_ERROR_HAVE_NO_MEMORY(info->info2);
1468 init_srv_share_info_2(p, info->info2, snum);
1471 info->info501 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo501);
1472 W_ERROR_HAVE_NO_MEMORY(info->info501);
1473 init_srv_share_info_501(p, info->info501, snum);
1476 info->info502 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo502);
1477 W_ERROR_HAVE_NO_MEMORY(info->info502);
1478 init_srv_share_info_502(p, info->info502, snum);
1481 info->info1004 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo1004);
1482 W_ERROR_HAVE_NO_MEMORY(info->info1004);
1483 init_srv_share_info_1004(p, info->info1004, snum);
1486 info->info1005 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo1005);
1487 W_ERROR_HAVE_NO_MEMORY(info->info1005);
1488 init_srv_share_info_1005(p, info->info1005, snum);
1491 info->info1006 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo1006);
1492 W_ERROR_HAVE_NO_MEMORY(info->info1006);
1493 init_srv_share_info_1006(p, info->info1006, snum);
1496 info->info1007 = TALLOC_P(p->mem_ctx, struct srvsvc_NetShareInfo1007);
1497 W_ERROR_HAVE_NO_MEMORY(info->info1007);
1498 init_srv_share_info_1007(p, info->info1007, snum);
1501 init_srv_share_info_1501(p, &info->info1501, snum);
1504 DEBUG(5,("_srvsvc_NetShareGetInfo: unsupported switch value %d\n",
1506 status = WERR_UNKNOWN_LEVEL;
1510 DEBUG(5,("_srvsvc_NetShareGetInfo: %d\n", __LINE__));
1515 /*******************************************************************
1516 _srvsvc_NetShareSetInfo. Modify share details.
1517 ********************************************************************/
1519 WERROR _srvsvc_NetShareSetInfo(struct pipes_struct *p,
1520 struct srvsvc_NetShareSetInfo *r)
1522 char *command = NULL;
1523 char *share_name = NULL;
1524 char *comment = NULL;
1525 const char *pathname = NULL;
1530 struct security_descriptor *psd = NULL;
1531 bool is_disk_op = False;
1532 int max_connections = 0;
1533 TALLOC_CTX *ctx = p->mem_ctx;
1534 union srvsvc_NetShareInfo *info = r->in.info;
1536 DEBUG(5,("_srvsvc_NetShareSetInfo: %d\n", __LINE__));
1538 if (!r->in.share_name) {
1539 return WERR_INVALID_NAME;
1542 if (r->out.parm_error) {
1543 *r->out.parm_error = 0;
1546 if ( strequal(r->in.share_name,"IPC$")
1547 || ( lp_enable_asu_support() && strequal(r->in.share_name,"ADMIN$") )
1548 || strequal(r->in.share_name,"global") )
1550 DEBUG(5,("_srvsvc_NetShareSetInfo: share %s cannot be "
1551 "modified by a remote user.\n",
1552 r->in.share_name ));
1553 return WERR_ACCESS_DENIED;
1556 snum = find_service(talloc_tos(), r->in.share_name, &share_name);
1561 /* Does this share exist ? */
1563 return WERR_NET_NAME_NOT_FOUND;
1565 /* No change to printer shares. */
1566 if (lp_print_ok(snum))
1567 return WERR_ACCESS_DENIED;
1569 is_disk_op = security_token_has_privilege(p->session_info->security_token, SEC_PRIV_DISK_OPERATOR);
1571 /* fail out now if you are not root and not a disk op */
1573 if ( p->session_info->utok.uid != sec_initial_uid() && !is_disk_op ) {
1574 DEBUG(2,("_srvsvc_NetShareSetInfo: uid %u doesn't have the "
1575 "SeDiskOperatorPrivilege privilege needed to modify "
1577 (unsigned int)p->session_info->utok.uid,
1579 return WERR_ACCESS_DENIED;
1582 switch (r->in.level) {
1584 pathname = talloc_strdup(ctx, lp_pathname(snum));
1585 comment = talloc_strdup(ctx, info->info1->comment);
1586 type = info->info1->type;
1590 comment = talloc_strdup(ctx, info->info2->comment);
1591 pathname = info->info2->path;
1592 type = info->info2->type;
1593 max_connections = (info->info2->max_users == (uint32_t)-1) ?
1594 0 : info->info2->max_users;
1598 /* not supported on set but here for completeness */
1600 comment = talloc_strdup(ctx, info->info501->comment);
1601 type = info->info501->type;
1606 comment = talloc_strdup(ctx, info->info502->comment);
1607 pathname = info->info502->path;
1608 type = info->info502->type;
1609 psd = info->info502->sd_buf.sd;
1610 map_generic_share_sd_bits(psd);
1613 pathname = talloc_strdup(ctx, lp_pathname(snum));
1614 comment = talloc_strdup(ctx, info->info1004->comment);
1615 type = STYPE_DISKTREE;
1618 /* XP re-sets the csc policy even if it wasn't changed by the
1619 user, so we must compare it to see if it's what is set in
1620 smb.conf, so that we can contine other ops like setting
1622 if (((info->info1005->dfs_flags &
1623 SHARE_1005_CSC_POLICY_MASK) >>
1624 SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum))
1627 DEBUG(3, ("_srvsvc_NetShareSetInfo: client is trying to change csc policy from the network; must be done with smb.conf\n"));
1628 return WERR_ACCESS_DENIED;
1632 return WERR_ACCESS_DENIED;
1634 pathname = talloc_strdup(ctx, lp_pathname(snum));
1635 comment = talloc_strdup(ctx, lp_comment(snum));
1636 psd = info->info1501->sd;
1637 map_generic_share_sd_bits(psd);
1638 type = STYPE_DISKTREE;
1641 DEBUG(5,("_srvsvc_NetShareSetInfo: unsupported switch value %d\n",
1643 return WERR_UNKNOWN_LEVEL;
1646 /* We can only modify disk shares. */
1647 if (type != STYPE_DISKTREE) {
1648 DEBUG(5,("_srvsvc_NetShareSetInfo: share %s is not a "
1651 return WERR_ACCESS_DENIED;
1654 if (comment == NULL) {
1658 /* Check if the pathname is valid. */
1659 if (!(path = valid_share_pathname(p->mem_ctx, pathname ))) {
1660 DEBUG(5,("_srvsvc_NetShareSetInfo: invalid pathname %s\n",
1662 return WERR_OBJECT_PATH_INVALID;
1665 /* Ensure share name, pathname and comment don't contain '"' characters. */
1666 string_replace(share_name, '"', ' ');
1667 string_replace(path, '"', ' ');
1668 string_replace(comment, '"', ' ');
1670 DEBUG(10,("_srvsvc_NetShareSetInfo: change share command = %s\n",
1671 lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" ));
1673 /* Only call modify function if something changed. */
1675 if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum))
1676 || (lp_max_connections(snum) != max_connections)) {
1677 if (!lp_change_share_cmd() || !*lp_change_share_cmd()) {
1678 DEBUG(10,("_srvsvc_NetShareSetInfo: No change share command\n"));
1679 return WERR_ACCESS_DENIED;
1682 command = talloc_asprintf(p->mem_ctx,
1683 "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1684 lp_change_share_cmd(),
1685 get_dyn_CONFIGFILE(),
1688 comment ? comment : "",
1694 DEBUG(10,("_srvsvc_NetShareSetInfo: Running [%s]\n", command ));
1696 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1701 if ( (ret = smbrun(command, NULL)) == 0 ) {
1702 /* Tell everyone we updated smb.conf. */
1703 message_send_all(p->msg_ctx, MSG_SMB_CONF_UPDATED,
1710 /********* END SeDiskOperatorPrivilege BLOCK *********/
1712 DEBUG(3,("_srvsvc_NetShareSetInfo: Running [%s] returned (%d)\n",
1715 TALLOC_FREE(command);
1718 return WERR_ACCESS_DENIED;
1720 DEBUG(10,("_srvsvc_NetShareSetInfo: No change to share name (%s)\n",
1724 /* Replace SD if changed. */
1726 struct security_descriptor *old_sd;
1729 old_sd = get_share_security(p->mem_ctx, lp_servicename(snum), &sd_size);
1731 if (old_sd && !security_descriptor_equal(old_sd, psd)) {
1732 if (!set_share_security(share_name, psd))
1733 DEBUG(0,("_srvsvc_NetShareSetInfo: Failed to change security info in share %s.\n",
1738 DEBUG(5,("_srvsvc_NetShareSetInfo: %d\n", __LINE__));
1743 /*******************************************************************
1744 _srvsvc_NetShareAdd.
1745 Call 'add_share_command "sharename" "pathname"
1746 "comment" "max connections = "
1747 ********************************************************************/
1749 WERROR _srvsvc_NetShareAdd(struct pipes_struct *p,
1750 struct srvsvc_NetShareAdd *r)
1752 char *command = NULL;
1753 char *share_name_in = NULL;
1754 char *share_name = NULL;
1755 char *comment = NULL;
1756 char *pathname = NULL;
1761 struct security_descriptor *psd = NULL;
1763 int max_connections = 0;
1764 TALLOC_CTX *ctx = p->mem_ctx;
1766 DEBUG(5,("_srvsvc_NetShareAdd: %d\n", __LINE__));
1768 if (r->out.parm_error) {
1769 *r->out.parm_error = 0;
1772 is_disk_op = security_token_has_privilege(p->session_info->security_token, SEC_PRIV_DISK_OPERATOR);
1774 if (p->session_info->utok.uid != sec_initial_uid() && !is_disk_op )
1775 return WERR_ACCESS_DENIED;
1777 if (!lp_add_share_cmd() || !*lp_add_share_cmd()) {
1778 DEBUG(10,("_srvsvc_NetShareAdd: No add share command\n"));
1779 return WERR_ACCESS_DENIED;
1782 switch (r->in.level) {
1784 /* No path. Not enough info in a level 0 to do anything. */
1785 return WERR_ACCESS_DENIED;
1787 /* Not enough info in a level 1 to do anything. */
1788 return WERR_ACCESS_DENIED;
1790 share_name_in = talloc_strdup(ctx, r->in.info->info2->name);
1791 comment = talloc_strdup(ctx, r->in.info->info2->comment);
1792 pathname = talloc_strdup(ctx, r->in.info->info2->path);
1793 max_connections = (r->in.info->info2->max_users == (uint32_t)-1) ?
1794 0 : r->in.info->info2->max_users;
1795 type = r->in.info->info2->type;
1798 /* No path. Not enough info in a level 501 to do anything. */
1799 return WERR_ACCESS_DENIED;
1801 share_name_in = talloc_strdup(ctx, r->in.info->info502->name);
1802 comment = talloc_strdup(ctx, r->in.info->info502->comment);
1803 pathname = talloc_strdup(ctx, r->in.info->info502->path);
1804 max_connections = (r->in.info->info502->max_users == (uint32_t)-1) ?
1805 0 : r->in.info->info502->max_users;
1806 type = r->in.info->info502->type;
1807 psd = r->in.info->info502->sd_buf.sd;
1808 map_generic_share_sd_bits(psd);
1811 /* none of the following contain share names. NetShareAdd does not have a separate parameter for the share name */
1817 return WERR_ACCESS_DENIED;
1819 /* DFS only level. */
1820 return WERR_ACCESS_DENIED;
1822 DEBUG(5,("_srvsvc_NetShareAdd: unsupported switch value %d\n",
1824 return WERR_UNKNOWN_LEVEL;
1827 /* check for invalid share names */
1829 if (!share_name_in || !validate_net_name(share_name_in,
1830 INVALID_SHARENAME_CHARS,
1831 strlen(share_name_in))) {
1832 DEBUG(5,("_srvsvc_NetShareAdd: Bad sharename \"%s\"\n",
1833 share_name_in ? share_name_in : ""));
1834 return WERR_INVALID_NAME;
1837 if (strequal(share_name_in,"IPC$") || strequal(share_name_in,"global")
1838 || (lp_enable_asu_support() &&
1839 strequal(share_name_in,"ADMIN$"))) {
1840 return WERR_ACCESS_DENIED;
1843 snum = find_service(ctx, share_name_in, &share_name);
1848 /* Share already exists. */
1850 return WERR_FILE_EXISTS;
1853 /* We can only add disk shares. */
1854 if (type != STYPE_DISKTREE) {
1855 return WERR_ACCESS_DENIED;
1858 /* Check if the pathname is valid. */
1859 if (!(path = valid_share_pathname(p->mem_ctx, pathname))) {
1860 return WERR_OBJECT_PATH_INVALID;
1863 /* Ensure share name, pathname and comment don't contain '"' characters. */
1864 string_replace(share_name_in, '"', ' ');
1865 string_replace(share_name, '"', ' ');
1866 string_replace(path, '"', ' ');
1868 string_replace(comment, '"', ' ');
1871 command = talloc_asprintf(ctx,
1872 "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1874 get_dyn_CONFIGFILE(),
1877 comment ? comment : "",
1883 DEBUG(10,("_srvsvc_NetShareAdd: Running [%s]\n", command ));
1885 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1890 /* FIXME: use libnetconf here - gd */
1892 if ( (ret = smbrun(command, NULL)) == 0 ) {
1893 /* Tell everyone we updated smb.conf. */
1894 message_send_all(p->msg_ctx, MSG_SMB_CONF_UPDATED, NULL, 0,
1901 /********* END SeDiskOperatorPrivilege BLOCK *********/
1903 DEBUG(3,("_srvsvc_NetShareAdd: Running [%s] returned (%d)\n",
1906 TALLOC_FREE(command);
1909 return WERR_ACCESS_DENIED;
1912 /* Note we use share_name here, not share_name_in as
1913 we need a canonicalized name for setting security. */
1914 if (!set_share_security(share_name, psd)) {
1915 DEBUG(0,("_srvsvc_NetShareAdd: Failed to add security info to share %s.\n",
1921 * We don't call reload_services() here, the message will
1922 * cause this to be done before the next packet is read
1923 * from the client. JRA.
1926 DEBUG(5,("_srvsvc_NetShareAdd: %d\n", __LINE__));
1931 /*******************************************************************
1933 Call "delete share command" with the share name as
1935 ********************************************************************/
1937 WERROR _srvsvc_NetShareDel(struct pipes_struct *p,
1938 struct srvsvc_NetShareDel *r)
1940 char *command = NULL;
1941 char *share_name = NULL;
1945 struct share_params *params;
1946 TALLOC_CTX *ctx = p->mem_ctx;
1948 DEBUG(5,("_srvsvc_NetShareDel: %d\n", __LINE__));
1950 if (!r->in.share_name) {
1951 return WERR_NET_NAME_NOT_FOUND;
1954 if ( strequal(r->in.share_name,"IPC$")
1955 || ( lp_enable_asu_support() && strequal(r->in.share_name,"ADMIN$") )
1956 || strequal(r->in.share_name,"global") )
1958 return WERR_ACCESS_DENIED;
1961 snum = find_service(talloc_tos(), r->in.share_name, &share_name);
1967 return WERR_NO_SUCH_SHARE;
1970 if (!(params = get_share_params(p->mem_ctx, share_name))) {
1971 return WERR_NO_SUCH_SHARE;
1974 /* No change to printer shares. */
1975 if (lp_print_ok(snum))
1976 return WERR_ACCESS_DENIED;
1978 is_disk_op = security_token_has_privilege(p->session_info->security_token, SEC_PRIV_DISK_OPERATOR);
1980 if (p->session_info->utok.uid != sec_initial_uid() && !is_disk_op )
1981 return WERR_ACCESS_DENIED;
1983 if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) {
1984 DEBUG(10,("_srvsvc_NetShareDel: No delete share command\n"));
1985 return WERR_ACCESS_DENIED;
1988 command = talloc_asprintf(ctx,
1990 lp_delete_share_cmd(),
1991 get_dyn_CONFIGFILE(),
1992 lp_servicename(snum));
1997 DEBUG(10,("_srvsvc_NetShareDel: Running [%s]\n", command ));
1999 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
2004 if ( (ret = smbrun(command, NULL)) == 0 ) {
2005 /* Tell everyone we updated smb.conf. */
2006 message_send_all(p->msg_ctx, MSG_SMB_CONF_UPDATED, NULL, 0,
2013 /********* END SeDiskOperatorPrivilege BLOCK *********/
2015 DEBUG(3,("_srvsvc_NetShareDel: Running [%s] returned (%d)\n", command, ret ));
2018 return WERR_ACCESS_DENIED;
2020 /* Delete the SD in the database. */
2021 delete_share_security(lp_servicename(params->service));
2023 lp_killservice(params->service);
2028 /*******************************************************************
2029 _srvsvc_NetShareDelSticky
2030 ********************************************************************/
2032 WERROR _srvsvc_NetShareDelSticky(struct pipes_struct *p,
2033 struct srvsvc_NetShareDelSticky *r)
2035 struct srvsvc_NetShareDel q;
2037 DEBUG(5,("_srvsvc_NetShareDelSticky: %d\n", __LINE__));
2039 q.in.server_unc = r->in.server_unc;
2040 q.in.share_name = r->in.share_name;
2041 q.in.reserved = r->in.reserved;
2043 return _srvsvc_NetShareDel(p, &q);
2046 /*******************************************************************
2047 _srvsvc_NetRemoteTOD
2048 ********************************************************************/
2050 WERROR _srvsvc_NetRemoteTOD(struct pipes_struct *p,
2051 struct srvsvc_NetRemoteTOD *r)
2053 struct srvsvc_NetRemoteTODInfo *tod;
2055 time_t unixdate = time(NULL);
2057 /* We do this call first as if we do it *after* the gmtime call
2058 it overwrites the pointed-to values. JRA */
2060 uint32 zone = get_time_zone(unixdate)/60;
2062 DEBUG(5,("_srvsvc_NetRemoteTOD: %d\n", __LINE__));
2064 if ( !(tod = TALLOC_ZERO_P(p->mem_ctx, struct srvsvc_NetRemoteTODInfo)) )
2069 DEBUG(5,("_srvsvc_NetRemoteTOD: %d\n", __LINE__));
2071 t = gmtime(&unixdate);
2074 tod->elapsed = unixdate;
2076 tod->hours = t->tm_hour;
2077 tod->mins = t->tm_min;
2078 tod->secs = t->tm_sec;
2080 tod->timezone = zone;
2081 tod->tinterval = 10000;
2082 tod->day = t->tm_mday;
2083 tod->month = t->tm_mon + 1;
2084 tod->year = 1900+t->tm_year;
2085 tod->weekday = t->tm_wday;
2087 DEBUG(5,("_srvsvc_NetRemoteTOD: %d\n", __LINE__));
2092 /***********************************************************************************
2093 _srvsvc_NetGetFileSecurity
2094 Win9x NT tools get security descriptor.
2095 ***********************************************************************************/
2097 WERROR _srvsvc_NetGetFileSecurity(struct pipes_struct *p,
2098 struct srvsvc_NetGetFileSecurity *r)
2100 struct smb_filename *smb_fname = NULL;
2101 struct security_descriptor *psd = NULL;
2103 char *servicename = NULL;
2107 connection_struct *conn = NULL;
2108 struct sec_desc_buf *sd_buf = NULL;
2109 files_struct *fsp = NULL;
2111 char *oldcwd = NULL;
2116 werr = WERR_NET_NAME_NOT_FOUND;
2119 snum = find_service(talloc_tos(), r->in.share, &servicename);
2125 DEBUG(10, ("Could not find service %s\n", servicename));
2126 werr = WERR_NET_NAME_NOT_FOUND;
2130 nt_status = create_conn_struct(talloc_tos(), &conn, snum,
2131 lp_pathname(snum), p->session_info,
2133 if (!NT_STATUS_IS_OK(nt_status)) {
2134 DEBUG(10, ("create_conn_struct failed: %s\n",
2135 nt_errstr(nt_status)));
2136 werr = ntstatus_to_werror(nt_status);
2140 nt_status = filename_convert(talloc_tos(),
2147 if (!NT_STATUS_IS_OK(nt_status)) {
2148 werr = ntstatus_to_werror(nt_status);
2152 nt_status = SMB_VFS_CREATE_FILE(
2155 0, /* root_dir_fid */
2156 smb_fname, /* fname */
2157 FILE_READ_ATTRIBUTES, /* access_mask */
2158 FILE_SHARE_READ|FILE_SHARE_WRITE, /* share_access */
2159 FILE_OPEN, /* create_disposition*/
2160 0, /* create_options */
2161 0, /* file_attributes */
2162 INTERNAL_OPEN_ONLY, /* oplock_request */
2163 0, /* allocation_size */
2164 0, /* private_flags */
2170 if (!NT_STATUS_IS_OK(nt_status)) {
2171 DEBUG(3,("_srvsvc_NetGetFileSecurity: can't open %s\n",
2172 smb_fname_str_dbg(smb_fname)));
2173 werr = ntstatus_to_werror(nt_status);
2177 nt_status = SMB_VFS_FGET_NT_ACL(fsp,
2180 |SECINFO_DACL), &psd);
2182 if (!NT_STATUS_IS_OK(nt_status)) {
2183 DEBUG(3,("_srvsvc_NetGetFileSecurity: Unable to get NT ACL "
2184 "for file %s\n", smb_fname_str_dbg(smb_fname)));
2185 werr = ntstatus_to_werror(nt_status);
2189 sd_size = ndr_size_security_descriptor(psd, 0);
2191 sd_buf = TALLOC_ZERO_P(p->mem_ctx, struct sec_desc_buf);
2197 sd_buf->sd_size = sd_size;
2200 *r->out.sd_buf = sd_buf;
2202 psd->dacl->revision = NT4_ACL_REVISION;
2204 close_file(NULL, fsp, NORMAL_CLOSE);
2205 vfs_ChDir(conn, oldcwd);
2206 SMB_VFS_DISCONNECT(conn);
2214 close_file(NULL, fsp, NORMAL_CLOSE);
2218 vfs_ChDir(conn, oldcwd);
2222 SMB_VFS_DISCONNECT(conn);
2227 TALLOC_FREE(smb_fname);
2232 /***********************************************************************************
2233 _srvsvc_NetSetFileSecurity
2234 Win9x NT tools set security descriptor.
2235 ***********************************************************************************/
2237 WERROR _srvsvc_NetSetFileSecurity(struct pipes_struct *p,
2238 struct srvsvc_NetSetFileSecurity *r)
2240 struct smb_filename *smb_fname = NULL;
2241 char *servicename = NULL;
2242 files_struct *fsp = NULL;
2246 connection_struct *conn = NULL;
2248 char *oldcwd = NULL;
2249 struct security_descriptor *psd = NULL;
2250 uint32_t security_info_sent = 0;
2255 werr = WERR_NET_NAME_NOT_FOUND;
2259 snum = find_service(talloc_tos(), r->in.share, &servicename);
2266 DEBUG(10, ("Could not find service %s\n", servicename));
2267 werr = WERR_NET_NAME_NOT_FOUND;
2271 nt_status = create_conn_struct(talloc_tos(), &conn, snum,
2272 lp_pathname(snum), p->session_info,
2274 if (!NT_STATUS_IS_OK(nt_status)) {
2275 DEBUG(10, ("create_conn_struct failed: %s\n",
2276 nt_errstr(nt_status)));
2277 werr = ntstatus_to_werror(nt_status);
2281 nt_status = filename_convert(talloc_tos(),
2288 if (!NT_STATUS_IS_OK(nt_status)) {
2289 werr = ntstatus_to_werror(nt_status);
2293 nt_status = SMB_VFS_CREATE_FILE(
2296 0, /* root_dir_fid */
2297 smb_fname, /* fname */
2298 FILE_WRITE_ATTRIBUTES, /* access_mask */
2299 FILE_SHARE_READ|FILE_SHARE_WRITE, /* share_access */
2300 FILE_OPEN, /* create_disposition*/
2301 0, /* create_options */
2302 0, /* file_attributes */
2303 INTERNAL_OPEN_ONLY, /* oplock_request */
2304 0, /* allocation_size */
2305 0, /* private_flags */
2311 if (!NT_STATUS_IS_OK(nt_status)) {
2312 DEBUG(3,("_srvsvc_NetSetFileSecurity: can't open %s\n",
2313 smb_fname_str_dbg(smb_fname)));
2314 werr = ntstatus_to_werror(nt_status);
2318 psd = r->in.sd_buf->sd;
2319 security_info_sent = r->in.securityinformation;
2321 if (psd->owner_sid==0) {
2322 security_info_sent &= ~SECINFO_OWNER;
2324 if (psd->group_sid==0) {
2325 security_info_sent &= ~SECINFO_GROUP;
2328 security_info_sent &= ~SECINFO_SACL;
2331 security_info_sent &= ~SECINFO_DACL;
2334 /* Convert all the generic bits. */
2335 security_acl_map_generic(psd->dacl, &file_generic_mapping);
2336 security_acl_map_generic(psd->sacl, &file_generic_mapping);
2338 nt_status = SMB_VFS_FSET_NT_ACL(fsp,
2342 if (!NT_STATUS_IS_OK(nt_status) ) {
2343 DEBUG(3,("_srvsvc_NetSetFileSecurity: Unable to set NT ACL "
2344 "on file %s\n", r->in.share));
2345 werr = WERR_ACCESS_DENIED;
2349 close_file(NULL, fsp, NORMAL_CLOSE);
2350 vfs_ChDir(conn, oldcwd);
2351 SMB_VFS_DISCONNECT(conn);
2359 close_file(NULL, fsp, NORMAL_CLOSE);
2363 vfs_ChDir(conn, oldcwd);
2367 SMB_VFS_DISCONNECT(conn);
2372 TALLOC_FREE(smb_fname);
2377 /***********************************************************************************
2378 It may be that we want to limit users to creating shares on certain areas of the UNIX file area.
2379 We could define areas by mapping Windows style disks to points on the UNIX directory hierarchy.
2380 These disks would the disks listed by this function.
2381 Users could then create shares relative to these disks. Watch out for moving these disks around.
2382 "Nigel Williams" <nigel@veritas.com>.
2383 ***********************************************************************************/
2385 static const char *server_disks[] = {"C:"};
2387 static uint32 get_server_disk_count(void)
2389 return sizeof(server_disks)/sizeof(server_disks[0]);
2392 static uint32 init_server_disk_enum(uint32 *resume)
2394 uint32 server_disk_count = get_server_disk_count();
2396 /*resume can be an offset into the list for now*/
2398 if(*resume & 0x80000000)
2401 if(*resume > server_disk_count)
2402 *resume = server_disk_count;
2404 return server_disk_count - *resume;
2407 static const char *next_server_disk_enum(uint32 *resume)
2411 if(init_server_disk_enum(resume) == 0)
2414 disk = server_disks[*resume];
2418 DEBUG(10, ("next_server_disk_enum: reporting disk %s. resume handle %d.\n", disk, *resume));
2423 /********************************************************************
2425 ********************************************************************/
2427 WERROR _srvsvc_NetDiskEnum(struct pipes_struct *p,
2428 struct srvsvc_NetDiskEnum *r)
2431 const char *disk_name;
2432 TALLOC_CTX *ctx = p->mem_ctx;
2434 uint32_t resume = r->in.resume_handle ? *r->in.resume_handle : 0;
2438 *r->out.totalentries = init_server_disk_enum(&resume);
2440 r->out.info->disks = TALLOC_ZERO_ARRAY(ctx, struct srvsvc_NetDiskInfo0,
2441 MAX_SERVER_DISK_ENTRIES);
2442 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks);
2444 /*allow one struct srvsvc_NetDiskInfo0 for null terminator*/
2446 r->out.info->count = 0;
2448 for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(&resume)); i++) {
2450 r->out.info->count++;
2452 /*copy disk name into a unicode string*/
2454 r->out.info->disks[i].disk = talloc_strdup(ctx, disk_name);
2455 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[i].disk);
2458 /* add a terminating null string. Is this there if there is more data to come? */
2460 r->out.info->count++;
2462 r->out.info->disks[i].disk = talloc_strdup(ctx, "");
2463 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[i].disk);
2465 if (r->out.resume_handle) {
2466 *r->out.resume_handle = resume;
2472 /********************************************************************
2473 _srvsvc_NetNameValidate
2474 ********************************************************************/
2476 WERROR _srvsvc_NetNameValidate(struct pipes_struct *p,
2477 struct srvsvc_NetNameValidate *r)
2479 switch (r->in.name_type) {
2481 if (!validate_net_name(r->in.name, INVALID_SHARENAME_CHARS,
2482 strlen_m(r->in.name)))
2484 DEBUG(5,("_srvsvc_NetNameValidate: Bad sharename \"%s\"\n",
2486 return WERR_INVALID_NAME;
2491 return WERR_UNKNOWN_LEVEL;
2497 /*******************************************************************
2498 ********************************************************************/
2500 struct enum_file_close_state {
2501 struct srvsvc_NetFileClose *r;
2502 struct messaging_context *msg_ctx;
2505 static void enum_file_close_fn( const struct share_mode_entry *e,
2506 const char *sharepath, const char *fname,
2507 void *private_data )
2509 char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
2510 struct enum_file_close_state *state =
2511 (struct enum_file_close_state *)private_data;
2512 uint32_t fid = (((uint32_t)(procid_to_pid(&e->pid))<<16) | e->share_file_id);
2514 if (fid != state->r->in.fid) {
2515 return; /* Not this file. */
2518 if (!process_exists(e->pid) ) {
2522 /* Ok - send the close message. */
2523 DEBUG(10,("enum_file_close_fn: request to close file %s, %s\n",
2525 share_mode_str(talloc_tos(), 0, e) ));
2527 share_mode_entry_to_message(msg, e);
2529 state->r->out.result = ntstatus_to_werror(
2530 messaging_send_buf(state->msg_ctx,
2531 e->pid, MSG_SMB_CLOSE_FILE,
2533 MSG_SMB_SHARE_MODE_ENTRY_SIZE));
2536 /********************************************************************
2537 Close a file given a 32-bit file id.
2538 ********************************************************************/
2540 WERROR _srvsvc_NetFileClose(struct pipes_struct *p,
2541 struct srvsvc_NetFileClose *r)
2543 struct enum_file_close_state state;
2546 DEBUG(5,("_srvsvc_NetFileClose: %d\n", __LINE__));
2548 is_disk_op = security_token_has_privilege(p->session_info->security_token, SEC_PRIV_DISK_OPERATOR);
2550 if (p->session_info->utok.uid != sec_initial_uid() && !is_disk_op) {
2551 return WERR_ACCESS_DENIED;
2554 /* enum_file_close_fn sends the close message to
2555 * the relevent smbd process. */
2557 r->out.result = WERR_BADFILE;
2559 state.msg_ctx = p->msg_ctx;
2560 share_mode_forall(enum_file_close_fn, &state);
2561 return r->out.result;
2564 /********************************************************************
2565 ********************************************************************/
2567 WERROR _srvsvc_NetCharDevEnum(struct pipes_struct *p,
2568 struct srvsvc_NetCharDevEnum *r)
2570 p->rng_fault_state = True;
2571 return WERR_NOT_SUPPORTED;
2574 WERROR _srvsvc_NetCharDevGetInfo(struct pipes_struct *p,
2575 struct srvsvc_NetCharDevGetInfo *r)
2577 p->rng_fault_state = True;
2578 return WERR_NOT_SUPPORTED;
2581 WERROR _srvsvc_NetCharDevControl(struct pipes_struct *p,
2582 struct srvsvc_NetCharDevControl *r)
2584 p->rng_fault_state = True;
2585 return WERR_NOT_SUPPORTED;
2588 WERROR _srvsvc_NetCharDevQEnum(struct pipes_struct *p,
2589 struct srvsvc_NetCharDevQEnum *r)
2591 p->rng_fault_state = True;
2592 return WERR_NOT_SUPPORTED;
2595 WERROR _srvsvc_NetCharDevQGetInfo(struct pipes_struct *p,
2596 struct srvsvc_NetCharDevQGetInfo *r)
2598 p->rng_fault_state = True;
2599 return WERR_NOT_SUPPORTED;
2602 WERROR _srvsvc_NetCharDevQSetInfo(struct pipes_struct *p,
2603 struct srvsvc_NetCharDevQSetInfo *r)
2605 p->rng_fault_state = True;
2606 return WERR_NOT_SUPPORTED;
2609 WERROR _srvsvc_NetCharDevQPurge(struct pipes_struct *p,
2610 struct srvsvc_NetCharDevQPurge *r)
2612 p->rng_fault_state = True;
2613 return WERR_NOT_SUPPORTED;
2616 WERROR _srvsvc_NetCharDevQPurgeSelf(struct pipes_struct *p,
2617 struct srvsvc_NetCharDevQPurgeSelf *r)
2619 p->rng_fault_state = True;
2620 return WERR_NOT_SUPPORTED;
2623 WERROR _srvsvc_NetFileGetInfo(struct pipes_struct *p,
2624 struct srvsvc_NetFileGetInfo *r)
2626 p->rng_fault_state = True;
2627 return WERR_NOT_SUPPORTED;
2630 WERROR _srvsvc_NetShareCheck(struct pipes_struct *p,
2631 struct srvsvc_NetShareCheck *r)
2633 p->rng_fault_state = True;
2634 return WERR_NOT_SUPPORTED;
2637 WERROR _srvsvc_NetServerStatisticsGet(struct pipes_struct *p,
2638 struct srvsvc_NetServerStatisticsGet *r)
2640 p->rng_fault_state = True;
2641 return WERR_NOT_SUPPORTED;
2644 WERROR _srvsvc_NetTransportAdd(struct pipes_struct *p,
2645 struct srvsvc_NetTransportAdd *r)
2647 p->rng_fault_state = True;
2648 return WERR_NOT_SUPPORTED;
2651 WERROR _srvsvc_NetTransportEnum(struct pipes_struct *p,
2652 struct srvsvc_NetTransportEnum *r)
2654 p->rng_fault_state = True;
2655 return WERR_NOT_SUPPORTED;
2658 WERROR _srvsvc_NetTransportDel(struct pipes_struct *p,
2659 struct srvsvc_NetTransportDel *r)
2661 p->rng_fault_state = True;
2662 return WERR_NOT_SUPPORTED;
2665 WERROR _srvsvc_NetSetServiceBits(struct pipes_struct *p,
2666 struct srvsvc_NetSetServiceBits *r)
2668 p->rng_fault_state = True;
2669 return WERR_NOT_SUPPORTED;
2672 WERROR _srvsvc_NetPathType(struct pipes_struct *p,
2673 struct srvsvc_NetPathType *r)
2675 p->rng_fault_state = True;
2676 return WERR_NOT_SUPPORTED;
2679 WERROR _srvsvc_NetPathCanonicalize(struct pipes_struct *p,
2680 struct srvsvc_NetPathCanonicalize *r)
2682 p->rng_fault_state = True;
2683 return WERR_NOT_SUPPORTED;
2686 WERROR _srvsvc_NetPathCompare(struct pipes_struct *p,
2687 struct srvsvc_NetPathCompare *r)
2689 p->rng_fault_state = True;
2690 return WERR_NOT_SUPPORTED;
2693 WERROR _srvsvc_NETRPRNAMECANONICALIZE(struct pipes_struct *p,
2694 struct srvsvc_NETRPRNAMECANONICALIZE *r)
2696 p->rng_fault_state = True;
2697 return WERR_NOT_SUPPORTED;
2700 WERROR _srvsvc_NetPRNameCompare(struct pipes_struct *p,
2701 struct srvsvc_NetPRNameCompare *r)
2703 p->rng_fault_state = True;
2704 return WERR_NOT_SUPPORTED;
2707 WERROR _srvsvc_NetShareDelStart(struct pipes_struct *p,
2708 struct srvsvc_NetShareDelStart *r)
2710 p->rng_fault_state = True;
2711 return WERR_NOT_SUPPORTED;
2714 WERROR _srvsvc_NetShareDelCommit(struct pipes_struct *p,
2715 struct srvsvc_NetShareDelCommit *r)
2717 p->rng_fault_state = True;
2718 return WERR_NOT_SUPPORTED;
2721 WERROR _srvsvc_NetServerTransportAddEx(struct pipes_struct *p,
2722 struct srvsvc_NetServerTransportAddEx *r)
2724 p->rng_fault_state = True;
2725 return WERR_NOT_SUPPORTED;
2728 WERROR _srvsvc_NetServerSetServiceBitsEx(struct pipes_struct *p,
2729 struct srvsvc_NetServerSetServiceBitsEx *r)
2731 p->rng_fault_state = True;
2732 return WERR_NOT_SUPPORTED;
2735 WERROR _srvsvc_NETRDFSGETVERSION(struct pipes_struct *p,
2736 struct srvsvc_NETRDFSGETVERSION *r)
2738 p->rng_fault_state = True;
2739 return WERR_NOT_SUPPORTED;
2742 WERROR _srvsvc_NETRDFSCREATELOCALPARTITION(struct pipes_struct *p,
2743 struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
2745 p->rng_fault_state = True;
2746 return WERR_NOT_SUPPORTED;
2749 WERROR _srvsvc_NETRDFSDELETELOCALPARTITION(struct pipes_struct *p,
2750 struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
2752 p->rng_fault_state = True;
2753 return WERR_NOT_SUPPORTED;
2756 WERROR _srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct pipes_struct *p,
2757 struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
2759 p->rng_fault_state = True;
2760 return WERR_NOT_SUPPORTED;
2763 WERROR _srvsvc_NETRDFSSETSERVERINFO(struct pipes_struct *p,
2764 struct srvsvc_NETRDFSSETSERVERINFO *r)
2766 p->rng_fault_state = True;
2767 return WERR_NOT_SUPPORTED;
2770 WERROR _srvsvc_NETRDFSCREATEEXITPOINT(struct pipes_struct *p,
2771 struct srvsvc_NETRDFSCREATEEXITPOINT *r)
2773 p->rng_fault_state = True;
2774 return WERR_NOT_SUPPORTED;
2777 WERROR _srvsvc_NETRDFSDELETEEXITPOINT(struct pipes_struct *p,
2778 struct srvsvc_NETRDFSDELETEEXITPOINT *r)
2780 p->rng_fault_state = True;
2781 return WERR_NOT_SUPPORTED;
2784 WERROR _srvsvc_NETRDFSMODIFYPREFIX(struct pipes_struct *p,
2785 struct srvsvc_NETRDFSMODIFYPREFIX *r)
2787 p->rng_fault_state = True;
2788 return WERR_NOT_SUPPORTED;
2791 WERROR _srvsvc_NETRDFSFIXLOCALVOLUME(struct pipes_struct *p,
2792 struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
2794 p->rng_fault_state = True;
2795 return WERR_NOT_SUPPORTED;
2798 WERROR _srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct pipes_struct *p,
2799 struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
2801 p->rng_fault_state = True;
2802 return WERR_NOT_SUPPORTED;
2805 WERROR _srvsvc_NETRSERVERTRANSPORTDELEX(struct pipes_struct *p,
2806 struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
2808 p->rng_fault_state = True;
2809 return WERR_NOT_SUPPORTED;