Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
path: root/nslcd/cfg.c
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2009-05-24 10:56:33 +0200
committerArthur de Jong <arthur@arthurdejong.org>2009-05-24 10:56:33 +0200
commit6bdd24fe2857258515496a6eedd7ee8650144582 (patch)
treef6a37aa31062c567f528d13a0eafa6c2dd22c7d8 /nslcd/cfg.c
parentd50fe928bb5526892f091f0ff287ec449b9b66be (diff)
support multiple search bases, partially based on a patch by Leigh Wedding <lwedding@bigpond.com>
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-ldapd@892 ef36b2f9-881f-0410-afb5-c4e39611909c
Diffstat (limited to 'nslcd/cfg.c')
-rw-r--r--nslcd/cfg.c44
1 files changed, 27 insertions, 17 deletions
diff --git a/nslcd/cfg.c b/nslcd/cfg.c
index 786fbf4..a193ffe 100644
--- a/nslcd/cfg.c
+++ b/nslcd/cfg.c
@@ -96,7 +96,8 @@ static void cfg_defaults(struct ldap_config *cfg)
cfg->ldc_sasl_mech=NULL;
cfg->ldc_sasl_realm=NULL;
cfg->ldc_usesasl=0;
- cfg->ldc_base=NULL;
+ for (i=0;i<NSS_LDAP_CONFIG_MAX_BASES;i++)
+ cfg->ldc_bases[i]=NULL;
cfg->ldc_scope=LDAP_SCOPE_SUBTREE;
cfg->ldc_deref=LDAP_DEREF_NEVER;
cfg->ldc_referrals=1;
@@ -549,25 +550,34 @@ static void set_base(const char *filename,int lnr,
exit(EXIT_FAILURE);
#endif /* not HAVE_LDAP_DOMAIN2DN */
}
- /* check if the value will be changed */
- if ((*var==NULL)||(strcmp(*var,value)!=0))
- {
- /* Note: we have a memory leak here if a single mapping is changed
- multiple times in one config (deemed not a problem) */
- *var=xstrdup(value);
- }
+ /* set the new value */
+ *var=xstrdup(value);
}
static void parse_base_statement(const char *filename,int lnr,
const char *keyword,char *line,
struct ldap_config *cfg)
{
- const char **var;
- var=base_get_var(get_map(&line));
- if (var==NULL)
- var=(const char **)&(cfg->ldc_base);
- check_argumentcount(filename,lnr,keyword,(line!=NULL)&&(*line!='\0'));
- set_base(filename,lnr,line,var);
+ const char **bases;
+ int i;
+ /* get the list of bases to update */
+ bases=base_get_var(get_map(&line));
+ if (bases==NULL)
+ bases=cfg->ldc_bases;
+ /* find the spot in the list of bases */
+ for (i=0;i<NSS_LDAP_CONFIG_MAX_BASES;i++)
+ {
+ if (bases[i]==NULL)
+ {
+ check_argumentcount(filename,lnr,keyword,(line!=NULL)&&(*line!='\0'));
+ set_base(filename,lnr,line,&bases[i]);
+ return;
+ }
+ }
+ /* no free spot found */
+ log_log(LOG_ERR,"%s:%d: maximum number of base options per map (%d) exceeded",
+ filename,lnr,NSS_LDAP_CONFIG_MAX_BASES);
+ exit(EXIT_FAILURE);
}
static void parse_scope_statement(const char *filename,int lnr,
@@ -1033,11 +1043,11 @@ void cfg_init(const char *fname)
/* TODO: check that if some tls options are set the ssl option should be set to on (just warn) */
#endif /* LDAP_OPT_X_TLS */
/* if basedn is not yet set, get if from the rootDSE */
- if (nslcd_cfg->ldc_base==NULL)
- nslcd_cfg->ldc_base=get_base_from_rootdse();
+ if (nslcd_cfg->ldc_bases[0]==NULL)
+ nslcd_cfg->ldc_bases[0]=get_base_from_rootdse();
/* TODO: handle the case gracefully when no LDAP server is available yet */
/* see if we have a valid basedn */
- if ((nslcd_cfg->ldc_base==NULL)||(nslcd_cfg->ldc_base[0]=='\0'))
+ if ((nslcd_cfg->ldc_bases[0]==NULL)||(nslcd_cfg->ldc_bases[0][0]=='\0'))
{
log_log(LOG_ERR,"no base defined in config and couldn't get one from server");
exit(EXIT_FAILURE);