diff options
-rw-r--r-- | source4/param/loadparm.c | 28 | ||||
-rw-r--r-- | source4/param/loadparm.h | 2 | ||||
-rw-r--r-- | source4/param/share.h | 12 | ||||
-rw-r--r-- | source4/param/share_classic.c | 39 |
4 files changed, 72 insertions, 9 deletions
diff --git a/source4/param/loadparm.c b/source4/param/loadparm.c index 8371b94a50..dd52c55edf 100644 --- a/source4/param/loadparm.c +++ b/source4/param/loadparm.c @@ -223,6 +223,10 @@ typedef struct int bMap_hidden; int bMap_archive; int bStrictLocking; + int iCreate_mask; + int iCreate_force_mode; + int iDir_mask; + int iDir_force_mode; int *copymap; int bMSDfsRoot; int bStrictSync; @@ -259,6 +263,10 @@ static service sDefault = { False, /* bMap_hidden */ True, /* bMap_archive */ True, /* bStrictLocking */ + 0744, /* iCreate_mask */ + 0000, /* iCreate_force_mode */ + 0755, /* iDir_mask */ + 0000, /* iDir_force_mode */ NULL, /* copymap */ False, /* bMSDfsRoot */ False, /* bStrictSync */ @@ -419,6 +427,11 @@ static struct parm_struct parm_table[] = { {"read only", P_BOOL, P_LOCAL, &sDefault.bRead_only, NULL, NULL, FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE}, + {"create mask", P_OCTAL, P_LOCAL, &sDefault.iCreate_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, + {"force create mode", P_OCTAL, P_LOCAL, &sDefault.iCreate_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, + {"directory mask", P_OCTAL, P_LOCAL, &sDefault.iDir_mask, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, + {"force directory mode", P_OCTAL, P_LOCAL, &sDefault.iDir_force_mode, NULL, NULL, FLAG_ADVANCED | FLAG_GLOBAL | FLAG_SHARE}, + {"hosts allow", P_LIST, P_LOCAL, &sDefault.szHostsallow, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER}, {"hosts deny", P_LIST, P_LOCAL, &sDefault.szHostsdeny, NULL, NULL, FLAG_GLOBAL | FLAG_BASIC | FLAG_ADVANCED | FLAG_SHARE | FLAG_PRINT | FLAG_DEVELOPER}, @@ -932,6 +945,10 @@ _PUBLIC_ FN_LOCAL_BOOL(lp_ci_filesystem, bCIFileSystem) _PUBLIC_ FN_LOCAL_BOOL(lp_map_system, bMap_system) _PUBLIC_ FN_LOCAL_INTEGER(lp_max_connections, iMaxConnections) _PUBLIC_ FN_LOCAL_INTEGER(lp_csc_policy, iCSCPolicy) +_PUBLIC_ FN_LOCAL_INTEGER(lp_create_mask, iCreate_mask) +_PUBLIC_ FN_LOCAL_INTEGER(lp_force_create_mode, iCreate_force_mode) +_PUBLIC_ FN_LOCAL_INTEGER(lp_dir_mask, iDir_mask) +_PUBLIC_ FN_LOCAL_INTEGER(lp_force_dir_mode, iDir_force_mode) _PUBLIC_ FN_GLOBAL_INTEGER(lp_server_signing, &Globals.server_signing) _PUBLIC_ FN_GLOBAL_INTEGER(lp_client_signing, &Globals.client_signing) @@ -1489,6 +1506,7 @@ static void copy_service(service * pserviceDest, service * pserviceSource, int * break; case P_INTEGER: + case P_OCTAL: case P_ENUM: *(int *)dest_ptr = *(int *)src_ptr; break; @@ -1894,6 +1912,10 @@ BOOL lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue *(int *)parm_ptr = atoi(pszParmValue); break; + case P_OCTAL: + *(int *)parm_ptr = strtol(pszParmValue, NULL, 8); + break; + case P_BYTES: { uint64_t val; @@ -2088,6 +2110,10 @@ static void print_parameter(struct parm_struct *p, void *ptr, FILE * f) fprintf(f, "%d", *(int *)ptr); break; + case P_OCTAL: + fprintf(f, "0%o", *(int *)ptr); + break; + case P_LIST: if ((char ***)ptr && *(char ***)ptr) { char **list = *(char ***)ptr; @@ -2120,6 +2146,7 @@ static BOOL equal_parameter(parm_type type, void *ptr1, void *ptr2) return (*((int *)ptr1) == *((int *)ptr2)); case P_INTEGER: + case P_OCTAL: case P_BYTES: case P_ENUM: return (*((int *)ptr1) == *((int *)ptr2)); @@ -2209,6 +2236,7 @@ static BOOL is_default(int i) return parm_table[i].def.bvalue == *(int *)parm_table[i].ptr; case P_INTEGER: + case P_OCTAL: case P_BYTES: case P_ENUM: return parm_table[i].def.ivalue == diff --git a/source4/param/loadparm.h b/source4/param/loadparm.h index d439a435e6..29a2acab1a 100644 --- a/source4/param/loadparm.h +++ b/source4/param/loadparm.h @@ -30,7 +30,7 @@ /* the following are used by loadparm for option lists */ typedef enum { - P_BOOL,P_INTEGER,P_BYTES,P_LIST,P_STRING,P_USTRING,P_ENUM,P_SEP + P_BOOL,P_INTEGER,P_OCTAL,P_BYTES,P_LIST,P_STRING,P_USTRING,P_ENUM,P_SEP } parm_type; typedef enum { diff --git a/source4/param/share.h b/source4/param/share.h index 93b02255b6..94b8181867 100644 --- a/source4/param/share.h +++ b/source4/param/share.h @@ -92,6 +92,11 @@ struct share_ops { #define SHARE_MSDFS_ROOT "msdfs-root" #define SHARE_CI_FILESYSTEM "ci-filesystem" +#define SHARE_DIR_MASK "directory mask" +#define SHARE_CREATE_MASK "create mask" +#define SHARE_FORCE_CREATE_MODE "force create mode" +#define SHARE_FORCE_DIR_MODE "force directory mode" + /* defaults */ #define SHARE_HOST_ALLOW_DEFAULT NULL @@ -103,6 +108,13 @@ struct share_ops { #define SHARE_BROWSEABLE_DEFAULT True #define SHARE_MAX_CONNECTIONS_DEFAULT 0 +#define SHARE_DIR_MASK_DEFAULT 0755 +#define SHARE_CREATE_MASK_DEFAULT 0744 +#define SHARE_FORCE_CREATE_MODE_DEFAULT 0000 +#define SHARE_FORCE_DIR_MODE_DEFAULT 0000 + + + /* I'd like to see the following options go away * and always use EAs and SECDESCs */ #define SHARE_READONLY_DEFAULT True diff --git a/source4/param/share_classic.c b/source4/param/share_classic.c index 794a21c5bf..0a6e23287c 100644 --- a/source4/param/share_classic.c +++ b/source4/param/share_classic.c @@ -90,6 +90,9 @@ static const char *sclassic_string_option(struct share_config *scfg, const char return lp_fstype(s->snum); } + DEBUG(0,("request for unknown share string option '%s'\n", + opt_name)); + return defval; } @@ -117,19 +120,33 @@ int sclassic_int_option(struct share_config *scfg, const char *opt_name, int def } if (strcmp(opt_name, SHARE_CSC_POLICY) == 0) { - ret = lp_csc_policy(s->snum); - if (ret == -1) { - return defval; - } + return lp_csc_policy(s->snum); } if (strcmp(opt_name, SHARE_MAX_CONNECTIONS) == 0) { - ret = lp_max_connections(s->snum); - if (ret == -1) { - return defval; - } + return lp_max_connections(s->snum); + } + + if (strcmp(opt_name, SHARE_CREATE_MASK) == 0) { + return lp_create_mask(s->snum); + } + + if (strcmp(opt_name, SHARE_DIR_MASK) == 0) { + return lp_dir_mask(s->snum); } + if (strcmp(opt_name, SHARE_FORCE_DIR_MODE) == 0) { + return lp_force_dir_mode(s->snum); + } + + if (strcmp(opt_name, SHARE_FORCE_CREATE_MODE) == 0) { + return lp_force_create_mode(s->snum); + } + + + DEBUG(0,("request for unknown share int option '%s'\n", + opt_name)); + return defval; } @@ -193,6 +210,9 @@ BOOL sclassic_bool_option(struct share_config *scfg, const char *opt_name, BOOL return lp_ci_filesystem(s->snum); } + DEBUG(0,("request for unknown share bool option '%s'\n", + opt_name)); + return defval; } @@ -228,6 +248,9 @@ const char **sclassic_string_list_option(TALLOC_CTX *mem_ctx, struct share_confi return lp_ntvfs_handler(s->snum); } + DEBUG(0,("request for unknown share list option '%s'\n", + opt_name)); + return NULL; } |