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"
29 #include "../librpc/gen_ndr/srv_srvsvc.h"
30 #include "../libcli/security/security.h"
31 #include "../librpc/gen_ndr/ndr_security.h"
32 #include "dbwrap/dbwrap.h"
34 #include "../lib/util/util_pw.h"
35 #include "smbd/smbd.h"
36 #include "smbd/globals.h"
40 extern const struct generic_mapping file_generic_mapping;
43 #define DBGC_CLASS DBGC_RPC_SRV
45 #define MAX_SERVER_DISK_ENTRIES 15
47 /* Use for enumerating connections, pipes, & files */
49 struct file_enum_count {
52 struct srvsvc_NetFileCtr3 *ctr3;
55 struct sess_file_count {
61 /* Used to store pipe open records for NetFileEnum() */
63 struct pipe_open_rec {
70 /****************************************************************************
71 Count the entries belonging to a service in the connection db.
72 ****************************************************************************/
74 static int pipe_enum_fn( struct db_record *rec, void *p)
76 struct pipe_open_rec prec;
77 struct file_enum_count *fenum = (struct file_enum_count *)p;
78 struct srvsvc_NetFileInfo3 *f;
79 int i = fenum->ctr3->count;
80 char *fullpath = NULL;
83 if (rec->value.dsize != sizeof(struct pipe_open_rec))
86 memcpy(&prec, rec->value.dptr, sizeof(struct pipe_open_rec));
88 if ( !process_exists(prec.pid) ) {
92 username = uidtoname(prec.uid);
94 if ((fenum->username != NULL)
95 && !strequal(username, fenum->username)) {
99 fullpath = talloc_asprintf(fenum->ctx, "\\PIPE\\%s", prec.name );
104 f = talloc_realloc(fenum->ctx, fenum->ctr3->array,
105 struct srvsvc_NetFileInfo3, i+1);
107 DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
110 fenum->ctr3->array = f;
112 fenum->ctr3->array[i].fid =
113 (((uint32_t)(procid_to_pid(&prec.pid))<<16) | prec.pnum);
114 fenum->ctr3->array[i].permissions =
115 (FILE_READ_DATA|FILE_WRITE_DATA);
116 fenum->ctr3->array[i].num_locks = 0;
117 fenum->ctr3->array[i].path = fullpath;
118 fenum->ctr3->array[i].user = username;
120 fenum->ctr3->count++;
125 /*******************************************************************
126 ********************************************************************/
128 static WERROR net_enum_pipes(TALLOC_CTX *ctx,
129 const char *username,
130 struct srvsvc_NetFileCtr3 **ctr3,
133 struct file_enum_count fenum;
136 fenum.username = username;
139 if (connections_traverse(pipe_enum_fn, &fenum) < 0) {
140 DEBUG(0,("net_enum_pipes: traverse of connections.tdb "
150 /*******************************************************************
151 ********************************************************************/
153 static void enum_file_fn( const struct share_mode_entry *e,
154 const char *sharepath, const char *fname,
157 struct file_enum_count *fenum =
158 (struct file_enum_count *)private_data;
160 struct srvsvc_NetFileInfo3 *f;
161 int i = fenum->ctr3->count;
163 struct byte_range_lock *brl;
165 char *fullpath = NULL;
167 const char *username;
169 /* If the pid was not found delete the entry from connections.tdb */
171 if ( !process_exists(e->pid) ) {
175 username = uidtoname(e->uid);
177 if ((fenum->username != NULL)
178 && !strequal(username, fenum->username)) {
182 f = talloc_realloc(fenum->ctx, fenum->ctr3->array,
183 struct srvsvc_NetFileInfo3, i+1);
185 DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
188 fenum->ctr3->array = f;
190 /* need to count the number of locks on a file */
195 if ( (brl = brl_get_locks(talloc_tos(), &fsp)) != NULL ) {
196 num_locks = brl->num_locks;
200 if ( strcmp( fname, "." ) == 0 ) {
201 fullpath = talloc_asprintf(fenum->ctx, "C:%s", sharepath );
203 fullpath = talloc_asprintf(fenum->ctx, "C:%s/%s",
209 string_replace( fullpath, '/', '\\' );
211 /* mask out create (what ever that is) */
212 permissions = e->access_mask & (FILE_READ_DATA|FILE_WRITE_DATA);
214 /* now fill in the srvsvc_NetFileInfo3 struct */
216 fenum->ctr3->array[i].fid =
217 (((uint32_t)(procid_to_pid(&e->pid))<<16) | e->share_file_id);
218 fenum->ctr3->array[i].permissions = permissions;
219 fenum->ctr3->array[i].num_locks = num_locks;
220 fenum->ctr3->array[i].path = fullpath;
221 fenum->ctr3->array[i].user = username;
223 fenum->ctr3->count++;
226 /*******************************************************************
227 ********************************************************************/
229 static WERROR net_enum_files(TALLOC_CTX *ctx,
230 const char *username,
231 struct srvsvc_NetFileCtr3 **ctr3,
234 struct file_enum_count f_enum_cnt;
236 f_enum_cnt.ctx = ctx;
237 f_enum_cnt.username = username;
238 f_enum_cnt.ctr3 = *ctr3;
240 share_mode_forall( enum_file_fn, (void *)&f_enum_cnt );
242 *ctr3 = f_enum_cnt.ctr3;
247 /*******************************************************************
248 Utility function to get the 'type' of a share from an snum.
249 ********************************************************************/
250 static enum srvsvc_ShareType get_share_type(int snum)
252 /* work out the share type */
253 enum srvsvc_ShareType type = STYPE_DISKTREE;
255 if (lp_print_ok(snum)) {
256 type = lp_administrative_share(snum)
257 ? STYPE_PRINTQ_HIDDEN : STYPE_PRINTQ;
259 if (strequal(lp_fstype(snum), "IPC")) {
260 type = lp_administrative_share(snum)
261 ? STYPE_IPC_HIDDEN : STYPE_IPC;
266 /*******************************************************************
267 Fill in a share info level 0 structure.
268 ********************************************************************/
270 static void init_srv_share_info_0(struct pipes_struct *p,
271 struct srvsvc_NetShareInfo0 *r, int snum)
273 r->name = lp_servicename(snum);
276 /*******************************************************************
277 Fill in a share info level 1 structure.
278 ********************************************************************/
280 static void init_srv_share_info_1(struct pipes_struct *p,
281 struct srvsvc_NetShareInfo1 *r,
284 char *net_name = lp_servicename(snum);
285 char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
288 remark = talloc_sub_advanced(
289 p->mem_ctx, lp_servicename(snum),
290 get_current_username(), lp_pathname(snum),
291 p->session_info->unix_token->uid, get_current_username(),
296 r->type = get_share_type(snum);
297 r->comment = remark ? remark : "";
300 /*******************************************************************
301 Fill in a share info level 2 structure.
302 ********************************************************************/
304 static void init_srv_share_info_2(struct pipes_struct *p,
305 struct srvsvc_NetShareInfo2 *r,
310 int max_connections = lp_max_connections(snum);
311 uint32_t max_uses = max_connections!=0 ? max_connections : (uint32_t)-1;
312 char *net_name = lp_servicename(snum);
314 remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
316 remark = talloc_sub_advanced(
317 p->mem_ctx, lp_servicename(snum),
318 get_current_username(), lp_pathname(snum),
319 p->session_info->unix_token->uid, get_current_username(),
322 path = talloc_asprintf(p->mem_ctx,
323 "C:%s", lp_pathname(snum));
327 * Change / to \\ so that win2k will see it as a valid path.
328 * This was added to enable use of browsing in win2k add
332 string_replace(path, '/', '\\');
336 r->type = get_share_type(snum);
337 r->comment = remark ? remark : "";
339 r->max_users = max_uses;
340 r->current_users = count_current_connections(net_name, false);
341 r->path = path ? path : "";
345 /*******************************************************************
346 Map any generic bits to file specific bits.
347 ********************************************************************/
349 static void map_generic_share_sd_bits(struct security_descriptor *psd)
352 struct security_acl *ps_dacl = NULL;
361 for (i = 0; i < ps_dacl->num_aces; i++) {
362 struct security_ace *psa = &ps_dacl->aces[i];
363 uint32 orig_mask = psa->access_mask;
365 se_map_generic(&psa->access_mask, &file_generic_mapping);
366 psa->access_mask |= orig_mask;
370 /*******************************************************************
371 Fill in a share info level 501 structure.
372 ********************************************************************/
374 static void init_srv_share_info_501(struct pipes_struct *p,
375 struct srvsvc_NetShareInfo501 *r, int snum)
377 const char *net_name = lp_servicename(snum);
378 char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
381 remark = talloc_sub_advanced(
382 p->mem_ctx, lp_servicename(snum),
383 get_current_username(), lp_pathname(snum),
384 p->session_info->unix_token->uid, get_current_username(),
389 r->type = get_share_type(snum);
390 r->comment = remark ? remark : "";
391 r->csc_policy = (lp_csc_policy(snum) << 4);
394 /*******************************************************************
395 Fill in a share info level 502 structure.
396 ********************************************************************/
398 static void init_srv_share_info_502(struct pipes_struct *p,
399 struct srvsvc_NetShareInfo502 *r, int snum)
401 const char *net_name = lp_servicename(snum);
403 struct security_descriptor *sd = NULL;
404 struct sec_desc_buf *sd_buf = NULL;
406 TALLOC_CTX *ctx = p->mem_ctx;
407 char *remark = talloc_strdup(ctx, lp_comment(snum));
410 remark = talloc_sub_advanced(
411 p->mem_ctx, lp_servicename(snum),
412 get_current_username(), lp_pathname(snum),
413 p->session_info->unix_token->uid, get_current_username(),
416 path = talloc_asprintf(ctx, "C:%s", lp_pathname(snum));
419 * Change / to \\ so that win2k will see it as a valid path. This was added to
420 * enable use of browsing in win2k add share dialog.
422 string_replace(path, '/', '\\');
425 sd = get_share_security(ctx, lp_servicename(snum), &sd_size);
427 sd_buf = make_sec_desc_buf(p->mem_ctx, sd_size, sd);
430 r->type = get_share_type(snum);
431 r->comment = remark ? remark : "";
433 r->max_users = (uint32_t)-1;
434 r->current_users = 1; /* ??? */
435 r->path = path ? path : "";
440 /***************************************************************************
441 Fill in a share info level 1004 structure.
442 ***************************************************************************/
444 static void init_srv_share_info_1004(struct pipes_struct *p,
445 struct srvsvc_NetShareInfo1004 *r,
448 char *remark = talloc_strdup(p->mem_ctx, lp_comment(snum));
451 remark = talloc_sub_advanced(
452 p->mem_ctx, lp_servicename(snum),
453 get_current_username(), lp_pathname(snum),
454 p->session_info->unix_token->uid, get_current_username(),
458 r->comment = remark ? remark : "";
461 /***************************************************************************
462 Fill in a share info level 1005 structure.
463 ***************************************************************************/
465 static void init_srv_share_info_1005(struct pipes_struct *p,
466 struct srvsvc_NetShareInfo1005 *r,
469 uint32_t dfs_flags = 0;
471 if (lp_host_msdfs() && lp_msdfs_root(snum)) {
472 dfs_flags |= SHARE_1005_IN_DFS | SHARE_1005_DFS_ROOT;
475 dfs_flags |= lp_csc_policy(snum) << SHARE_1005_CSC_POLICY_SHIFT;
477 r->dfs_flags = dfs_flags;
480 /***************************************************************************
481 Fill in a share info level 1006 structure.
482 ***************************************************************************/
484 static void init_srv_share_info_1006(struct pipes_struct *p,
485 struct srvsvc_NetShareInfo1006 *r,
488 r->max_users = (uint32_t)-1;
491 /***************************************************************************
492 Fill in a share info level 1007 structure.
493 ***************************************************************************/
495 static void init_srv_share_info_1007(struct pipes_struct *p,
496 struct srvsvc_NetShareInfo1007 *r,
500 r->alternate_directory_name = "";
503 /*******************************************************************
504 Fill in a share info level 1501 structure.
505 ********************************************************************/
507 static void init_srv_share_info_1501(struct pipes_struct *p,
508 struct sec_desc_buf **r,
511 struct security_descriptor *sd;
512 struct sec_desc_buf *sd_buf = NULL;
514 TALLOC_CTX *ctx = p->mem_ctx;
516 sd = get_share_security(ctx, lp_servicename(snum), &sd_size);
518 sd_buf = make_sec_desc_buf(p->mem_ctx, sd_size, sd);
524 /*******************************************************************
525 True if it ends in '$'.
526 ********************************************************************/
528 static bool is_hidden_share(int snum)
530 const char *net_name = lp_servicename(snum);
532 return (net_name[strlen(net_name) - 1] == '$') ? True : False;
535 /*******************************************************************
536 Verify user is allowed to view share, access based enumeration
537 ********************************************************************/
538 static bool is_enumeration_allowed(struct pipes_struct *p,
541 if (!lp_access_based_share_enum(snum))
544 return share_access_check(p->session_info->security_token,
545 lp_servicename(snum), FILE_READ_DATA, NULL);
548 /*******************************************************************
549 Fill in a share info structure.
550 ********************************************************************/
552 static WERROR init_srv_share_info_ctr(struct pipes_struct *p,
553 struct srvsvc_NetShareInfoCtr *info_ctr,
554 uint32_t *resume_handle_p,
555 uint32_t *total_entries,
559 int alloc_entries = 0;
560 int num_services = 0;
562 TALLOC_CTX *ctx = p->mem_ctx;
564 int valid_share_count = 0;
566 union srvsvc_NetShareCtr ctr;
567 uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0;
569 DEBUG(5,("init_srv_share_info_ctr\n"));
571 /* Ensure all the usershares are loaded. */
573 load_usershare_shares(msg_ctx_to_sconn(p->msg_ctx));
574 load_registry_shares();
575 num_services = lp_numservices();
578 allowed = talloc_zero_array(ctx, bool, num_services);
579 W_ERROR_HAVE_NO_MEMORY(allowed);
581 /* Count the number of entries. */
582 for (snum = 0; snum < num_services; snum++) {
583 if (lp_browseable(snum) && lp_snum_ok(snum) &&
584 is_enumeration_allowed(p, snum) &&
585 (all_shares || !is_hidden_share(snum)) ) {
586 DEBUG(10, ("counting service %s\n",
587 lp_servicename(snum) ? lp_servicename(snum) : "(null)"));
588 allowed[snum] = true;
591 DEBUG(10, ("NOT counting service %s\n",
592 lp_servicename(snum) ? lp_servicename(snum) : "(null)"));
596 if (!num_entries || (resume_handle >= num_entries)) {
600 /* Calculate alloc entries. */
601 alloc_entries = num_entries - resume_handle;
602 switch (info_ctr->level) {
604 ctr.ctr0 = talloc_zero(ctx, struct srvsvc_NetShareCtr0);
605 W_ERROR_HAVE_NO_MEMORY(ctr.ctr0);
607 ctr.ctr0->count = alloc_entries;
608 ctr.ctr0->array = talloc_zero_array(ctx, struct srvsvc_NetShareInfo0, alloc_entries);
609 W_ERROR_HAVE_NO_MEMORY(ctr.ctr0->array);
611 for (snum = 0; snum < num_services; snum++) {
613 (resume_handle <= (i + valid_share_count++)) ) {
614 init_srv_share_info_0(p, &ctr.ctr0->array[i++], snum);
621 ctr.ctr1 = talloc_zero(ctx, struct srvsvc_NetShareCtr1);
622 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1);
624 ctr.ctr1->count = alloc_entries;
625 ctr.ctr1->array = talloc_zero_array(ctx, struct srvsvc_NetShareInfo1, alloc_entries);
626 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1->array);
628 for (snum = 0; snum < num_services; snum++) {
630 (resume_handle <= (i + valid_share_count++)) ) {
631 init_srv_share_info_1(p, &ctr.ctr1->array[i++], snum);
638 ctr.ctr2 = talloc_zero(ctx, struct srvsvc_NetShareCtr2);
639 W_ERROR_HAVE_NO_MEMORY(ctr.ctr2);
641 ctr.ctr2->count = alloc_entries;
642 ctr.ctr2->array = talloc_zero_array(ctx, struct srvsvc_NetShareInfo2, alloc_entries);
643 W_ERROR_HAVE_NO_MEMORY(ctr.ctr2->array);
645 for (snum = 0; snum < num_services; snum++) {
647 (resume_handle <= (i + valid_share_count++)) ) {
648 init_srv_share_info_2(p, &ctr.ctr2->array[i++], snum);
655 ctr.ctr501 = talloc_zero(ctx, struct srvsvc_NetShareCtr501);
656 W_ERROR_HAVE_NO_MEMORY(ctr.ctr501);
658 ctr.ctr501->count = alloc_entries;
659 ctr.ctr501->array = talloc_zero_array(ctx, struct srvsvc_NetShareInfo501, alloc_entries);
660 W_ERROR_HAVE_NO_MEMORY(ctr.ctr501->array);
662 for (snum = 0; snum < num_services; snum++) {
664 (resume_handle <= (i + valid_share_count++)) ) {
665 init_srv_share_info_501(p, &ctr.ctr501->array[i++], snum);
672 ctr.ctr502 = talloc_zero(ctx, struct srvsvc_NetShareCtr502);
673 W_ERROR_HAVE_NO_MEMORY(ctr.ctr502);
675 ctr.ctr502->count = alloc_entries;
676 ctr.ctr502->array = talloc_zero_array(ctx, struct srvsvc_NetShareInfo502, alloc_entries);
677 W_ERROR_HAVE_NO_MEMORY(ctr.ctr502->array);
679 for (snum = 0; snum < num_services; snum++) {
681 (resume_handle <= (i + valid_share_count++)) ) {
682 init_srv_share_info_502(p, &ctr.ctr502->array[i++], snum);
689 ctr.ctr1004 = talloc_zero(ctx, struct srvsvc_NetShareCtr1004);
690 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1004);
692 ctr.ctr1004->count = alloc_entries;
693 ctr.ctr1004->array = talloc_zero_array(ctx, struct srvsvc_NetShareInfo1004, alloc_entries);
694 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1004->array);
696 for (snum = 0; snum < num_services; snum++) {
698 (resume_handle <= (i + valid_share_count++)) ) {
699 init_srv_share_info_1004(p, &ctr.ctr1004->array[i++], snum);
706 ctr.ctr1005 = talloc_zero(ctx, struct srvsvc_NetShareCtr1005);
707 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1005);
709 ctr.ctr1005->count = alloc_entries;
710 ctr.ctr1005->array = talloc_zero_array(ctx, struct srvsvc_NetShareInfo1005, alloc_entries);
711 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1005->array);
713 for (snum = 0; snum < num_services; snum++) {
715 (resume_handle <= (i + valid_share_count++)) ) {
716 init_srv_share_info_1005(p, &ctr.ctr1005->array[i++], snum);
723 ctr.ctr1006 = talloc_zero(ctx, struct srvsvc_NetShareCtr1006);
724 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1006);
726 ctr.ctr1006->count = alloc_entries;
727 ctr.ctr1006->array = talloc_zero_array(ctx, struct srvsvc_NetShareInfo1006, alloc_entries);
728 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1006->array);
730 for (snum = 0; snum < num_services; snum++) {
732 (resume_handle <= (i + valid_share_count++)) ) {
733 init_srv_share_info_1006(p, &ctr.ctr1006->array[i++], snum);
740 ctr.ctr1007 = talloc_zero(ctx, struct srvsvc_NetShareCtr1007);
741 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1007);
743 ctr.ctr1007->count = alloc_entries;
744 ctr.ctr1007->array = talloc_zero_array(ctx, struct srvsvc_NetShareInfo1007, alloc_entries);
745 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1007->array);
747 for (snum = 0; snum < num_services; snum++) {
749 (resume_handle <= (i + valid_share_count++)) ) {
750 init_srv_share_info_1007(p, &ctr.ctr1007->array[i++], snum);
757 ctr.ctr1501 = talloc_zero(ctx, struct srvsvc_NetShareCtr1501);
758 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1501);
760 ctr.ctr1501->count = alloc_entries;
761 ctr.ctr1501->array = talloc_zero_array(ctx, struct sec_desc_buf, alloc_entries);
762 W_ERROR_HAVE_NO_MEMORY(ctr.ctr1501->array);
764 for (snum = 0; snum < num_services; snum++) {
766 (resume_handle <= (i + valid_share_count++)) ) {
767 struct sec_desc_buf *sd_buf = NULL;
768 init_srv_share_info_1501(p, &sd_buf, snum);
769 ctr.ctr1501->array[i++] = *sd_buf;
776 DEBUG(5,("init_srv_share_info_ctr: unsupported switch value %d\n",
778 return WERR_UNKNOWN_LEVEL;
781 *total_entries = alloc_entries;
782 if (resume_handle_p) {
784 *resume_handle_p = (num_entries == 0) ? *resume_handle_p : 0;
786 *resume_handle_p = num_entries;
795 /*******************************************************************
796 fill in a sess info level 0 structure.
797 ********************************************************************/
799 static WERROR init_srv_sess_info_0(struct pipes_struct *p,
800 struct srvsvc_NetSessCtr0 *ctr0,
801 uint32_t *resume_handle_p,
802 uint32_t *total_entries)
804 struct sessionid *session_list;
805 uint32_t num_entries = 0;
806 uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0;
807 *total_entries = list_sessions(p->mem_ctx, &session_list);
809 DEBUG(5,("init_srv_sess_info_0\n"));
812 if (resume_handle_p) {
813 *resume_handle_p = 0;
818 for (; resume_handle < *total_entries; resume_handle++) {
820 ctr0->array = talloc_realloc(p->mem_ctx,
822 struct srvsvc_NetSessInfo0,
824 W_ERROR_HAVE_NO_MEMORY(ctr0->array);
826 ctr0->array[num_entries].client =
827 session_list[resume_handle].remote_machine;
832 ctr0->count = num_entries;
834 if (resume_handle_p) {
835 if (*resume_handle_p >= *total_entries) {
836 *resume_handle_p = 0;
838 *resume_handle_p = resume_handle;
845 /*******************************************************************
846 ********************************************************************/
848 static void sess_file_fn( const struct share_mode_entry *e,
849 const char *sharepath, const char *fname,
852 struct sess_file_count *sess = (struct sess_file_count *)data;
854 if ( procid_equal(&e->pid, &sess->pid) && (sess->uid == e->uid) ) {
861 /*******************************************************************
862 ********************************************************************/
864 static int net_count_files( uid_t uid, struct server_id pid )
866 struct sess_file_count s_file_cnt;
868 s_file_cnt.count = 0;
869 s_file_cnt.uid = uid;
870 s_file_cnt.pid = pid;
872 share_mode_forall( sess_file_fn, &s_file_cnt );
874 return s_file_cnt.count;
877 /*******************************************************************
878 fill in a sess info level 1 structure.
879 ********************************************************************/
881 static WERROR init_srv_sess_info_1(struct pipes_struct *p,
882 struct srvsvc_NetSessCtr1 *ctr1,
883 uint32_t *resume_handle_p,
884 uint32_t *total_entries)
886 struct sessionid *session_list;
887 uint32_t num_entries = 0;
888 time_t now = time(NULL);
889 uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0;
894 if (resume_handle_p) {
895 *resume_handle_p = 0;
900 *total_entries = list_sessions(p->mem_ctx, &session_list);
902 for (; resume_handle < *total_entries; resume_handle++) {
905 struct passwd *pw = sys_getpwnam(session_list[resume_handle].username);
909 DEBUG(10,("init_srv_sess_info_1: failed to find owner: %s\n",
910 session_list[resume_handle].username));
914 connect_time = (uint32_t)(now - session_list[resume_handle].connect_start);
915 num_files = net_count_files(pw->pw_uid, session_list[resume_handle].pid);
916 guest = strequal( session_list[resume_handle].username, lp_guestaccount() );
918 ctr1->array = talloc_realloc(p->mem_ctx,
920 struct srvsvc_NetSessInfo1,
922 W_ERROR_HAVE_NO_MEMORY(ctr1->array);
924 ctr1->array[num_entries].client = session_list[resume_handle].remote_machine;
925 ctr1->array[num_entries].user = session_list[resume_handle].username;
926 ctr1->array[num_entries].num_open = num_files;
927 ctr1->array[num_entries].time = connect_time;
928 ctr1->array[num_entries].idle_time = 0;
929 ctr1->array[num_entries].user_flags = guest;
934 ctr1->count = num_entries;
936 if (resume_handle_p) {
937 if (*resume_handle_p >= *total_entries) {
938 *resume_handle_p = 0;
940 *resume_handle_p = resume_handle;
947 /*******************************************************************
948 fill in a conn info level 0 structure.
949 ********************************************************************/
951 static WERROR init_srv_conn_info_0(struct srvsvc_NetConnCtr0 *ctr0,
952 uint32_t *resume_handle_p,
953 uint32_t *total_entries)
955 uint32_t num_entries = 0;
956 uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0;
958 DEBUG(5,("init_srv_conn_info_0\n"));
961 if (resume_handle_p) {
962 *resume_handle_p = 0;
971 for (; resume_handle < *total_entries; resume_handle++) {
973 ctr0->array = talloc_realloc(talloc_tos(),
975 struct srvsvc_NetConnInfo0,
981 ctr0->array[num_entries].conn_id = *total_entries;
983 /* move on to creating next connection */
987 ctr0->count = num_entries;
988 *total_entries = num_entries;
990 if (resume_handle_p) {
991 if (*resume_handle_p >= *total_entries) {
992 *resume_handle_p = 0;
994 *resume_handle_p = resume_handle;
1001 /*******************************************************************
1002 fill in a conn info level 1 structure.
1003 ********************************************************************/
1005 static WERROR init_srv_conn_info_1(struct srvsvc_NetConnCtr1 *ctr1,
1006 uint32_t *resume_handle_p,
1007 uint32_t *total_entries)
1009 uint32_t num_entries = 0;
1010 uint32_t resume_handle = resume_handle_p ? *resume_handle_p : 0;
1012 DEBUG(5,("init_srv_conn_info_1\n"));
1015 if (resume_handle_p) {
1016 *resume_handle_p = 0;
1025 for (; resume_handle < *total_entries; resume_handle++) {
1027 ctr1->array = talloc_realloc(talloc_tos(),
1029 struct srvsvc_NetConnInfo1,
1035 ctr1->array[num_entries].conn_id = *total_entries;
1036 ctr1->array[num_entries].conn_type = 0x3;
1037 ctr1->array[num_entries].num_open = 1;
1038 ctr1->array[num_entries].num_users = 1;
1039 ctr1->array[num_entries].conn_time = 3;
1040 ctr1->array[num_entries].user = "dummy_user";
1041 ctr1->array[num_entries].share = "IPC$";
1043 /* move on to creating next connection */
1047 ctr1->count = num_entries;
1048 *total_entries = num_entries;
1050 if (resume_handle_p) {
1051 if (*resume_handle_p >= *total_entries) {
1052 *resume_handle_p = 0;
1054 *resume_handle_p = resume_handle;
1061 /*******************************************************************
1063 *******************************************************************/
1065 WERROR _srvsvc_NetFileEnum(struct pipes_struct *p,
1066 struct srvsvc_NetFileEnum *r)
1068 TALLOC_CTX *ctx = NULL;
1069 struct srvsvc_NetFileCtr3 *ctr3;
1070 uint32_t resume_hnd = 0;
1073 switch (r->in.info_ctr->level) {
1077 return WERR_UNKNOWN_LEVEL;
1080 if (!nt_token_check_sid(&global_sid_Builtin_Administrators,
1081 p->session_info->security_token)) {
1082 DEBUG(1, ("Enumerating files only allowed for "
1083 "administrators\n"));
1084 return WERR_ACCESS_DENIED;
1088 ctr3 = r->in.info_ctr->ctr.ctr3;
1090 werr = WERR_INVALID_PARAM;
1094 /* TODO -- Windows enumerates
1096 (c) open directories and files */
1098 werr = net_enum_files(ctx, r->in.user, &ctr3, resume_hnd);
1099 if (!W_ERROR_IS_OK(werr)) {
1103 werr = net_enum_pipes(ctx, r->in.user, &ctr3, resume_hnd);
1104 if (!W_ERROR_IS_OK(werr)) {
1108 *r->out.totalentries = ctr3->count;
1109 r->out.info_ctr->ctr.ctr3->array = ctr3->array;
1110 r->out.info_ctr->ctr.ctr3->count = ctr3->count;
1118 /*******************************************************************
1119 _srvsvc_NetSrvGetInfo
1120 ********************************************************************/
1122 WERROR _srvsvc_NetSrvGetInfo(struct pipes_struct *p,
1123 struct srvsvc_NetSrvGetInfo *r)
1125 WERROR status = WERR_OK;
1127 DEBUG(5,("_srvsvc_NetSrvGetInfo: %d\n", __LINE__));
1129 if (!pipe_access_check(p)) {
1130 DEBUG(3, ("access denied to _srvsvc_NetSrvGetInfo\n"));
1131 return WERR_ACCESS_DENIED;
1134 switch (r->in.level) {
1136 /* Technically level 102 should only be available to
1137 Administrators but there isn't anything super-secret
1138 here, as most of it is made up. */
1141 struct srvsvc_NetSrvInfo102 *info102;
1143 info102 = talloc(p->mem_ctx, struct srvsvc_NetSrvInfo102);
1148 info102->platform_id = PLATFORM_ID_NT;
1149 info102->server_name = lp_netbios_name();
1150 info102->version_major = SAMBA_MAJOR_NBT_ANNOUNCE_VERSION;
1151 info102->version_minor = SAMBA_MINOR_NBT_ANNOUNCE_VERSION;
1152 info102->server_type = lp_default_server_announce();
1153 info102->comment = string_truncate(lp_serverstring(),
1154 MAX_SERVER_STRING_LENGTH);
1155 info102->users = 0xffffffff;
1156 info102->disc = 0xf;
1157 info102->hidden = 0;
1158 info102->announce = 240;
1159 info102->anndelta = 3000;
1160 info102->licenses = 100000;
1161 info102->userpath = "C:\\";
1163 r->out.info->info102 = info102;
1167 struct srvsvc_NetSrvInfo101 *info101;
1169 info101 = talloc(p->mem_ctx, struct srvsvc_NetSrvInfo101);
1174 info101->platform_id = PLATFORM_ID_NT;
1175 info101->server_name = lp_netbios_name();
1176 info101->version_major = SAMBA_MAJOR_NBT_ANNOUNCE_VERSION;
1177 info101->version_minor = SAMBA_MINOR_NBT_ANNOUNCE_VERSION;
1178 info101->server_type = lp_default_server_announce();
1179 info101->comment = string_truncate(lp_serverstring(),
1180 MAX_SERVER_STRING_LENGTH);
1182 r->out.info->info101 = info101;
1186 struct srvsvc_NetSrvInfo100 *info100;
1188 info100 = talloc(p->mem_ctx, struct srvsvc_NetSrvInfo100);
1193 info100->platform_id = PLATFORM_ID_NT;
1194 info100->server_name = lp_netbios_name();
1196 r->out.info->info100 = info100;
1201 status = WERR_UNKNOWN_LEVEL;
1205 DEBUG(5,("_srvsvc_NetSrvGetInfo: %d\n", __LINE__));
1210 /*******************************************************************
1211 _srvsvc_NetSrvSetInfo
1212 ********************************************************************/
1214 WERROR _srvsvc_NetSrvSetInfo(struct pipes_struct *p,
1215 struct srvsvc_NetSrvSetInfo *r)
1217 WERROR status = WERR_OK;
1219 DEBUG(5,("_srvsvc_NetSrvSetInfo: %d\n", __LINE__));
1221 /* Set up the net server set info structure. */
1223 DEBUG(5,("_srvsvc_NetSrvSetInfo: %d\n", __LINE__));
1228 /*******************************************************************
1230 ********************************************************************/
1232 WERROR _srvsvc_NetConnEnum(struct pipes_struct *p,
1233 struct srvsvc_NetConnEnum *r)
1237 DEBUG(5,("_srvsvc_NetConnEnum: %d\n", __LINE__));
1239 if (!nt_token_check_sid(&global_sid_Builtin_Administrators,
1240 p->session_info->security_token)) {
1241 DEBUG(1, ("Enumerating connections only allowed for "
1242 "administrators\n"));
1243 return WERR_ACCESS_DENIED;
1246 switch (r->in.info_ctr->level) {
1248 werr = init_srv_conn_info_0(r->in.info_ctr->ctr.ctr0,
1249 r->in.resume_handle,
1250 r->out.totalentries);
1253 werr = init_srv_conn_info_1(r->in.info_ctr->ctr.ctr1,
1254 r->in.resume_handle,
1255 r->out.totalentries);
1258 return WERR_UNKNOWN_LEVEL;
1261 DEBUG(5,("_srvsvc_NetConnEnum: %d\n", __LINE__));
1266 /*******************************************************************
1268 ********************************************************************/
1270 WERROR _srvsvc_NetSessEnum(struct pipes_struct *p,
1271 struct srvsvc_NetSessEnum *r)
1275 DEBUG(5,("_srvsvc_NetSessEnum: %d\n", __LINE__));
1277 if (!nt_token_check_sid(&global_sid_Builtin_Administrators,
1278 p->session_info->security_token)) {
1279 DEBUG(1, ("Enumerating sessions only allowed for "
1280 "administrators\n"));
1281 return WERR_ACCESS_DENIED;
1284 switch (r->in.info_ctr->level) {
1286 werr = init_srv_sess_info_0(p,
1287 r->in.info_ctr->ctr.ctr0,
1288 r->in.resume_handle,
1289 r->out.totalentries);
1292 werr = init_srv_sess_info_1(p,
1293 r->in.info_ctr->ctr.ctr1,
1294 r->in.resume_handle,
1295 r->out.totalentries);
1298 return WERR_UNKNOWN_LEVEL;
1301 DEBUG(5,("_srvsvc_NetSessEnum: %d\n", __LINE__));
1306 /*******************************************************************
1308 ********************************************************************/
1310 WERROR _srvsvc_NetSessDel(struct pipes_struct *p,
1311 struct srvsvc_NetSessDel *r)
1313 struct sessionid *session_list;
1314 int num_sessions, snum;
1315 const char *username;
1316 const char *machine;
1317 bool not_root = False;
1320 username = r->in.user;
1321 machine = r->in.client;
1323 /* strip leading backslashes if any */
1324 if (machine && machine[0] == '\\' && machine[1] == '\\') {
1328 num_sessions = list_sessions(p->mem_ctx, &session_list);
1330 DEBUG(5,("_srvsvc_NetSessDel: %d\n", __LINE__));
1332 werr = WERR_ACCESS_DENIED;
1334 /* fail out now if you are not root or not a domain admin */
1336 if ((p->session_info->unix_token->uid != sec_initial_uid()) &&
1337 ( ! nt_token_check_domain_rid(p->session_info->security_token,
1338 DOMAIN_RID_ADMINS))) {
1343 for (snum = 0; snum < num_sessions; snum++) {
1345 if ((strequal(session_list[snum].username, username) || username[0] == '\0' ) &&
1346 strequal(session_list[snum].remote_machine, machine)) {
1350 if (p->session_info->unix_token->uid != sec_initial_uid()) {
1355 ntstat = messaging_send(p->msg_ctx,
1356 session_list[snum].pid,
1357 MSG_SHUTDOWN, &data_blob_null);
1359 if (NT_STATUS_IS_OK(ntstat))
1367 DEBUG(5,("_srvsvc_NetSessDel: %d\n", __LINE__));
1374 /*******************************************************************
1375 _srvsvc_NetShareEnumAll
1376 ********************************************************************/
1378 WERROR _srvsvc_NetShareEnumAll(struct pipes_struct *p,
1379 struct srvsvc_NetShareEnumAll *r)
1383 DEBUG(5,("_srvsvc_NetShareEnumAll: %d\n", __LINE__));
1385 if (!pipe_access_check(p)) {
1386 DEBUG(3, ("access denied to _srvsvc_NetShareEnumAll\n"));
1387 return WERR_ACCESS_DENIED;
1390 /* Create the list of shares for the response. */
1391 werr = init_srv_share_info_ctr(p,
1393 r->in.resume_handle,
1394 r->out.totalentries,
1397 DEBUG(5,("_srvsvc_NetShareEnumAll: %d\n", __LINE__));
1402 /*******************************************************************
1403 _srvsvc_NetShareEnum
1404 ********************************************************************/
1406 WERROR _srvsvc_NetShareEnum(struct pipes_struct *p,
1407 struct srvsvc_NetShareEnum *r)
1411 DEBUG(5,("_srvsvc_NetShareEnum: %d\n", __LINE__));
1413 if (!pipe_access_check(p)) {
1414 DEBUG(3, ("access denied to _srvsvc_NetShareEnum\n"));
1415 return WERR_ACCESS_DENIED;
1418 /* Create the list of shares for the response. */
1419 werr = init_srv_share_info_ctr(p,
1421 r->in.resume_handle,
1422 r->out.totalentries,
1425 DEBUG(5,("_srvsvc_NetShareEnum: %d\n", __LINE__));
1430 /*******************************************************************
1431 _srvsvc_NetShareGetInfo
1432 ********************************************************************/
1434 WERROR _srvsvc_NetShareGetInfo(struct pipes_struct *p,
1435 struct srvsvc_NetShareGetInfo *r)
1437 WERROR status = WERR_OK;
1438 char *share_name = NULL;
1440 union srvsvc_NetShareInfo *info = r->out.info;
1442 DEBUG(5,("_srvsvc_NetShareGetInfo: %d\n", __LINE__));
1444 if (!r->in.share_name) {
1445 return WERR_INVALID_NAME;
1448 snum = find_service(talloc_tos(), r->in.share_name, &share_name);
1453 return WERR_INVALID_NAME;
1456 switch (r->in.level) {
1458 info->info0 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo0);
1459 W_ERROR_HAVE_NO_MEMORY(info->info0);
1460 init_srv_share_info_0(p, info->info0, snum);
1463 info->info1 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1);
1464 W_ERROR_HAVE_NO_MEMORY(info->info1);
1465 init_srv_share_info_1(p, info->info1, snum);
1468 info->info2 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo2);
1469 W_ERROR_HAVE_NO_MEMORY(info->info2);
1470 init_srv_share_info_2(p, info->info2, snum);
1473 info->info501 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo501);
1474 W_ERROR_HAVE_NO_MEMORY(info->info501);
1475 init_srv_share_info_501(p, info->info501, snum);
1478 info->info502 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo502);
1479 W_ERROR_HAVE_NO_MEMORY(info->info502);
1480 init_srv_share_info_502(p, info->info502, snum);
1483 info->info1004 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1004);
1484 W_ERROR_HAVE_NO_MEMORY(info->info1004);
1485 init_srv_share_info_1004(p, info->info1004, snum);
1488 info->info1005 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1005);
1489 W_ERROR_HAVE_NO_MEMORY(info->info1005);
1490 init_srv_share_info_1005(p, info->info1005, snum);
1493 info->info1006 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1006);
1494 W_ERROR_HAVE_NO_MEMORY(info->info1006);
1495 init_srv_share_info_1006(p, info->info1006, snum);
1498 info->info1007 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo1007);
1499 W_ERROR_HAVE_NO_MEMORY(info->info1007);
1500 init_srv_share_info_1007(p, info->info1007, snum);
1503 init_srv_share_info_1501(p, &info->info1501, snum);
1506 DEBUG(5,("_srvsvc_NetShareGetInfo: unsupported switch value %d\n",
1508 status = WERR_UNKNOWN_LEVEL;
1512 DEBUG(5,("_srvsvc_NetShareGetInfo: %d\n", __LINE__));
1517 /*******************************************************************
1518 _srvsvc_NetShareSetInfo. Modify share details.
1519 ********************************************************************/
1521 WERROR _srvsvc_NetShareSetInfo(struct pipes_struct *p,
1522 struct srvsvc_NetShareSetInfo *r)
1524 char *command = NULL;
1525 char *share_name = NULL;
1526 char *comment = NULL;
1527 const char *pathname = NULL;
1532 struct security_descriptor *psd = NULL;
1533 bool is_disk_op = False;
1534 int max_connections = 0;
1535 TALLOC_CTX *ctx = p->mem_ctx;
1536 union srvsvc_NetShareInfo *info = r->in.info;
1538 DEBUG(5,("_srvsvc_NetShareSetInfo: %d\n", __LINE__));
1540 if (!r->in.share_name) {
1541 return WERR_INVALID_NAME;
1544 if (r->out.parm_error) {
1545 *r->out.parm_error = 0;
1548 if ( strequal(r->in.share_name,"IPC$")
1549 || ( lp_enable_asu_support() && strequal(r->in.share_name,"ADMIN$") )
1550 || strequal(r->in.share_name,"global") )
1552 DEBUG(5,("_srvsvc_NetShareSetInfo: share %s cannot be "
1553 "modified by a remote user.\n",
1554 r->in.share_name ));
1555 return WERR_ACCESS_DENIED;
1558 snum = find_service(talloc_tos(), r->in.share_name, &share_name);
1563 /* Does this share exist ? */
1565 return WERR_NET_NAME_NOT_FOUND;
1567 /* No change to printer shares. */
1568 if (lp_print_ok(snum))
1569 return WERR_ACCESS_DENIED;
1571 is_disk_op = security_token_has_privilege(p->session_info->security_token, SEC_PRIV_DISK_OPERATOR);
1573 /* fail out now if you are not root and not a disk op */
1575 if ( p->session_info->unix_token->uid != sec_initial_uid() && !is_disk_op ) {
1576 DEBUG(2,("_srvsvc_NetShareSetInfo: uid %u doesn't have the "
1577 "SeDiskOperatorPrivilege privilege needed to modify "
1579 (unsigned int)p->session_info->unix_token->uid,
1581 return WERR_ACCESS_DENIED;
1584 switch (r->in.level) {
1586 pathname = talloc_strdup(ctx, lp_pathname(snum));
1587 comment = talloc_strdup(ctx, info->info1->comment);
1588 type = info->info1->type;
1592 comment = talloc_strdup(ctx, info->info2->comment);
1593 pathname = info->info2->path;
1594 type = info->info2->type;
1595 max_connections = (info->info2->max_users == (uint32_t)-1) ?
1596 0 : info->info2->max_users;
1600 /* not supported on set but here for completeness */
1602 comment = talloc_strdup(ctx, info->info501->comment);
1603 type = info->info501->type;
1608 comment = talloc_strdup(ctx, info->info502->comment);
1609 pathname = info->info502->path;
1610 type = info->info502->type;
1611 psd = info->info502->sd_buf.sd;
1612 map_generic_share_sd_bits(psd);
1615 pathname = talloc_strdup(ctx, lp_pathname(snum));
1616 comment = talloc_strdup(ctx, info->info1004->comment);
1617 type = STYPE_DISKTREE;
1620 /* XP re-sets the csc policy even if it wasn't changed by the
1621 user, so we must compare it to see if it's what is set in
1622 smb.conf, so that we can contine other ops like setting
1624 if (((info->info1005->dfs_flags &
1625 SHARE_1005_CSC_POLICY_MASK) >>
1626 SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum))
1629 DEBUG(3, ("_srvsvc_NetShareSetInfo: client is trying to change csc policy from the network; must be done with smb.conf\n"));
1630 return WERR_ACCESS_DENIED;
1634 return WERR_ACCESS_DENIED;
1636 pathname = talloc_strdup(ctx, lp_pathname(snum));
1637 comment = talloc_strdup(ctx, lp_comment(snum));
1638 psd = info->info1501->sd;
1639 map_generic_share_sd_bits(psd);
1640 type = STYPE_DISKTREE;
1643 DEBUG(5,("_srvsvc_NetShareSetInfo: unsupported switch value %d\n",
1645 return WERR_UNKNOWN_LEVEL;
1648 /* We can only modify disk shares. */
1649 if (type != STYPE_DISKTREE) {
1650 DEBUG(5,("_srvsvc_NetShareSetInfo: share %s is not a "
1653 return WERR_ACCESS_DENIED;
1656 if (comment == NULL) {
1660 /* Check if the pathname is valid. */
1661 if (!(path = valid_share_pathname(p->mem_ctx, pathname ))) {
1662 DEBUG(5,("_srvsvc_NetShareSetInfo: invalid pathname %s\n",
1664 return WERR_OBJECT_PATH_INVALID;
1667 /* Ensure share name, pathname and comment don't contain '"' characters. */
1668 string_replace(share_name, '"', ' ');
1669 string_replace(path, '"', ' ');
1670 string_replace(comment, '"', ' ');
1672 DEBUG(10,("_srvsvc_NetShareSetInfo: change share command = %s\n",
1673 lp_change_share_cmd() ? lp_change_share_cmd() : "NULL" ));
1675 /* Only call modify function if something changed. */
1677 if (strcmp(path, lp_pathname(snum)) || strcmp(comment, lp_comment(snum))
1678 || (lp_max_connections(snum) != max_connections)) {
1679 if (!lp_change_share_cmd() || !*lp_change_share_cmd()) {
1680 DEBUG(10,("_srvsvc_NetShareSetInfo: No change share command\n"));
1681 return WERR_ACCESS_DENIED;
1684 command = talloc_asprintf(p->mem_ctx,
1685 "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1686 lp_change_share_cmd(),
1687 get_dyn_CONFIGFILE(),
1690 comment ? comment : "",
1696 DEBUG(10,("_srvsvc_NetShareSetInfo: Running [%s]\n", command ));
1698 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1703 if ( (ret = smbrun(command, NULL)) == 0 ) {
1704 /* Tell everyone we updated smb.conf. */
1705 message_send_all(p->msg_ctx, MSG_SMB_CONF_UPDATED,
1712 /********* END SeDiskOperatorPrivilege BLOCK *********/
1714 DEBUG(3,("_srvsvc_NetShareSetInfo: Running [%s] returned (%d)\n",
1717 TALLOC_FREE(command);
1720 return WERR_ACCESS_DENIED;
1722 DEBUG(10,("_srvsvc_NetShareSetInfo: No change to share name (%s)\n",
1726 /* Replace SD if changed. */
1728 struct security_descriptor *old_sd;
1731 old_sd = get_share_security(p->mem_ctx, lp_servicename(snum), &sd_size);
1733 if (old_sd && !security_descriptor_equal(old_sd, psd)) {
1734 if (!set_share_security(share_name, psd))
1735 DEBUG(0,("_srvsvc_NetShareSetInfo: Failed to change security info in share %s.\n",
1740 DEBUG(5,("_srvsvc_NetShareSetInfo: %d\n", __LINE__));
1745 /*******************************************************************
1746 _srvsvc_NetShareAdd.
1747 Call 'add_share_command "sharename" "pathname"
1748 "comment" "max connections = "
1749 ********************************************************************/
1751 WERROR _srvsvc_NetShareAdd(struct pipes_struct *p,
1752 struct srvsvc_NetShareAdd *r)
1754 char *command = NULL;
1755 char *share_name_in = NULL;
1756 char *share_name = NULL;
1757 char *comment = NULL;
1758 char *pathname = NULL;
1763 struct security_descriptor *psd = NULL;
1765 int max_connections = 0;
1766 TALLOC_CTX *ctx = p->mem_ctx;
1768 DEBUG(5,("_srvsvc_NetShareAdd: %d\n", __LINE__));
1770 if (r->out.parm_error) {
1771 *r->out.parm_error = 0;
1774 is_disk_op = security_token_has_privilege(p->session_info->security_token, SEC_PRIV_DISK_OPERATOR);
1776 if (p->session_info->unix_token->uid != sec_initial_uid() && !is_disk_op )
1777 return WERR_ACCESS_DENIED;
1779 if (!lp_add_share_cmd() || !*lp_add_share_cmd()) {
1780 DEBUG(10,("_srvsvc_NetShareAdd: No add share command\n"));
1781 return WERR_ACCESS_DENIED;
1784 switch (r->in.level) {
1786 /* No path. Not enough info in a level 0 to do anything. */
1787 return WERR_ACCESS_DENIED;
1789 /* Not enough info in a level 1 to do anything. */
1790 return WERR_ACCESS_DENIED;
1792 share_name_in = talloc_strdup(ctx, r->in.info->info2->name);
1793 comment = talloc_strdup(ctx, r->in.info->info2->comment);
1794 pathname = talloc_strdup(ctx, r->in.info->info2->path);
1795 max_connections = (r->in.info->info2->max_users == (uint32_t)-1) ?
1796 0 : r->in.info->info2->max_users;
1797 type = r->in.info->info2->type;
1800 /* No path. Not enough info in a level 501 to do anything. */
1801 return WERR_ACCESS_DENIED;
1803 share_name_in = talloc_strdup(ctx, r->in.info->info502->name);
1804 comment = talloc_strdup(ctx, r->in.info->info502->comment);
1805 pathname = talloc_strdup(ctx, r->in.info->info502->path);
1806 max_connections = (r->in.info->info502->max_users == (uint32_t)-1) ?
1807 0 : r->in.info->info502->max_users;
1808 type = r->in.info->info502->type;
1809 psd = r->in.info->info502->sd_buf.sd;
1810 map_generic_share_sd_bits(psd);
1813 /* none of the following contain share names. NetShareAdd does not have a separate parameter for the share name */
1819 return WERR_ACCESS_DENIED;
1821 /* DFS only level. */
1822 return WERR_ACCESS_DENIED;
1824 DEBUG(5,("_srvsvc_NetShareAdd: unsupported switch value %d\n",
1826 return WERR_UNKNOWN_LEVEL;
1829 /* check for invalid share names */
1831 if (!share_name_in || !validate_net_name(share_name_in,
1832 INVALID_SHARENAME_CHARS,
1833 strlen(share_name_in))) {
1834 DEBUG(5,("_srvsvc_NetShareAdd: Bad sharename \"%s\"\n",
1835 share_name_in ? share_name_in : ""));
1836 return WERR_INVALID_NAME;
1839 if (strequal(share_name_in,"IPC$") || strequal(share_name_in,"global")
1840 || (lp_enable_asu_support() &&
1841 strequal(share_name_in,"ADMIN$"))) {
1842 return WERR_ACCESS_DENIED;
1845 snum = find_service(ctx, share_name_in, &share_name);
1850 /* Share already exists. */
1852 return WERR_FILE_EXISTS;
1855 /* We can only add disk shares. */
1856 if (type != STYPE_DISKTREE) {
1857 return WERR_ACCESS_DENIED;
1860 /* Check if the pathname is valid. */
1861 if (!(path = valid_share_pathname(p->mem_ctx, pathname))) {
1862 return WERR_OBJECT_PATH_INVALID;
1865 /* Ensure share name, pathname and comment don't contain '"' characters. */
1866 string_replace(share_name_in, '"', ' ');
1867 string_replace(share_name, '"', ' ');
1868 string_replace(path, '"', ' ');
1870 string_replace(comment, '"', ' ');
1873 command = talloc_asprintf(ctx,
1874 "%s \"%s\" \"%s\" \"%s\" \"%s\" %d",
1876 get_dyn_CONFIGFILE(),
1879 comment ? comment : "",
1885 DEBUG(10,("_srvsvc_NetShareAdd: Running [%s]\n", command ));
1887 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
1892 /* FIXME: use libnetconf here - gd */
1894 if ( (ret = smbrun(command, NULL)) == 0 ) {
1895 /* Tell everyone we updated smb.conf. */
1896 message_send_all(p->msg_ctx, MSG_SMB_CONF_UPDATED, NULL, 0,
1903 /********* END SeDiskOperatorPrivilege BLOCK *********/
1905 DEBUG(3,("_srvsvc_NetShareAdd: Running [%s] returned (%d)\n",
1908 TALLOC_FREE(command);
1911 return WERR_ACCESS_DENIED;
1914 /* Note we use share_name here, not share_name_in as
1915 we need a canonicalized name for setting security. */
1916 if (!set_share_security(share_name, psd)) {
1917 DEBUG(0,("_srvsvc_NetShareAdd: Failed to add security info to share %s.\n",
1923 * We don't call reload_services() here, the message will
1924 * cause this to be done before the next packet is read
1925 * from the client. JRA.
1928 DEBUG(5,("_srvsvc_NetShareAdd: %d\n", __LINE__));
1933 /*******************************************************************
1935 Call "delete share command" with the share name as
1937 ********************************************************************/
1939 WERROR _srvsvc_NetShareDel(struct pipes_struct *p,
1940 struct srvsvc_NetShareDel *r)
1942 char *command = NULL;
1943 char *share_name = NULL;
1947 struct share_params *params;
1948 TALLOC_CTX *ctx = p->mem_ctx;
1950 DEBUG(5,("_srvsvc_NetShareDel: %d\n", __LINE__));
1952 if (!r->in.share_name) {
1953 return WERR_NET_NAME_NOT_FOUND;
1956 if ( strequal(r->in.share_name,"IPC$")
1957 || ( lp_enable_asu_support() && strequal(r->in.share_name,"ADMIN$") )
1958 || strequal(r->in.share_name,"global") )
1960 return WERR_ACCESS_DENIED;
1963 snum = find_service(talloc_tos(), r->in.share_name, &share_name);
1969 return WERR_NO_SUCH_SHARE;
1972 if (!(params = get_share_params(p->mem_ctx, share_name))) {
1973 return WERR_NO_SUCH_SHARE;
1976 /* No change to printer shares. */
1977 if (lp_print_ok(snum))
1978 return WERR_ACCESS_DENIED;
1980 is_disk_op = security_token_has_privilege(p->session_info->security_token, SEC_PRIV_DISK_OPERATOR);
1982 if (p->session_info->unix_token->uid != sec_initial_uid() && !is_disk_op )
1983 return WERR_ACCESS_DENIED;
1985 if (!lp_delete_share_cmd() || !*lp_delete_share_cmd()) {
1986 DEBUG(10,("_srvsvc_NetShareDel: No delete share command\n"));
1987 return WERR_ACCESS_DENIED;
1990 command = talloc_asprintf(ctx,
1992 lp_delete_share_cmd(),
1993 get_dyn_CONFIGFILE(),
1994 lp_servicename(snum));
1999 DEBUG(10,("_srvsvc_NetShareDel: Running [%s]\n", command ));
2001 /********* BEGIN SeDiskOperatorPrivilege BLOCK *********/
2006 if ( (ret = smbrun(command, NULL)) == 0 ) {
2007 /* Tell everyone we updated smb.conf. */
2008 message_send_all(p->msg_ctx, MSG_SMB_CONF_UPDATED, NULL, 0,
2015 /********* END SeDiskOperatorPrivilege BLOCK *********/
2017 DEBUG(3,("_srvsvc_NetShareDel: Running [%s] returned (%d)\n", command, ret ));
2020 return WERR_ACCESS_DENIED;
2022 /* Delete the SD in the database. */
2023 delete_share_security(lp_servicename(params->service));
2025 lp_killservice(params->service);
2030 /*******************************************************************
2031 _srvsvc_NetShareDelSticky
2032 ********************************************************************/
2034 WERROR _srvsvc_NetShareDelSticky(struct pipes_struct *p,
2035 struct srvsvc_NetShareDelSticky *r)
2037 struct srvsvc_NetShareDel q;
2039 DEBUG(5,("_srvsvc_NetShareDelSticky: %d\n", __LINE__));
2041 q.in.server_unc = r->in.server_unc;
2042 q.in.share_name = r->in.share_name;
2043 q.in.reserved = r->in.reserved;
2045 return _srvsvc_NetShareDel(p, &q);
2048 /*******************************************************************
2049 _srvsvc_NetRemoteTOD
2050 ********************************************************************/
2052 WERROR _srvsvc_NetRemoteTOD(struct pipes_struct *p,
2053 struct srvsvc_NetRemoteTOD *r)
2055 struct srvsvc_NetRemoteTODInfo *tod;
2057 time_t unixdate = time(NULL);
2059 /* We do this call first as if we do it *after* the gmtime call
2060 it overwrites the pointed-to values. JRA */
2062 uint32 zone = get_time_zone(unixdate)/60;
2064 DEBUG(5,("_srvsvc_NetRemoteTOD: %d\n", __LINE__));
2066 if ( !(tod = talloc_zero(p->mem_ctx, struct srvsvc_NetRemoteTODInfo)) )
2071 DEBUG(5,("_srvsvc_NetRemoteTOD: %d\n", __LINE__));
2073 t = gmtime(&unixdate);
2076 tod->elapsed = unixdate;
2078 tod->hours = t->tm_hour;
2079 tod->mins = t->tm_min;
2080 tod->secs = t->tm_sec;
2082 tod->timezone = zone;
2083 tod->tinterval = 10000;
2084 tod->day = t->tm_mday;
2085 tod->month = t->tm_mon + 1;
2086 tod->year = 1900+t->tm_year;
2087 tod->weekday = t->tm_wday;
2089 DEBUG(5,("_srvsvc_NetRemoteTOD: %d\n", __LINE__));
2094 /***********************************************************************************
2095 _srvsvc_NetGetFileSecurity
2096 Win9x NT tools get security descriptor.
2097 ***********************************************************************************/
2099 WERROR _srvsvc_NetGetFileSecurity(struct pipes_struct *p,
2100 struct srvsvc_NetGetFileSecurity *r)
2102 struct smb_filename *smb_fname = NULL;
2103 struct security_descriptor *psd = NULL;
2105 char *servicename = NULL;
2109 connection_struct *conn = NULL;
2110 struct sec_desc_buf *sd_buf = NULL;
2111 files_struct *fsp = NULL;
2113 char *oldcwd = NULL;
2118 werr = WERR_NET_NAME_NOT_FOUND;
2121 snum = find_service(talloc_tos(), r->in.share, &servicename);
2127 DEBUG(10, ("Could not find service %s\n", servicename));
2128 werr = WERR_NET_NAME_NOT_FOUND;
2132 nt_status = create_conn_struct(talloc_tos(), &conn, snum,
2133 lp_pathname(snum), p->session_info,
2135 if (!NT_STATUS_IS_OK(nt_status)) {
2136 DEBUG(10, ("create_conn_struct failed: %s\n",
2137 nt_errstr(nt_status)));
2138 werr = ntstatus_to_werror(nt_status);
2142 nt_status = filename_convert(talloc_tos(),
2149 if (!NT_STATUS_IS_OK(nt_status)) {
2150 werr = ntstatus_to_werror(nt_status);
2154 nt_status = SMB_VFS_CREATE_FILE(
2157 0, /* root_dir_fid */
2158 smb_fname, /* fname */
2159 FILE_READ_ATTRIBUTES, /* access_mask */
2160 FILE_SHARE_READ|FILE_SHARE_WRITE, /* share_access */
2161 FILE_OPEN, /* create_disposition*/
2162 0, /* create_options */
2163 0, /* file_attributes */
2164 INTERNAL_OPEN_ONLY, /* oplock_request */
2165 0, /* allocation_size */
2166 0, /* private_flags */
2172 if (!NT_STATUS_IS_OK(nt_status)) {
2173 DEBUG(3,("_srvsvc_NetGetFileSecurity: can't open %s\n",
2174 smb_fname_str_dbg(smb_fname)));
2175 werr = ntstatus_to_werror(nt_status);
2179 nt_status = SMB_VFS_FGET_NT_ACL(fsp,
2182 |SECINFO_DACL), &psd);
2184 if (!NT_STATUS_IS_OK(nt_status)) {
2185 DEBUG(3,("_srvsvc_NetGetFileSecurity: Unable to get NT ACL "
2186 "for file %s\n", smb_fname_str_dbg(smb_fname)));
2187 werr = ntstatus_to_werror(nt_status);
2191 sd_size = ndr_size_security_descriptor(psd, 0);
2193 sd_buf = talloc_zero(p->mem_ctx, struct sec_desc_buf);
2199 sd_buf->sd_size = sd_size;
2202 *r->out.sd_buf = sd_buf;
2204 psd->dacl->revision = NT4_ACL_REVISION;
2206 close_file(NULL, fsp, NORMAL_CLOSE);
2207 vfs_ChDir(conn, oldcwd);
2208 SMB_VFS_DISCONNECT(conn);
2216 close_file(NULL, fsp, NORMAL_CLOSE);
2220 vfs_ChDir(conn, oldcwd);
2224 SMB_VFS_DISCONNECT(conn);
2229 TALLOC_FREE(smb_fname);
2234 /***********************************************************************************
2235 _srvsvc_NetSetFileSecurity
2236 Win9x NT tools set security descriptor.
2237 ***********************************************************************************/
2239 WERROR _srvsvc_NetSetFileSecurity(struct pipes_struct *p,
2240 struct srvsvc_NetSetFileSecurity *r)
2242 struct smb_filename *smb_fname = NULL;
2243 char *servicename = NULL;
2244 files_struct *fsp = NULL;
2248 connection_struct *conn = NULL;
2250 char *oldcwd = NULL;
2251 struct security_descriptor *psd = NULL;
2252 uint32_t security_info_sent = 0;
2257 werr = WERR_NET_NAME_NOT_FOUND;
2261 snum = find_service(talloc_tos(), r->in.share, &servicename);
2268 DEBUG(10, ("Could not find service %s\n", servicename));
2269 werr = WERR_NET_NAME_NOT_FOUND;
2273 nt_status = create_conn_struct(talloc_tos(), &conn, snum,
2274 lp_pathname(snum), p->session_info,
2276 if (!NT_STATUS_IS_OK(nt_status)) {
2277 DEBUG(10, ("create_conn_struct failed: %s\n",
2278 nt_errstr(nt_status)));
2279 werr = ntstatus_to_werror(nt_status);
2283 nt_status = filename_convert(talloc_tos(),
2290 if (!NT_STATUS_IS_OK(nt_status)) {
2291 werr = ntstatus_to_werror(nt_status);
2295 nt_status = SMB_VFS_CREATE_FILE(
2298 0, /* root_dir_fid */
2299 smb_fname, /* fname */
2300 FILE_WRITE_ATTRIBUTES, /* access_mask */
2301 FILE_SHARE_READ|FILE_SHARE_WRITE, /* share_access */
2302 FILE_OPEN, /* create_disposition*/
2303 0, /* create_options */
2304 0, /* file_attributes */
2305 INTERNAL_OPEN_ONLY, /* oplock_request */
2306 0, /* allocation_size */
2307 0, /* private_flags */
2313 if (!NT_STATUS_IS_OK(nt_status)) {
2314 DEBUG(3,("_srvsvc_NetSetFileSecurity: can't open %s\n",
2315 smb_fname_str_dbg(smb_fname)));
2316 werr = ntstatus_to_werror(nt_status);
2320 psd = r->in.sd_buf->sd;
2321 security_info_sent = r->in.securityinformation;
2323 if (psd->owner_sid==0) {
2324 security_info_sent &= ~SECINFO_OWNER;
2326 if (psd->group_sid==0) {
2327 security_info_sent &= ~SECINFO_GROUP;
2330 security_info_sent &= ~SECINFO_SACL;
2333 security_info_sent &= ~SECINFO_DACL;
2336 /* Convert all the generic bits. */
2337 security_acl_map_generic(psd->dacl, &file_generic_mapping);
2338 security_acl_map_generic(psd->sacl, &file_generic_mapping);
2340 nt_status = SMB_VFS_FSET_NT_ACL(fsp,
2344 if (!NT_STATUS_IS_OK(nt_status) ) {
2345 DEBUG(3,("_srvsvc_NetSetFileSecurity: Unable to set NT ACL "
2346 "on file %s\n", r->in.share));
2347 werr = WERR_ACCESS_DENIED;
2351 close_file(NULL, fsp, NORMAL_CLOSE);
2352 vfs_ChDir(conn, oldcwd);
2353 SMB_VFS_DISCONNECT(conn);
2361 close_file(NULL, fsp, NORMAL_CLOSE);
2365 vfs_ChDir(conn, oldcwd);
2369 SMB_VFS_DISCONNECT(conn);
2374 TALLOC_FREE(smb_fname);
2379 /***********************************************************************************
2380 It may be that we want to limit users to creating shares on certain areas of the UNIX file area.
2381 We could define areas by mapping Windows style disks to points on the UNIX directory hierarchy.
2382 These disks would the disks listed by this function.
2383 Users could then create shares relative to these disks. Watch out for moving these disks around.
2384 "Nigel Williams" <nigel@veritas.com>.
2385 ***********************************************************************************/
2387 static const char *server_disks[] = {"C:"};
2389 static uint32 get_server_disk_count(void)
2391 return sizeof(server_disks)/sizeof(server_disks[0]);
2394 static uint32 init_server_disk_enum(uint32 *resume)
2396 uint32 server_disk_count = get_server_disk_count();
2398 /*resume can be an offset into the list for now*/
2400 if(*resume & 0x80000000)
2403 if(*resume > server_disk_count)
2404 *resume = server_disk_count;
2406 return server_disk_count - *resume;
2409 static const char *next_server_disk_enum(uint32 *resume)
2413 if(init_server_disk_enum(resume) == 0)
2416 disk = server_disks[*resume];
2420 DEBUG(10, ("next_server_disk_enum: reporting disk %s. resume handle %d.\n", disk, *resume));
2425 /********************************************************************
2427 ********************************************************************/
2429 WERROR _srvsvc_NetDiskEnum(struct pipes_struct *p,
2430 struct srvsvc_NetDiskEnum *r)
2433 const char *disk_name;
2434 TALLOC_CTX *ctx = p->mem_ctx;
2436 uint32_t resume = r->in.resume_handle ? *r->in.resume_handle : 0;
2440 *r->out.totalentries = init_server_disk_enum(&resume);
2442 r->out.info->disks = talloc_zero_array(ctx, struct srvsvc_NetDiskInfo0,
2443 MAX_SERVER_DISK_ENTRIES);
2444 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks);
2446 /*allow one struct srvsvc_NetDiskInfo0 for null terminator*/
2448 r->out.info->count = 0;
2450 for(i = 0; i < MAX_SERVER_DISK_ENTRIES -1 && (disk_name = next_server_disk_enum(&resume)); i++) {
2452 r->out.info->count++;
2454 /*copy disk name into a unicode string*/
2456 r->out.info->disks[i].disk = talloc_strdup(ctx, disk_name);
2457 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[i].disk);
2460 /* add a terminating null string. Is this there if there is more data to come? */
2462 r->out.info->count++;
2464 r->out.info->disks[i].disk = talloc_strdup(ctx, "");
2465 W_ERROR_HAVE_NO_MEMORY(r->out.info->disks[i].disk);
2467 if (r->out.resume_handle) {
2468 *r->out.resume_handle = resume;
2474 /********************************************************************
2475 _srvsvc_NetNameValidate
2476 ********************************************************************/
2478 WERROR _srvsvc_NetNameValidate(struct pipes_struct *p,
2479 struct srvsvc_NetNameValidate *r)
2481 switch (r->in.name_type) {
2483 if (!validate_net_name(r->in.name, INVALID_SHARENAME_CHARS,
2484 strlen_m(r->in.name)))
2486 DEBUG(5,("_srvsvc_NetNameValidate: Bad sharename \"%s\"\n",
2488 return WERR_INVALID_NAME;
2493 return WERR_UNKNOWN_LEVEL;
2499 /*******************************************************************
2500 ********************************************************************/
2502 struct enum_file_close_state {
2503 struct srvsvc_NetFileClose *r;
2504 struct messaging_context *msg_ctx;
2507 static void enum_file_close_fn( const struct share_mode_entry *e,
2508 const char *sharepath, const char *fname,
2509 void *private_data )
2511 char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
2512 struct enum_file_close_state *state =
2513 (struct enum_file_close_state *)private_data;
2514 uint32_t fid = (((uint32_t)(procid_to_pid(&e->pid))<<16) | e->share_file_id);
2516 if (fid != state->r->in.fid) {
2517 return; /* Not this file. */
2520 if (!process_exists(e->pid) ) {
2524 /* Ok - send the close message. */
2525 DEBUG(10,("enum_file_close_fn: request to close file %s, %s\n",
2527 share_mode_str(talloc_tos(), 0, e) ));
2529 share_mode_entry_to_message(msg, e);
2531 state->r->out.result = ntstatus_to_werror(
2532 messaging_send_buf(state->msg_ctx,
2533 e->pid, MSG_SMB_CLOSE_FILE,
2535 MSG_SMB_SHARE_MODE_ENTRY_SIZE));
2538 /********************************************************************
2539 Close a file given a 32-bit file id.
2540 ********************************************************************/
2542 WERROR _srvsvc_NetFileClose(struct pipes_struct *p,
2543 struct srvsvc_NetFileClose *r)
2545 struct enum_file_close_state state;
2548 DEBUG(5,("_srvsvc_NetFileClose: %d\n", __LINE__));
2550 is_disk_op = security_token_has_privilege(p->session_info->security_token, SEC_PRIV_DISK_OPERATOR);
2552 if (p->session_info->unix_token->uid != sec_initial_uid() && !is_disk_op) {
2553 return WERR_ACCESS_DENIED;
2556 /* enum_file_close_fn sends the close message to
2557 * the relevent smbd process. */
2559 r->out.result = WERR_BADFILE;
2561 state.msg_ctx = p->msg_ctx;
2562 share_mode_forall(enum_file_close_fn, &state);
2563 return r->out.result;
2566 /********************************************************************
2567 ********************************************************************/
2569 WERROR _srvsvc_NetCharDevEnum(struct pipes_struct *p,
2570 struct srvsvc_NetCharDevEnum *r)
2572 p->rng_fault_state = True;
2573 return WERR_NOT_SUPPORTED;
2576 WERROR _srvsvc_NetCharDevGetInfo(struct pipes_struct *p,
2577 struct srvsvc_NetCharDevGetInfo *r)
2579 p->rng_fault_state = True;
2580 return WERR_NOT_SUPPORTED;
2583 WERROR _srvsvc_NetCharDevControl(struct pipes_struct *p,
2584 struct srvsvc_NetCharDevControl *r)
2586 p->rng_fault_state = True;
2587 return WERR_NOT_SUPPORTED;
2590 WERROR _srvsvc_NetCharDevQEnum(struct pipes_struct *p,
2591 struct srvsvc_NetCharDevQEnum *r)
2593 p->rng_fault_state = True;
2594 return WERR_NOT_SUPPORTED;
2597 WERROR _srvsvc_NetCharDevQGetInfo(struct pipes_struct *p,
2598 struct srvsvc_NetCharDevQGetInfo *r)
2600 p->rng_fault_state = True;
2601 return WERR_NOT_SUPPORTED;
2604 WERROR _srvsvc_NetCharDevQSetInfo(struct pipes_struct *p,
2605 struct srvsvc_NetCharDevQSetInfo *r)
2607 p->rng_fault_state = True;
2608 return WERR_NOT_SUPPORTED;
2611 WERROR _srvsvc_NetCharDevQPurge(struct pipes_struct *p,
2612 struct srvsvc_NetCharDevQPurge *r)
2614 p->rng_fault_state = True;
2615 return WERR_NOT_SUPPORTED;
2618 WERROR _srvsvc_NetCharDevQPurgeSelf(struct pipes_struct *p,
2619 struct srvsvc_NetCharDevQPurgeSelf *r)
2621 p->rng_fault_state = True;
2622 return WERR_NOT_SUPPORTED;
2625 WERROR _srvsvc_NetFileGetInfo(struct pipes_struct *p,
2626 struct srvsvc_NetFileGetInfo *r)
2628 p->rng_fault_state = True;
2629 return WERR_NOT_SUPPORTED;
2632 WERROR _srvsvc_NetShareCheck(struct pipes_struct *p,
2633 struct srvsvc_NetShareCheck *r)
2635 p->rng_fault_state = True;
2636 return WERR_NOT_SUPPORTED;
2639 WERROR _srvsvc_NetServerStatisticsGet(struct pipes_struct *p,
2640 struct srvsvc_NetServerStatisticsGet *r)
2642 p->rng_fault_state = True;
2643 return WERR_NOT_SUPPORTED;
2646 WERROR _srvsvc_NetTransportAdd(struct pipes_struct *p,
2647 struct srvsvc_NetTransportAdd *r)
2649 p->rng_fault_state = True;
2650 return WERR_NOT_SUPPORTED;
2653 WERROR _srvsvc_NetTransportEnum(struct pipes_struct *p,
2654 struct srvsvc_NetTransportEnum *r)
2656 p->rng_fault_state = True;
2657 return WERR_NOT_SUPPORTED;
2660 WERROR _srvsvc_NetTransportDel(struct pipes_struct *p,
2661 struct srvsvc_NetTransportDel *r)
2663 p->rng_fault_state = True;
2664 return WERR_NOT_SUPPORTED;
2667 WERROR _srvsvc_NetSetServiceBits(struct pipes_struct *p,
2668 struct srvsvc_NetSetServiceBits *r)
2670 p->rng_fault_state = True;
2671 return WERR_NOT_SUPPORTED;
2674 WERROR _srvsvc_NetPathType(struct pipes_struct *p,
2675 struct srvsvc_NetPathType *r)
2677 p->rng_fault_state = True;
2678 return WERR_NOT_SUPPORTED;
2681 WERROR _srvsvc_NetPathCanonicalize(struct pipes_struct *p,
2682 struct srvsvc_NetPathCanonicalize *r)
2684 p->rng_fault_state = True;
2685 return WERR_NOT_SUPPORTED;
2688 WERROR _srvsvc_NetPathCompare(struct pipes_struct *p,
2689 struct srvsvc_NetPathCompare *r)
2691 p->rng_fault_state = True;
2692 return WERR_NOT_SUPPORTED;
2695 WERROR _srvsvc_NETRPRNAMECANONICALIZE(struct pipes_struct *p,
2696 struct srvsvc_NETRPRNAMECANONICALIZE *r)
2698 p->rng_fault_state = True;
2699 return WERR_NOT_SUPPORTED;
2702 WERROR _srvsvc_NetPRNameCompare(struct pipes_struct *p,
2703 struct srvsvc_NetPRNameCompare *r)
2705 p->rng_fault_state = True;
2706 return WERR_NOT_SUPPORTED;
2709 WERROR _srvsvc_NetShareDelStart(struct pipes_struct *p,
2710 struct srvsvc_NetShareDelStart *r)
2712 p->rng_fault_state = True;
2713 return WERR_NOT_SUPPORTED;
2716 WERROR _srvsvc_NetShareDelCommit(struct pipes_struct *p,
2717 struct srvsvc_NetShareDelCommit *r)
2719 p->rng_fault_state = True;
2720 return WERR_NOT_SUPPORTED;
2723 WERROR _srvsvc_NetServerTransportAddEx(struct pipes_struct *p,
2724 struct srvsvc_NetServerTransportAddEx *r)
2726 p->rng_fault_state = True;
2727 return WERR_NOT_SUPPORTED;
2730 WERROR _srvsvc_NetServerSetServiceBitsEx(struct pipes_struct *p,
2731 struct srvsvc_NetServerSetServiceBitsEx *r)
2733 p->rng_fault_state = True;
2734 return WERR_NOT_SUPPORTED;
2737 WERROR _srvsvc_NETRDFSGETVERSION(struct pipes_struct *p,
2738 struct srvsvc_NETRDFSGETVERSION *r)
2740 p->rng_fault_state = True;
2741 return WERR_NOT_SUPPORTED;
2744 WERROR _srvsvc_NETRDFSCREATELOCALPARTITION(struct pipes_struct *p,
2745 struct srvsvc_NETRDFSCREATELOCALPARTITION *r)
2747 p->rng_fault_state = True;
2748 return WERR_NOT_SUPPORTED;
2751 WERROR _srvsvc_NETRDFSDELETELOCALPARTITION(struct pipes_struct *p,
2752 struct srvsvc_NETRDFSDELETELOCALPARTITION *r)
2754 p->rng_fault_state = True;
2755 return WERR_NOT_SUPPORTED;
2758 WERROR _srvsvc_NETRDFSSETLOCALVOLUMESTATE(struct pipes_struct *p,
2759 struct srvsvc_NETRDFSSETLOCALVOLUMESTATE *r)
2761 p->rng_fault_state = True;
2762 return WERR_NOT_SUPPORTED;
2765 WERROR _srvsvc_NETRDFSSETSERVERINFO(struct pipes_struct *p,
2766 struct srvsvc_NETRDFSSETSERVERINFO *r)
2768 p->rng_fault_state = True;
2769 return WERR_NOT_SUPPORTED;
2772 WERROR _srvsvc_NETRDFSCREATEEXITPOINT(struct pipes_struct *p,
2773 struct srvsvc_NETRDFSCREATEEXITPOINT *r)
2775 p->rng_fault_state = True;
2776 return WERR_NOT_SUPPORTED;
2779 WERROR _srvsvc_NETRDFSDELETEEXITPOINT(struct pipes_struct *p,
2780 struct srvsvc_NETRDFSDELETEEXITPOINT *r)
2782 p->rng_fault_state = True;
2783 return WERR_NOT_SUPPORTED;
2786 WERROR _srvsvc_NETRDFSMODIFYPREFIX(struct pipes_struct *p,
2787 struct srvsvc_NETRDFSMODIFYPREFIX *r)
2789 p->rng_fault_state = True;
2790 return WERR_NOT_SUPPORTED;
2793 WERROR _srvsvc_NETRDFSFIXLOCALVOLUME(struct pipes_struct *p,
2794 struct srvsvc_NETRDFSFIXLOCALVOLUME *r)
2796 p->rng_fault_state = True;
2797 return WERR_NOT_SUPPORTED;
2800 WERROR _srvsvc_NETRDFSMANAGERREPORTSITEINFO(struct pipes_struct *p,
2801 struct srvsvc_NETRDFSMANAGERREPORTSITEINFO *r)
2803 p->rng_fault_state = True;
2804 return WERR_NOT_SUPPORTED;
2807 WERROR _srvsvc_NETRSERVERTRANSPORTDELEX(struct pipes_struct *p,
2808 struct srvsvc_NETRSERVERTRANSPORTDELEX *r)
2810 p->rng_fault_state = True;
2811 return WERR_NOT_SUPPORTED;