r18116: Make max usershares an advisory limit, pointed out
authorJeremy Allison <jra@samba.org>
Wed, 6 Sep 2006 00:35:27 +0000 (00:35 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:43:29 +0000 (11:43 -0500)
by Cybionet <cybionet@videotron.ca>.
Jeremy.
(This used to be commit fb755e83ee98fb830fb2340f175e8ca8d89c84d5)

source3/utils/net_usershare.c

index 7d6f8d56e2773ee8c45a0c462b5e6cdfb492aae2..6a306a99830b33e919f6f2e6b4d3bd4915ce4b81 100644 (file)
@@ -457,6 +457,63 @@ static int net_usershare_info(int argc, const char **argv)
        return ret;
 }
 
+/***************************************************************************
+ Count the current total number of usershares.
+***************************************************************************/
+
+static int count_num_usershares(void)
+{
+       SMB_STRUCT_DIR *dp;
+       SMB_STRUCT_DIRENT *de;
+       pstring basepath;
+       int num_usershares = 0;
+
+       get_basepath(basepath);
+       dp = sys_opendir(basepath);
+       if (!dp) {
+               d_fprintf(stderr, "count_num_usershares: cannot open usershare directory %s. Error %s\n",
+                       basepath, strerror(errno) );
+               return -1;
+       }
+
+       while((de = sys_readdir(dp)) != 0) {
+               SMB_STRUCT_STAT sbuf;
+               pstring path;
+               const char *n = de->d_name;
+
+               /* Ignore . and .. */
+               if (*n == '.') {
+                       if ((n[1] == '\0') || (n[1] == '.' && n[2] == '\0')) {
+                               continue;
+                       }
+               }
+
+               if (!validate_net_name(n, INVALID_SHARENAME_CHARS, strlen(n))) {
+                       d_fprintf(stderr, "count_num_usershares: ignoring bad share name %s\n",n);
+                       continue;
+               }
+               pstrcpy(path, basepath);
+               pstrcat(path, "/");
+               pstrcat(path, n);
+
+               if (sys_lstat(path, &sbuf) != 0) {
+                       d_fprintf(stderr, "count_num_usershares: can't lstat file %s. Error was %s\n",
+                               path, strerror(errno) );
+                       continue;
+               }
+
+               if (!S_ISREG(sbuf.st_mode)) {
+                       d_fprintf(stderr, "count_num_usershares: file %s is not a regular file. Ignoring.\n",
+                               path );
+                       continue;
+               }
+               num_usershares++;
+       }
+
+       sys_closedir(dp);
+       return num_usershares;
+}
+
 /***************************************************************************
  Add a single userlevel share.
 ***************************************************************************/
@@ -481,6 +538,7 @@ static int net_usershare_add(int argc, const char **argv)
        size_t to_write;
        uid_t myeuid = geteuid();
        BOOL guest_ok = False;
+       int num_usershares;
 
        us_comment = "";
        arg_acl = "S-1-1-0:R";
@@ -528,6 +586,16 @@ static int net_usershare_add(int argc, const char **argv)
                        break;
        }
 
+       /* Ensure we're under the "usershare max shares" number. Advisory only. */
+       num_usershares = count_num_usershares();
+       if (num_usershares > lp_usershare_max_shares()) {
+               d_fprintf(stderr, "net usershare add: too many usershares already defined (%d), "
+                       "maximum number allowed is %d.\n",
+                       num_usershares, lp_usershare_max_shares() );
+               SAFE_FREE(sharename);
+               return -1;
+       }
+
        if (!validate_net_name(sharename, INVALID_SHARENAME_CHARS, strlen(sharename))) {
                d_fprintf(stderr, "net usershare add: share name %s contains "
                         "invalid characters (any of %s)\n",