summaryrefslogtreecommitdiff
path: root/source3/utils
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2006-09-06 00:35:27 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 11:43:29 -0500
commit8b5bef1ad1ad81ce614ba422a7d4cd8c0c15106d (patch)
treeea341cdf6f28b819f40b0c11c243682dfdcaa3e5 /source3/utils
parent8f50142e4d725c81d9ab8984ece342b6759eb475 (diff)
downloadsamba-8b5bef1ad1ad81ce614ba422a7d4cd8c0c15106d.tar.gz
samba-8b5bef1ad1ad81ce614ba422a7d4cd8c0c15106d.tar.bz2
samba-8b5bef1ad1ad81ce614ba422a7d4cd8c0c15106d.zip
r18116: Make max usershares an advisory limit, pointed out
by Cybionet <cybionet@videotron.ca>. Jeremy. (This used to be commit fb755e83ee98fb830fb2340f175e8ca8d89c84d5)
Diffstat (limited to 'source3/utils')
-rw-r--r--source3/utils/net_usershare.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/source3/utils/net_usershare.c b/source3/utils/net_usershare.c
index 7d6f8d56e2..6a306a9983 100644
--- a/source3/utils/net_usershare.c
+++ b/source3/utils/net_usershare.c
@@ -458,6 +458,63 @@ static int net_usershare_info(int argc, const char **argv)
}
/***************************************************************************
+ 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",