Add variable to define if a share should be hidden.
authorAndreas Schneider <anschneider@suse.de>
Fri, 22 Feb 2008 16:35:53 +0000 (17:35 +0100)
committerVolker Lendecke <vl@samba.org>
Tue, 26 Feb 2008 20:34:05 +0000 (21:34 +0100)
If you create a share on a Windows machine called foo$ then this share is
of the type STYPE_DISKTREE. So it is possible to administrate this kind of
share. Tested on Windows NT and 2003.

In samba we assume that if a share with a $ at the end must be of the type
STYPE_DISKTREE_HIDDEN. This is wrong, so we need a variable in the config
to define if the share should be hidden or not.

source/param/loadparm.c
source/rpc_server/srv_srvsvc_nt.c

index 86446d5b75f73c91759aaeeb0d90155a44073c24..79c522f77cd647ffc4c408c80901026ddcd5c357 100644 (file)
@@ -420,6 +420,7 @@ typedef struct {
        bool bRead_only;
        bool bNo_set_dir;
        bool bGuest_only;
+       bool bHidden;
        bool bGuest_ok;
        bool bPrint_ok;
        bool bMap_system;
@@ -562,6 +563,7 @@ static service sDefault = {
        True,                   /* bRead_only */
        True,                   /* bNo_set_dir */
        False,                  /* bGuest_only */
+       False,                  /* bHidden */
        False,                  /* bGuest_ok */
        False,                  /* bPrint_ok */
        False,                  /* bMap_system */
@@ -971,6 +973,7 @@ static struct parm_struct parm_table[] = {
        {"inherit owner", P_BOOL, P_LOCAL, &sDefault.bInheritOwner, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
        {"guest only", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
        {"only guest", P_BOOL, P_LOCAL, &sDefault.bGuest_only, NULL, NULL, FLAG_HIDE}, 
+       {"hidden", P_BOOL, P_LOCAL, &sDefault.bHidden, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT},
 
        {"guest ok", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
        {"public", P_BOOL, P_LOCAL, &sDefault.bGuest_ok, NULL, NULL, FLAG_HIDE}, 
@@ -2137,6 +2140,7 @@ FN_LOCAL_BOOL(lp_readonly, bRead_only)
 FN_LOCAL_BOOL(lp_no_set_dir, bNo_set_dir)
 FN_LOCAL_BOOL(lp_guest_ok, bGuest_ok)
 FN_LOCAL_BOOL(lp_guest_only, bGuest_only)
+FN_LOCAL_BOOL(lp_hidden, bHidden)
 FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
 FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
 FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
@@ -2774,6 +2778,7 @@ static bool lp_add_ipc(const char *ipc_name, bool guest_ok)
        ServicePtrs[i]->bAvailable = True;
        ServicePtrs[i]->bRead_only = True;
        ServicePtrs[i]->bGuest_only = False;
+       ServicePtrs[i]->bHidden = True;
        ServicePtrs[i]->bGuest_ok = guest_ok;
        ServicePtrs[i]->bPrint_ok = False;
        ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
index 1b877ee5b4ad6c0948d2011790a0e6db918f3ab4..f0680a89e5e8af17000a1d6510ac4c49fb71a17f 100644 (file)
@@ -225,9 +225,6 @@ static WERROR net_enum_files( TALLOC_CTX *ctx, const char *username,
  ********************************************************************/
 static uint32 get_share_type(int snum)
 {
-       char *net_name = lp_servicename(snum);
-       int len_net_name = strlen(net_name);
-
        /* work out the share type */
        uint32 type = STYPE_DISKTREE;
 
@@ -235,7 +232,7 @@ static uint32 get_share_type(int snum)
                type = STYPE_PRINTQ;
        if (strequal(lp_fstype(snum), "IPC"))
                type = STYPE_IPC;
-       if (net_name[len_net_name-1] == '$')
+       if (lp_hidden(snum))
                type |= STYPE_HIDDEN;
 
        return type;