diff options
Diffstat (limited to 'source/param/loadparm.c')
-rw-r--r-- | source/param/loadparm.c | 226 |
1 files changed, 95 insertions, 131 deletions
diff --git a/source/param/loadparm.c b/source/param/loadparm.c index 87af7a3411..8390701879 100644 --- a/source/param/loadparm.c +++ b/source/param/loadparm.c @@ -52,7 +52,6 @@ */ #include "includes.h" -#include "printing.h" bool bLoaded = False; @@ -98,8 +97,9 @@ extern int extra_time_offset; static bool defaults_saved = False; -struct param_opt_struct { - struct param_opt_struct *prev, *next; +typedef struct _param_opt_struct param_opt_struct; +struct _param_opt_struct { + param_opt_struct *prev, *next; char *key; char *value; char **list; @@ -195,7 +195,8 @@ struct global { bool bWinbindOfflineLogon; bool bWinbindNormalizeNames; bool bWinbindRpcOnly; - char *szIdmapBackend; + char **szIdmapDomains; + char **szIdmapBackend; /* deprecated */ char *szIdmapAllocBackend; char *szAddShareCommand; char *szChangeShareCommand; @@ -241,7 +242,6 @@ struct global { int map_to_guest; int oplock_break_wait_time; int winbind_cache_time; - int winbind_reconnect_delay; int winbind_max_idle_children; char **szWinbindNssInfo; int iLockSpinTime; @@ -274,8 +274,6 @@ struct global { int iPreferredMaster; int iDomainMaster; bool bDomainLogons; - char **szInitLogonDelayedHosts; - int InitLogonDelay; bool bEncryptPasswords; bool bUpdateEncrypt; int clientSchannel; @@ -340,8 +338,7 @@ struct global { bool bResetOnZeroVC; int iKeepalive; int iminreceivefile; - struct param_opt_struct *param_opt; - int cups_connection_timeout; + param_opt_struct *param_opt; }; static struct global Globals; @@ -485,7 +482,7 @@ struct service { int iMap_readonly; int iDirectoryNameCacheSize; int ismb_encrypt; - struct param_opt_struct *param_opt; + param_opt_struct *param_opt; char dummy[3]; /* for alignment */ }; @@ -2597,15 +2594,6 @@ static struct parm_struct parm_table[] = { .flags = FLAG_ADVANCED | FLAG_PRINT | FLAG_GLOBAL, }, { - .label = "cups connection timeout", - .type = P_INTEGER, - .p_class = P_GLOBAL, - .ptr = &Globals.cups_connection_timeout, - .special = NULL, - .enum_list = NULL, - .flags = FLAG_ADVANCED, - }, - { .label = "iprint server", .type = P_STRING, .p_class = P_GLOBAL, @@ -3203,23 +3191,6 @@ static struct parm_struct parm_table[] = { .flags = FLAG_ADVANCED, }, - { - .label = "init logon delayed hosts", - .type = P_LIST, - .p_class = P_GLOBAL, - .ptr = &Globals.szInitLogonDelayedHosts, - .flags = FLAG_ADVANCED, - }, - - { - .label = "init logon delay", - .type = P_INTEGER, - .p_class = P_GLOBAL, - .ptr = &Globals.InitLogonDelay, - .flags = FLAG_ADVANCED, - - }, - {N_("Browse Options"), P_SEP, P_SEPARATOR}, { @@ -4267,8 +4238,17 @@ static struct parm_struct parm_table[] = { .flags = FLAG_ADVANCED, }, { + .label = "idmap domains", + .type = P_LIST, + .p_class = P_GLOBAL, + .ptr = &Globals.szIdmapDomains, + .special = NULL, + .enum_list = NULL, + .flags = FLAG_ADVANCED, + }, + { .label = "idmap backend", - .type = P_STRING, + .type = P_LIST, .p_class = P_GLOBAL, .ptr = &Globals.szIdmapBackend, .special = NULL, @@ -4375,15 +4355,6 @@ static struct parm_struct parm_table[] = { .flags = FLAG_ADVANCED, }, { - .label = "winbind reconnect delay", - .type = P_INTEGER, - .p_class = P_GLOBAL, - .ptr = &Globals.winbind_reconnect_delay, - .special = NULL, - .enum_list = NULL, - .flags = FLAG_ADVANCED, - }, - { .label = "winbind enum users", .type = P_BOOL, .p_class = P_GLOBAL, @@ -4805,7 +4776,6 @@ static void init_globals(bool first_time_only) * to never expire, though, when this runs out the afs client will * forget the token. Set to 0 to get NEVERDATE.*/ Globals.iAfsTokenLifetime = 604800; - Globals.cups_connection_timeout = CUPS_DEFAULT_CONNECTION_TIMEOUT; /* these parameters are set to defaults that are more appropriate for the increasing samba install base: @@ -4828,16 +4798,12 @@ static void init_globals(bool first_time_only) Globals.bWINSsupport = False; Globals.bWINSproxy = False; - TALLOC_FREE(Globals.szInitLogonDelayedHosts); - Globals.InitLogonDelay = 100; /* 100 ms default delay */ - Globals.bDNSproxy = True; /* this just means to use them if they exist */ Globals.bKernelOplocks = True; Globals.bAllowTrustedDomains = True; - string_set(&Globals.szIdmapBackend, "tdb"); string_set(&Globals.szTemplateShell, "/bin/false"); string_set(&Globals.szTemplateHomedir, "/home/%D/%U"); @@ -4851,7 +4817,6 @@ static void init_globals(bool first_time_only) Globals.clustering = False; Globals.winbind_cache_time = 300; /* 5 minutes */ - Globals.winbind_reconnect_delay = 30; /* 30 seconds */ Globals.bWinbindEnumUsers = False; Globals.bWinbindEnumGroups = False; Globals.bWinbindUseDefaultDomain = False; @@ -4862,7 +4827,7 @@ static void init_globals(bool first_time_only) Globals.bWinbindRefreshTickets = False; Globals.bWinbindOfflineLogon = False; - Globals.iIdmapCacheTime = 86400 * 7; /* a week by default */ + Globals.iIdmapCacheTime = 900; /* 15 minutes by default */ Globals.iIdmapNegativeCacheTime = 120; /* 2 minutes by default */ Globals.bPassdbExpandExplicit = False; @@ -5105,7 +5070,8 @@ FN_GLOBAL_BOOL(lp_winbind_offline_logon, &Globals.bWinbindOfflineLogon) FN_GLOBAL_BOOL(lp_winbind_normalize_names, &Globals.bWinbindNormalizeNames) FN_GLOBAL_BOOL(lp_winbind_rpc_only, &Globals.bWinbindRpcOnly) -FN_GLOBAL_CONST_STRING(lp_idmap_backend, &Globals.szIdmapBackend) +FN_GLOBAL_LIST(lp_idmap_domains, &Globals.szIdmapDomains) +FN_GLOBAL_LIST(lp_idmap_backend, &Globals.szIdmapBackend) /* deprecated */ FN_GLOBAL_STRING(lp_idmap_alloc_backend, &Globals.szIdmapAllocBackend) FN_GLOBAL_INTEGER(lp_idmap_cache_time, &Globals.iIdmapCacheTime) FN_GLOBAL_INTEGER(lp_idmap_negative_cache_time, &Globals.iIdmapNegativeCacheTime) @@ -5144,8 +5110,6 @@ FN_GLOBAL_BOOL(lp_we_are_a_wins_server, &Globals.bWINSsupport) FN_GLOBAL_BOOL(lp_wins_proxy, &Globals.bWINSproxy) FN_GLOBAL_BOOL(lp_local_master, &Globals.bLocalMaster) FN_GLOBAL_BOOL(lp_domain_logons, &Globals.bDomainLogons) -FN_GLOBAL_LIST(lp_init_logon_delayed_hosts, &Globals.szInitLogonDelayedHosts) -FN_GLOBAL_INTEGER(lp_init_logon_delay, &Globals.InitLogonDelay) FN_GLOBAL_BOOL(lp_load_printers, &Globals.bLoadPrinters) FN_GLOBAL_BOOL(lp_readraw, &Globals.bReadRaw) FN_GLOBAL_BOOL(lp_large_readwrite, &Globals.bLargeReadwrite) @@ -5247,7 +5211,6 @@ FN_GLOBAL_LIST(lp_svcctl_list, &Globals.szServicesList) FN_LOCAL_STRING(lp_cups_options, szCupsOptions) FN_GLOBAL_STRING(lp_cups_server, &Globals.szCupsServer) FN_GLOBAL_STRING(lp_iprint_server, &Globals.szIPrintServer) -FN_GLOBAL_INTEGER(lp_cups_connection_timeout, &Globals.cups_connection_timeout) FN_GLOBAL_CONST_STRING(lp_ctdbd_socket, &Globals.ctdbdSocket) FN_GLOBAL_LIST(lp_cluster_addresses, &Globals.szClusterAddresses) FN_GLOBAL_BOOL(lp_clustering, &Globals.clustering) @@ -5365,7 +5328,6 @@ FN_LOCAL_INTEGER(lp_directory_name_cache_size, iDirectoryNameCacheSize) FN_LOCAL_INTEGER(lp_smb_encrypt, ismb_encrypt) FN_LOCAL_CHAR(lp_magicchar, magic_char) FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time) -FN_GLOBAL_INTEGER(lp_winbind_reconnect_delay, &Globals.winbind_reconnect_delay) FN_GLOBAL_LIST(lp_winbind_nss_info, &Globals.szWinbindNssInfo) FN_GLOBAL_INTEGER(lp_algorithmic_rid_base, &Globals.AlgorithmicRidBase) FN_GLOBAL_INTEGER(lp_name_cache_timeout, &Globals.name_cache_timeout) @@ -5394,17 +5356,14 @@ static char * canonicalize_servicename(const char *name); static void show_parameter(int parmIndex); static bool is_synonym_of(int parm1, int parm2, bool *inverse); -/* - * This is a helper function for parametrical options support. It returns a - * pointer to parametrical option value if it exists or NULL otherwise. Actual - * parametrical functions are quite simple - */ -static struct param_opt_struct *get_parametrics(int snum, const char *type, - const char *option) +/* This is a helper function for parametrical options support. */ +/* It returns a pointer to parametrical option value if it exists or NULL otherwise */ +/* Actual parametrical functions are quite simple */ +static param_opt_struct *get_parametrics(int snum, const char *type, const char *option) { bool global_section = False; char* param_key; - struct param_opt_struct *data; + param_opt_struct *data; if (snum >= iNumServices) return NULL; @@ -5421,7 +5380,7 @@ static struct param_opt_struct *get_parametrics(int snum, const char *type, } while (data) { - if (strwicmp(data->key, param_key) == 0) { + if (strcmp(data->key, param_key) == 0) { string_free(¶m_key); return data; } @@ -5433,7 +5392,7 @@ static struct param_opt_struct *get_parametrics(int snum, const char *type, /* but only if we are not already working with Globals */ data = Globals.param_opt; while (data) { - if (strwicmp(data->key, param_key) == 0) { + if (strcmp(data->key, param_key) == 0) { string_free(¶m_key); return data; } @@ -5538,7 +5497,7 @@ static int lp_enum(const char *s,const struct enum_list *_enum) /* the returned value is talloced on the talloc_tos() */ char *lp_parm_talloc_string(int snum, const char *type, const char *option, const char *def) { - struct param_opt_struct *data = get_parametrics(snum, type, option); + param_opt_struct *data = get_parametrics(snum, type, option); if (data == NULL||data->value==NULL) { if (def) { @@ -5555,7 +5514,7 @@ char *lp_parm_talloc_string(int snum, const char *type, const char *option, cons /* Parametric option has following syntax: 'Type: option = value' */ const char *lp_parm_const_string(int snum, const char *type, const char *option, const char *def) { - struct param_opt_struct *data = get_parametrics(snum, type, option); + param_opt_struct *data = get_parametrics(snum, type, option); if (data == NULL||data->value==NULL) return def; @@ -5568,7 +5527,7 @@ const char *lp_parm_const_string(int snum, const char *type, const char *option, const char **lp_parm_string_list(int snum, const char *type, const char *option, const char **def) { - struct param_opt_struct *data = get_parametrics(snum, type, option); + param_opt_struct *data = get_parametrics(snum, type, option); if (data == NULL||data->value==NULL) return (const char **)def; @@ -5585,7 +5544,7 @@ const char **lp_parm_string_list(int snum, const char *type, const char *option, int lp_parm_int(int snum, const char *type, const char *option, int def) { - struct param_opt_struct *data = get_parametrics(snum, type, option); + param_opt_struct *data = get_parametrics(snum, type, option); if (data && data->value && *data->value) return lp_int(data->value); @@ -5598,7 +5557,7 @@ int lp_parm_int(int snum, const char *type, const char *option, int def) unsigned long lp_parm_ulong(int snum, const char *type, const char *option, unsigned long def) { - struct param_opt_struct *data = get_parametrics(snum, type, option); + param_opt_struct *data = get_parametrics(snum, type, option); if (data && data->value && *data->value) return lp_ulong(data->value); @@ -5611,7 +5570,7 @@ unsigned long lp_parm_ulong(int snum, const char *type, const char *option, unsi bool lp_parm_bool(int snum, const char *type, const char *option, bool def) { - struct param_opt_struct *data = get_parametrics(snum, type, option); + param_opt_struct *data = get_parametrics(snum, type, option); if (data && data->value && *data->value) return lp_bool(data->value); @@ -5625,7 +5584,7 @@ bool lp_parm_bool(int snum, const char *type, const char *option, bool def) int lp_parm_enum(int snum, const char *type, const char *option, const struct enum_list *_enum, int def) { - struct param_opt_struct *data = get_parametrics(snum, type, option); + param_opt_struct *data = get_parametrics(snum, type, option); if (data && data->value && *data->value && _enum) return lp_enum(data->value, _enum); @@ -5651,7 +5610,7 @@ static void init_service(struct service *pservice) static void free_service(struct service *pservice) { int i; - struct param_opt_struct *data, *pdata; + param_opt_struct *data, *pdata; if (!pservice) return; @@ -5730,7 +5689,7 @@ static int add_a_service(const struct service *pservice, const char *name) int i; struct service tservice; int num_to_alloc = iNumServices + 1; - struct param_opt_struct *data, *pdata; + param_opt_struct *data, *pdata; tservice = *pservice; @@ -6413,7 +6372,7 @@ static void copy_service(struct service *pserviceDest, struct service *pserviceS { int i; bool bcopyall = (pcopymapDest == NULL); - struct param_opt_struct *data, *pdata, *paramo; + param_opt_struct *data, *pdata, *paramo; bool not_added; for (i = 0; parm_table[i].label; i++) @@ -6477,7 +6436,7 @@ static void copy_service(struct service *pserviceDest, struct service *pserviceS /* Traverse destination */ while (pdata) { /* If we already have same option, override it */ - if (strwicmp(pdata->key, data->key) == 0) { + if (strcmp(pdata->key, data->key) == 0) { string_free(&pdata->value); TALLOC_FREE(data->list); pdata->value = SMB_STRDUP(data->value); @@ -6487,7 +6446,7 @@ static void copy_service(struct service *pserviceDest, struct service *pserviceS pdata = pdata->next; } if (not_added) { - paramo = SMB_XMALLOC_P(struct param_opt_struct); + paramo = SMB_XMALLOC_P(param_opt_struct); paramo->key = SMB_STRDUP(data->key); paramo->value = SMB_STRDUP(data->value); paramo->list = NULL; @@ -6884,7 +6843,7 @@ static bool handle_include(int snum, const char *pszParmValue, char **ptr) DEBUG(2, ("Can't find include file %s\n", fname)); SAFE_FREE(fname); - return true; + return false; } /*************************************************************************** @@ -7086,11 +7045,9 @@ static void lp_set_enum_parm( struct parm_struct *parm, const char *pszParmValue for (i = 0; parm->enum_list[i].name; i++) { if ( strequal(pszParmValue, parm->enum_list[i].name)) { *ptr = parm->enum_list[i].value; - return; + break; } } - DEBUG(0, ("WARNING: Ignoring invalid value '%s' for parameter '%s'\n", - pszParmValue, parm->label)); } /*************************************************************************** @@ -7154,58 +7111,65 @@ void *lp_local_ptr(int snum, void *ptr) bool lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue) { - int parmnum, i; + int parmnum, i, slen; void *parm_ptr = NULL; /* where we are going to store the result */ void *def_ptr = NULL; - struct param_opt_struct *paramo, *data; + char *param_key = NULL; + char *sep; + param_opt_struct *paramo, *data; bool not_added; parmnum = map_parameter(pszParmName); if (parmnum < 0) { - TALLOC_CTX *frame; - - if (strchr(pszParmName, ':') == NULL) { - DEBUG(0, ("Ignoring unknown parameter \"%s\"\n", - pszParmName)); - return (True); - } - - /* - * We've got a parametric option - */ - - frame = talloc_stackframe(); - - not_added = True; - data = (snum < 0) - ? Globals.param_opt : ServicePtrs[snum]->param_opt; - /* Traverse destination */ - while (data) { - /* If we already have same option, override it */ - if (strwicmp(data->key, pszParmName) == 0) { - string_free(&data->value); - TALLOC_FREE(data->list); - data->value = SMB_STRDUP(pszParmValue); - not_added = False; - break; + if ((sep=strchr(pszParmName, ':')) != NULL) { + TALLOC_CTX *frame = talloc_stackframe(); + + *sep = '\0'; + param_key = talloc_asprintf(frame, "%s:", pszParmName); + if (!param_key) { + TALLOC_FREE(frame); + return false; } - data = data->next; - } - if (not_added) { - paramo = SMB_XMALLOC_P(struct param_opt_struct); - paramo->key = SMB_STRDUP(pszParmName); - paramo->value = SMB_STRDUP(pszParmValue); - paramo->list = NULL; - if (snum < 0) { - DLIST_ADD(Globals.param_opt, paramo); - } else { - DLIST_ADD(ServicePtrs[snum]->param_opt, - paramo); + slen = strlen(param_key); + param_key = talloc_asprintf_append(param_key, sep+1); + if (!param_key) { + TALLOC_FREE(frame); + return false; + } + trim_char(param_key+slen, ' ', ' '); + not_added = True; + data = (snum < 0) ? Globals.param_opt : + ServicePtrs[snum]->param_opt; + /* Traverse destination */ + while (data) { + /* If we already have same option, override it */ + if (strcmp(data->key, param_key) == 0) { + string_free(&data->value); + TALLOC_FREE(data->list); + data->value = SMB_STRDUP(pszParmValue); + not_added = False; + break; + } + data = data->next; + } + if (not_added) { + paramo = SMB_XMALLOC_P(param_opt_struct); + paramo->key = SMB_STRDUP(param_key); + paramo->value = SMB_STRDUP(pszParmValue); + paramo->list = NULL; + if (snum < 0) { + DLIST_ADD(Globals.param_opt, paramo); + } else { + DLIST_ADD(ServicePtrs[snum]->param_opt, paramo); + } } - } - TALLOC_FREE(frame); + *sep = ':'; + TALLOC_FREE(frame); + return (True); + } + DEBUG(0, ("Ignoring unknown parameter \"%s\"\n", pszParmName)); return (True); } @@ -7244,8 +7208,8 @@ bool lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue /* if it is a special case then go ahead */ if (parm_table[parmnum].special) { - return parm_table[parmnum].special(snum, pszParmValue, - (char **)parm_ptr); + parm_table[parmnum].special(snum, pszParmValue, (char **)parm_ptr); + return (True); } /* now switch on the type of variable it is */ @@ -7521,7 +7485,7 @@ Display the contents of the global structure. static void dump_globals(FILE *f) { int i; - struct param_opt_struct *data; + param_opt_struct *data; fprintf(f, "[global]\n"); @@ -7565,7 +7529,7 @@ bool lp_is_default(int snum, struct parm_struct *parm) static void dump_a_service(struct service *pService, FILE * f) { int i; - struct param_opt_struct *data; + param_opt_struct *data; if (pService != &sDefault) fprintf(f, "[%s]\n", pService->szService); @@ -8783,7 +8747,7 @@ bool lp_load_ex(const char *pszFname, { char *n2 = NULL; bool bRetval; - struct param_opt_struct *data, *pdata; + param_opt_struct *data, *pdata; bRetval = False; |