Author: jra
Date: 2005-12-02 20:13:09 +0000 (Fri, 02 Dec 2005)
New Revision: 12029

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=12029

Log:
Ensure we reset mod time on usershare service. Add a
parameter "usershare template share" to allow admins
to configure a template for all user shares.
Jeremy.

Modified:
   trunk/source/param/loadparm.c


Changeset:
Modified: trunk/source/param/loadparm.c
===================================================================
--- trunk/source/param/loadparm.c       2005-12-02 20:08:51 UTC (rev 12028)
+++ trunk/source/param/loadparm.c       2005-12-02 20:13:09 UTC (rev 12029)
@@ -189,6 +189,7 @@
        char *szManglingMethod;
        char **szServicesList;
        char *szUsersharePath;
+       char *szUsershareTemplateShare;
        int mangle_prefix;
        int max_log_size;
        char *szLogLevel;
@@ -1220,6 +1221,7 @@
        {"available", P_BOOL, P_LOCAL, &sDefault.bAvailable, NULL, NULL, 
FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT}, 
        {"usershare max shares", P_INTEGER, P_GLOBAL, 
&Globals.iUsershareMaxShares, NULL, NULL, FLAG_ADVANCED},
        {"usershare path", P_STRING, P_GLOBAL, &Globals.szUsersharePath, NULL, 
NULL, FLAG_ADVANCED},
+       {"usershare template share", P_STRING, P_GLOBAL, 
&Globals.szUsershareTemplateShare, NULL, NULL, FLAG_ADVANCED},
        {"volume", P_STRING, P_LOCAL, &sDefault.volume, NULL, NULL, 
FLAG_ADVANCED | FLAG_SHARE }, 
        {"fstype", P_STRING, P_LOCAL, &sDefault.fstype, NULL, NULL, 
FLAG_ADVANCED | FLAG_SHARE}, 
        {"set directory", P_BOOLREV, P_LOCAL, &sDefault.bNo_set_dir, NULL, 
NULL, FLAG_ADVANCED | FLAG_SHARE}, 
@@ -1638,6 +1640,7 @@
 
        /* User defined shares. */
        string_set(&Globals.szUsersharePath, "");
+       string_set(&Globals.szUsershareTemplateShare, "");
        Globals.iUsershareMaxShares = 0;
 }
 
@@ -1825,7 +1828,6 @@
 FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
 FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)
 
-FN_GLOBAL_STRING(lp_usershare_path, &Globals.szUsersharePath)
 FN_GLOBAL_LIST(lp_eventlog_list, &Globals.szEventLogs)
 
 FN_GLOBAL_BOOL(lp_disable_netbios, &Globals.bDisableNetbios)
@@ -4240,7 +4242,7 @@
            with permissions to share directory etc.
 ***************************************************************************/
 
-static int process_usershare_file(const char *dir_name, const char *file_name)
+static int process_usershare_file(const char *dir_name, const char *file_name, 
int snum_template)
 {
        SMB_STRUCT_STAT sbuf;
        pstring fname;
@@ -4353,9 +4355,14 @@
 
        SAFE_FREE(lines);
 
-       /* Everything ok - add the service. */
+       /* Everything ok - add the service possibly using a template. */
        if (snum <= 0) {
-               if ((snum = add_a_service(&sDefault, service_name)) < 0) {
+               const service *sp = &sDefault;
+               if (snum_template != -1) {
+                       sp = ServicePtrs[snum_template];
+               }
+
+               if ((snum = add_a_service(sp, service_name)) < 0) {
                        DEBUG(0, ("process_usershare_file: Failed to add "
                                "new service %s\n", service_name));
                        talloc_destroy(ctx);
@@ -4367,8 +4374,15 @@
 
        talloc_destroy(ctx);
 
+       /* If from a template it may be marked invalid. */
+       ServicePtrs[snum]->valid = True;
+
        /* Set the service as a valid usershare. */
        ServicePtrs[snum]->usershare = USERSHARE_VALID;
+
+       /* And note when it was loaded. */
+       ServicePtrs[snum]->usershare_last_mod = sbuf.st_mtime;
+
        return 0;
 }
 
@@ -4385,6 +4399,7 @@
        unsigned int num_dir_entries, num_bad_dir_entries;
        unsigned int allowed_bad_entries = ((2*max_user_shares)/10);
        int iService;
+       int snum_template = -1;
 
        add_to_file_list(usersharepath, usersharepath);
 
@@ -4409,6 +4424,26 @@
                return;
        }
 
+       /* Ensure the template share exists if it's set. */
+       if (Globals.szUsershareTemplateShare[0]) {
+               /* We can't use lp_servicenumber here as we are recommending 
that
+                  template shares have -valid=False set. */
+               for (snum_template = iNumServices - 1; snum_template >= 0; 
snum_template--) {
+                       if (ServicePtrs[snum_template]->szService &&
+                                       
strequal(ServicePtrs[snum_template]->szService,
+                                               
Globals.szUsershareTemplateShare)) {
+                               break;
+                       }
+               }
+
+               if (snum_template == -1) {
+                       DEBUG(0,("process_usershare_directory: usershare 
template share %s "
+                               "does not exist.\n",
+                               Globals.szUsershareTemplateShare ));
+                       return;
+               }
+       }
+
        /* Mark all existing usershares as pending delete. */
        for (iService = iNumServices - 1; iService >= 0; iService--) {
                if (VALID(iService) && ServicePtrs[iService]->usershare) {
@@ -4426,7 +4461,7 @@
        for (num_dir_entries = 0, num_bad_dir_entries = 0;
                        (de = sys_readdir(dp));
                        num_dir_entries++ ) {
-               int ret = process_usershare_file(usersharepath, de->d_name);
+               int ret = process_usershare_file(usersharepath, de->d_name, 
snum_template);
                if (ret == 0) {
                        num_usershares++;
                        if (num_usershares >= max_user_shares) {

Reply via email to