X-Git-Url: http://git.samba.org/?p=amitay%2Fsamba.git;a=blobdiff_plain;f=source4%2Fparam%2Floadparm.c;h=ba9668a1c645488e83add8c19fc668c8e4ba237b;hp=41fee6fde945636ec49a1faae318cbeb66835fa4;hb=b51f97325b8ea330e20ee7c4bf673c4475dd0a0e;hpb=27e169e17efd7150cc9479face9989586a65c70f diff --git a/source4/param/loadparm.c b/source4/param/loadparm.c index 41fee6fde94..ba9668a1c64 100644 --- a/source4/param/loadparm.c +++ b/source4/param/loadparm.c @@ -61,7 +61,6 @@ #include "smb_server/smb_server.h" #include "libcli/raw/signing.h" #include "../lib/util/dlinklist.h" -#include "../lib/util/parmlist.h" #include "param/param.h" #include "param/loadparm.h" #include "libcli/raw/libcliraw.h" @@ -69,6 +68,7 @@ #include "lib/socket/socket.h" #include "auth/gensec/gensec.h" #include "s3_param.h" +#include "../lib/util/bitmap.h" #define standard_sub_basic talloc_strdup @@ -87,20 +87,7 @@ static bool defaults_saved = false; char *panic_action; \ int bPreferredMaster; -#define LOADPARM_EXTRA_LOCALS \ - struct parmlist_entry *param_opt; \ - char *szService; \ - char *szCopy; \ - char *szInclude; \ - char *szPrintername; \ - int bAvailable; \ - int iMaxPrintJobs; \ - char *volume; \ - int *copymap; \ - char dummy[3]; /* for alignment */ - #include "param_global.h" -#include "param_local.h" #define NUMPARAMETERS (sizeof(parm_table) / sizeof(struct parm_struct)) @@ -1042,7 +1029,7 @@ static struct parm_struct parm_table[] = { .label = "strict locking", .type = P_BOOL, .p_class = P_LOCAL, - .offset = LOCAL_VAR(bStrictLocking), + .offset = LOCAL_VAR(iStrictLocking), .special = NULL, .enum_list = NULL }, @@ -1050,7 +1037,7 @@ static struct parm_struct parm_table[] = { .label = "oplocks", .type = P_BOOL, .p_class = P_LOCAL, - .offset = LOCAL_VAR(bOplocks), + .offset = LOCAL_VAR(bOpLocks), .special = NULL, .enum_list = NULL }, @@ -1095,6 +1082,22 @@ static struct parm_struct parm_table[] = { .special = NULL, .enum_list = NULL }, + { + .label = "state directory", + .type = P_STRING, + .p_class = P_GLOBAL, + .offset = GLOBAL_VAR(szStateDir), + .special = NULL, + .enum_list = NULL + }, + { + .label = "cache directory", + .type = P_STRING, + .p_class = P_GLOBAL, + .offset = GLOBAL_VAR(szCacheDir), + .special = NULL, + .enum_list = NULL + }, { .label = "pid directory", .type = P_STRING, @@ -1308,6 +1311,9 @@ struct loadparm_context { struct loadparm_service *lpcfg_default_service(struct loadparm_context *lp_ctx) { + if (lp_ctx->s3_fns) { + return lp_ctx->s3_fns->get_default_loadparm_service(); + } return lp_ctx->sDefault; } @@ -1425,18 +1431,25 @@ static struct loadparm_context *global_loadparm_context; return lp_ctx->globals->var_name; \ } +/* Local parameters don't need the ->s3_fns because the struct + * loadparm_service is shared and lpcfg_service() checks the ->s3_fns + * hook */ #define FN_LOCAL_STRING(fn_name,val) \ _PUBLIC_ const char *lpcfg_ ## fn_name(struct loadparm_service *service, \ struct loadparm_service *sDefault) { \ return(lp_string((const char *)((service != NULL && service->val != NULL) ? service->val : sDefault->val))); \ } +#define FN_LOCAL_CONST_STRING(fn_name,val) FN_LOCAL_STRING(fn_name, val) + #define FN_LOCAL_LIST(fn_name,val) \ _PUBLIC_ const char **lpcfg_ ## fn_name(struct loadparm_service *service, \ struct loadparm_service *sDefault) {\ return(const char **)(service != NULL && service->val != NULL? service->val : sDefault->val); \ } +#define FN_LOCAL_PARM_BOOL(fn_name, val) FN_LOCAL_BOOL(fn_name, val) + #define FN_LOCAL_BOOL(fn_name,val) \ _PUBLIC_ bool lpcfg_ ## fn_name(struct loadparm_service *service, \ struct loadparm_service *sDefault) { \ @@ -1449,6 +1462,18 @@ static struct loadparm_context *global_loadparm_context; return((service != NULL)? service->val : sDefault->val); \ } +#define FN_LOCAL_PARM_INTEGER(fn_name, val) FN_LOCAL_INTEGER(fn_name, val) + +#define FN_LOCAL_PARM_CHAR(fn_name, val) FN_LOCAL_CHAR(fn_name, val) + +#define FN_LOCAL_CHAR(fn_name,val) \ + _PUBLIC_ char lpcfg_ ## fn_name(struct loadparm_service *service, \ + struct loadparm_service *sDefault) { \ + return((service != NULL)? service->val : sDefault->val); \ + } + +#include "lib/param/param_functions.c" + FN_GLOBAL_INTEGER(server_role, server_role) FN_GLOBAL_LIST(smb_ports, smb_ports) FN_GLOBAL_INTEGER(nbt_port, nbt_port) @@ -1473,6 +1498,8 @@ FN_GLOBAL_BOOL(idmap_trusted_only, bIdmapTrustedOnly) FN_GLOBAL_STRING(private_dir, szPrivateDir) FN_GLOBAL_STRING(serverstring, szServerString) FN_GLOBAL_STRING(lockdir, szLockDir) +FN_GLOBAL_STRING(statedir, szStateDir) +FN_GLOBAL_STRING(cachedir, szCacheDir) FN_GLOBAL_STRING(ncalrpc_dir, ncalrpc_dir) FN_GLOBAL_STRING(dos_charset, dos_charset) FN_GLOBAL_STRING(unix_charset, unix_charset) @@ -1535,29 +1562,6 @@ FN_GLOBAL_INTEGER(cli_minprotocol, cli_minprotocol) FN_GLOBAL_INTEGER(security, security) FN_GLOBAL_BOOL(paranoid_server_security, paranoid_server_security) -FN_LOCAL_STRING(pathname, szPath) -FN_LOCAL_LIST(hostsallow, szHostsallow) -FN_LOCAL_LIST(hostsdeny, szHostsdeny) -FN_LOCAL_STRING(comment, comment) -FN_LOCAL_STRING(fstype, fstype) -FN_LOCAL_LIST(ntvfs_handler, ntvfs_handler) -FN_LOCAL_BOOL(msdfs_root, bMSDfsRoot) -FN_LOCAL_BOOL(browseable, bBrowseable) -FN_LOCAL_BOOL(readonly, bRead_only) -FN_LOCAL_BOOL(print_ok, bPrint_ok) -FN_LOCAL_BOOL(map_hidden, bMap_hidden) -FN_LOCAL_BOOL(map_archive, bMap_archive) -FN_LOCAL_BOOL(strict_locking, bStrictLocking) -FN_LOCAL_BOOL(oplocks, bOplocks) -FN_LOCAL_BOOL(strict_sync, bStrictSync) -FN_LOCAL_BOOL(ci_filesystem, bCIFileSystem) -FN_LOCAL_BOOL(map_system, bMap_system) -FN_LOCAL_INTEGER(max_connections, iMaxConnections) -FN_LOCAL_INTEGER(csc_policy, iCSCPolicy) -FN_LOCAL_INTEGER(create_mask, iCreate_mask) -FN_LOCAL_INTEGER(force_create_mode, iCreate_force_mode) -FN_LOCAL_INTEGER(dir_mask, iDir_mask) -FN_LOCAL_INTEGER(force_dir_mode, iDir_force_mode) FN_GLOBAL_INTEGER(server_signing, server_signing) FN_GLOBAL_INTEGER(client_signing, client_signing) @@ -1569,7 +1573,7 @@ static struct loadparm_service *getservicebyname(struct loadparm_context *lp_ctx const char *pszServiceName); static void copy_service(struct loadparm_service *pserviceDest, struct loadparm_service *pserviceSource, - int *pcopymapDest); + struct bitmap *pcopymapDest); static bool service_ok(struct loadparm_service *service); static bool do_section(const char *pszSectionName, void *); static void init_copymap(struct loadparm_service *pservice); @@ -2081,6 +2085,10 @@ static struct loadparm_service *getservicebyname(struct loadparm_context *lp_ctx { int iService; + if (lp_ctx->s3_fns) { + return lp_ctx->s3_fns->get_service(pszServiceName); + } + for (iService = lp_ctx->iNumServices - 1; iService >= 0; iService--) if (lp_ctx->services[iService] != NULL && strwicmp(lp_ctx->services[iService]->szService, pszServiceName) == 0) { @@ -2097,7 +2105,7 @@ static struct loadparm_service *getservicebyname(struct loadparm_context *lp_ctx static void copy_service(struct loadparm_service *pserviceDest, struct loadparm_service *pserviceSource, - int *pcopymapDest) + struct bitmap *pcopymapDest) { int i; bool bcopyall = (pcopymapDest == NULL); @@ -2105,8 +2113,8 @@ static void copy_service(struct loadparm_service *pserviceDest, bool not_added; for (i = 0; parm_table[i].label; i++) - if (parm_table[i].offset != -1 && parm_table[i].p_class == P_LOCAL && - (bcopyall || pcopymapDest[i])) { + if (parm_table[i].p_class == P_LOCAL && + (bcopyall || bitmap_query(pcopymapDest, i))) { void *src_ptr = ((char *)pserviceSource) + parm_table[i].offset; void *dest_ptr = @@ -2146,9 +2154,8 @@ static void copy_service(struct loadparm_service *pserviceDest, if (bcopyall) { init_copymap(pserviceDest); if (pserviceSource->copymap) - memcpy((void *)pserviceDest->copymap, - (void *)pserviceSource->copymap, - sizeof(int) * NUMPARAMETERS); + bitmap_copy(pserviceDest->copymap, + pserviceSource->copymap); } data = pserviceSource->param_opt; @@ -2388,16 +2395,17 @@ static bool handle_logfile(struct loadparm_context *lp_ctx, int unused, static void init_copymap(struct loadparm_service *pservice) { int i; - talloc_free(pservice->copymap); - pservice->copymap = talloc_array(pservice, int, NUMPARAMETERS); - if (pservice->copymap == NULL) { + + TALLOC_FREE(pservice->copymap); + + pservice->copymap = bitmap_talloc(NULL, NUMPARAMETERS); + if (!pservice->copymap) DEBUG(0, ("Couldn't allocate copymap!! (size %d)\n", (int)NUMPARAMETERS)); - return; - } - for (i = 0; i < NUMPARAMETERS; i++) - pservice->copymap[i] = true; + else + for (i = 0; i < NUMPARAMETERS; i++) + bitmap_set(pservice->copymap, i); } /** @@ -2506,6 +2514,10 @@ static bool set_variable(TALLOC_CTX *mem_ctx, int parmnum, void *parm_ptr, *(int *)parm_ptr = atoi(pszParmValue); break; + case P_CHAR: + *(char *)parm_ptr = *pszParmValue; + break; + case P_OCTAL: *(int *)parm_ptr = strtol(pszParmValue, NULL, 8); break; @@ -2671,7 +2683,7 @@ bool lpcfg_do_service_parameter(struct loadparm_context *lp_ctx, for (i = 0; parm_table[i].label; i++) if (parm_table[i].offset == parm_table[parmnum].offset && parm_table[i].p_class == parm_table[parmnum].p_class) - service->copymap[i] = false; + bitmap_clear(service->copymap, i); return set_variable(service, parmnum, parm_ptr, pszParmName, pszParmValue, lp_ctx, false); @@ -2722,9 +2734,15 @@ bool lpcfg_do_global_parameter_var(struct loadparm_context *lp_ctx, bool lpcfg_set_cmdline(struct loadparm_context *lp_ctx, const char *pszParmName, const char *pszParmValue) { - int parmnum = map_parameter(pszParmName); + int parmnum; int i; + if (lp_ctx->s3_fns) { + return lp_ctx->s3_fns->set_cmdline(pszParmName, pszParmValue); + } + + parmnum = map_parameter(pszParmName); + while (isspace((unsigned char)*pszParmValue)) pszParmValue++; @@ -2821,6 +2839,10 @@ static void print_parameter(struct parm_struct *p, void *ptr, FILE * f) fprintf(f, "%d", *(int *)ptr); break; + case P_CHAR: + fprintf(f, "%c", *(char *)ptr); + break; + case P_OCTAL: fprintf(f, "0%o", *(int *)ptr); break; @@ -2868,6 +2890,9 @@ static bool equal_parameter(parm_type type, void *ptr1, void *ptr2) case P_ENUM: return (*((int *)ptr1) == *((int *)ptr2)); + case P_CHAR: + return (*((char *)ptr1) == *((char *)ptr2)); + case P_CMDLIST: case P_LIST: return str_list_equal((const char **)(*(char ***)ptr1), @@ -2959,6 +2984,7 @@ static bool is_default(struct loadparm_service *sDefault, int i) return parm_table[i].def.bvalue == *(int *)def_ptr; case P_INTEGER: + case P_CHAR: case P_OCTAL: case P_BYTES: case P_ENUM: @@ -2982,7 +3008,6 @@ static void dump_globals(struct loadparm_context *lp_ctx, FILE *f, for (i = 0; parm_table[i].label; i++) if (parm_table[i].p_class == P_GLOBAL && - parm_table[i].offset != -1 && (i == 0 || (parm_table[i].offset != parm_table[i - 1].offset))) { if (!show_defaults && (lp_ctx->flags[i] & FLAG_DEFAULT)) continue; @@ -3017,7 +3042,6 @@ static void dump_a_service(struct loadparm_service * pService, struct loadparm_s for (i = 0; parm_table[i].label; i++) { if (parm_table[i].p_class == P_LOCAL && - parm_table[i].offset != -1 && (*parm_table[i].label != '-') && (i == 0 || (parm_table[i].offset != parm_table[i - 1].offset))) { @@ -3084,8 +3108,7 @@ struct parm_struct *lpcfg_next_parameter(struct loadparm_context *lp_ctx, int sn if (snum == -1) { /* do the globals */ for (; parm_table[*i].label; (*i)++) { - if (parm_table[*i].offset == -1 - || (*parm_table[*i].label == '-')) + if ((*parm_table[*i].label == '-')) continue; if ((*i) > 0 @@ -3102,7 +3125,6 @@ struct parm_struct *lpcfg_next_parameter(struct loadparm_context *lp_ctx, int sn for (; parm_table[*i].label; (*i)++) { if (parm_table[*i].p_class == P_LOCAL && - parm_table[*i].offset != -1 && (*parm_table[*i].label != '-') && ((*i) == 0 || (parm_table[*i].offset != @@ -3207,8 +3229,8 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx) lp_ctx->sDefault->bBrowseable = true; lp_ctx->sDefault->bRead_only = true; lp_ctx->sDefault->bMap_archive = true; - lp_ctx->sDefault->bStrictLocking = true; - lp_ctx->sDefault->bOplocks = true; + lp_ctx->sDefault->iStrictLocking = true; + lp_ctx->sDefault->bOpLocks = true; lp_ctx->sDefault->iCreate_mask = 0744; lp_ctx->sDefault->iCreate_force_mode = 0000; lp_ctx->sDefault->iDir_mask = 0755; @@ -3219,7 +3241,6 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx) for (i = 0; parm_table[i].label; i++) { if ((parm_table[i].type == P_STRING || parm_table[i].type == P_USTRING) && - parm_table[i].offset != -1 && !(lp_ctx->flags[i] & FLAG_CMDLINE)) { char **r; if (parm_table[i].p_class == P_LOCAL) { @@ -3288,6 +3309,8 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx) lpcfg_do_global_parameter(lp_ctx, "pid directory", dyn_PIDDIR); lpcfg_do_global_parameter(lp_ctx, "lock dir", dyn_LOCKDIR); + lpcfg_do_global_parameter(lp_ctx, "state directory", dyn_STATEDIR); + lpcfg_do_global_parameter(lp_ctx, "cache directory", dyn_CACHEDIR); lpcfg_do_global_parameter(lp_ctx, "ncalrpc dir", dyn_NCALRPCDIR); lpcfg_do_global_parameter(lp_ctx, "socket address", ""); @@ -3495,6 +3518,10 @@ bool lpcfg_load(struct loadparm_context *lp_ctx, const char *filename) lp_ctx->szConfigFile = filename; + if (lp_ctx->s3_fns) { + return lp_ctx->s3_fns->load(filename); + } + lp_ctx->bInGlobalSection = true; n2 = standard_sub_basic(lp_ctx, lp_ctx->szConfigFile); DEBUG(2, ("lpcfg_load: refreshing parameters from %s\n", n2)); @@ -3537,6 +3564,10 @@ bool lpcfg_load(struct loadparm_context *lp_ctx, const char *filename) int lpcfg_numservices(struct loadparm_context *lp_ctx) { + if (lp_ctx->s3_fns) { + return lp_ctx->s3_fns->get_numservices(); + } + return lp_ctx->iNumServices; } @@ -3572,8 +3603,12 @@ void lpcfg_dump_one(FILE *f, bool show_defaults, struct loadparm_service *servic } struct loadparm_service *lpcfg_servicebynum(struct loadparm_context *lp_ctx, - int snum) + int snum) { + if (lp_ctx->s3_fns) { + return lp_ctx->s3_fns->get_servicebynum(snum); + } + return lp_ctx->services[snum]; }