summaryrefslogtreecommitdiff
path: root/source/param/loadparm.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/param/loadparm.c')
-rw-r--r--source/param/loadparm.c226
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(&param_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(&param_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;