]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/config.c
ITS#5276 from HEAD
[openldap] / servers / slapd / config.c
index 6336e3a58f7f3c09ff11b4e05848394adb6a2113..d8c2a035c29a6bb399728bd0fda20ac293202869 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2005 The OpenLDAP Foundation.
+ * Copyright 1998-2007 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -308,7 +308,7 @@ int config_set_vals(ConfigTable *Conf, ConfigArgs *c) {
                return(0);
        }
        if(arg_type & ARG_OFFSET) {
-               if (c->be)
+               if (c->be && c->table == Cft_Database)
                        ptr = c->be->be_private;
                else if (c->bi)
                        ptr = c->bi->bi_private;
@@ -399,7 +399,7 @@ config_get_vals(ConfigTable *cf, ConfigArgs *c)
                if ( rc ) return rc;
        } else {
                if ( cf->arg_type & ARG_OFFSET ) {
-                       if ( c->be )
+                       if (c->be && c->table == Cft_Database)
                                ptr = c->be->be_private;
                        else if ( c->bi )
                                ptr = c->bi->bi_private;
@@ -750,6 +750,7 @@ read_config_file(const char *fname, int depth, ConfigArgs *cf, ConfigTable *cft)
 
                ct = config_find_keyword( cft, c );
                if ( ct ) {
+                       c->table = Cft_Global;
                        rc = config_add_vals( ct, c );
                        if ( !rc ) continue;
 
@@ -770,6 +771,7 @@ read_config_file(const char *fname, int depth, ConfigArgs *cf, ConfigTable *cft)
                        if ( c->bi->bi_cf_ocs ) {
                                ct = config_find_keyword( c->bi->bi_cf_ocs->co_table, c );
                                if ( ct ) {
+                                       c->table = c->bi->bi_cf_ocs->co_type;
                                        rc = config_add_vals( ct, c );
                                }
                        }
@@ -798,6 +800,7 @@ read_config_file(const char *fname, int depth, ConfigArgs *cf, ConfigTable *cft)
                        if ( c->be->be_cf_ocs ) {
                                ct = config_find_keyword( c->be->be_cf_ocs->co_table, c );
                                if ( ct ) {
+                                       c->table = c->be->be_cf_ocs->co_type;
                                        rc = config_add_vals( ct, c );
                                }
                        }
@@ -856,6 +859,10 @@ read_config_file(const char *fname, int depth, ConfigArgs *cf, ConfigTable *cft)
        rc = 0;
 
 done:
+       if ( cf ) {
+               cf->be = c->be;
+               cf->bi = c->bi;
+       }
        ch_free(c->tline);
        fclose(fp);
        ch_free(c->argv);
@@ -1028,15 +1035,21 @@ static slap_verbmasks methkey[] = {
 
 static slap_cf_aux_table bindkey[] = {
        { BER_BVC("uri="), offsetof(slap_bindconf, sb_uri), 'b', 1, NULL },
-       { BER_BVC("starttls="), offsetof(slap_bindconf, sb_tls), 'd', 0, tlskey },
-       { BER_BVC("bindmethod="), offsetof(slap_bindconf, sb_method), 'd', 0, methkey },
-       { BER_BVC("binddn="), offsetof(slap_bindconf, sb_binddn), 'b', 1, NULL },
+       { BER_BVC("starttls="), offsetof(slap_bindconf, sb_tls), 'i', 0, tlskey },
+       { BER_BVC("bindmethod="), offsetof(slap_bindconf, sb_method), 'i', 0, methkey },
+       { BER_BVC("binddn="), offsetof(slap_bindconf, sb_binddn), 'b', 1, dnNormalize },
        { BER_BVC("credentials="), offsetof(slap_bindconf, sb_cred), 'b', 1, NULL },
        { BER_BVC("saslmech="), offsetof(slap_bindconf, sb_saslmech), 'b', 0, NULL },
        { BER_BVC("secprops="), offsetof(slap_bindconf, sb_secprops), 's', 0, NULL },
        { BER_BVC("realm="), offsetof(slap_bindconf, sb_realm), 'b', 0, NULL },
+#ifndef SLAP_AUTHZ_SYNTAX
        { BER_BVC("authcID="), offsetof(slap_bindconf, sb_authcId), 'b', 0, NULL },
        { BER_BVC("authzID="), offsetof(slap_bindconf, sb_authzId), 'b', 1, NULL },
+#else /* SLAP_AUTHZ_SYNTAX */
+       { BER_BVC("authcID="), offsetof(slap_bindconf, sb_authcId), 'b', 0, authzNormalize },
+       { BER_BVC("authzID="), offsetof(slap_bindconf, sb_authzId), 'b', 1, authzNormalize },
+#endif /* SLAP_AUTHZ_SYNTAX */
+
        { BER_BVNULL, 0, 0, 0, NULL }
 };
 
@@ -1064,26 +1077,39 @@ slap_cf_aux_table_parse( const char *word, void *dst, slap_cf_aux_table *tab0, L
 
                        case 'b':
                                bptr = (struct berval *)((char *)dst + tab->off);
-                               ber_str2bv( val, 0, 1, bptr );
-                               break;
+                               if ( tab->aux != NULL ) {
+                                       struct berval   dn;
+                                       slap_mr_normalize_func *normalize = (slap_mr_normalize_func *)tab->aux;
 
-                       case 'd':
-                               assert( tab->aux != NULL );
-                               iptr = (int *)((char *)dst + tab->off);
+                                       ber_str2bv( val, 0, 0, &dn );
+                                       rc = normalize( 0, NULL, NULL, &dn, bptr, NULL );
 
-                               rc = 1;
-                               for ( j = 0; !BER_BVISNULL( &tab->aux[j].word ); j++ ) {
-                                       if ( !strcasecmp( val, tab->aux[j].word.bv_val ) ) {
-                                               *iptr = tab->aux[j].mask;
-                                               rc = 0;
-                                       }
+                               } else {
+                                       ber_str2bv( val, 0, 1, bptr );
+                                       rc = 0;
                                }
                                break;
 
                        case 'i':
                                iptr = (int *)((char *)dst + tab->off);
 
-                               rc = lutil_atoix( iptr, val, 0 );
+                               if ( tab->aux != NULL ) {
+                                       slap_verbmasks *aux = (slap_verbmasks *)tab->aux;
+
+                                       assert( aux != NULL );
+
+                                       rc = 1;
+                                       for ( j = 0; !BER_BVISNULL( &aux[j].word ); j++ ) {
+                                               if ( !strcasecmp( val, aux[j].word.bv_val ) ) {
+                                                       *iptr = aux[j].mask;
+                                                       rc = 0;
+                                                       break;
+                                               }
+                                       }
+
+                               } else {
+                                       rc = lutil_atoix( iptr, val, 0 );
+                               }
                                break;
 
                        case 'u':
@@ -1120,7 +1146,7 @@ slap_cf_aux_table_parse( const char *word, void *dst, slap_cf_aux_table *tab0, L
 int
 slap_cf_aux_table_unparse( void *src, struct berval *bv, slap_cf_aux_table *tab0 )
 {
-       char buf[BUFSIZ], *ptr;
+       char buf[AC_LINE_MAX], *ptr;
        slap_cf_aux_table *tab;
        struct berval tmp;
 
@@ -1139,6 +1165,7 @@ slap_cf_aux_table_unparse( void *src, struct berval *bv, slap_cf_aux_table *tab0
                case 'b':
                        bptr = (struct berval *)((char *)src + tab->off);
                        cptr = &bptr->bv_val;
+
                case 's':
                        if ( *cptr ) {
                                *ptr++ = ' ';
@@ -1149,25 +1176,26 @@ slap_cf_aux_table_unparse( void *src, struct berval *bv, slap_cf_aux_table *tab0
                        }
                        break;
 
-               case 'd':
-                       assert( tab->aux != NULL );
+               case 'i':
                        iptr = (int *)((char *)src + tab->off);
-               
-                       for ( i = 0; !BER_BVISNULL( &tab->aux[i].word ); i++ ) {
-                               if ( *iptr == tab->aux[i].mask ) {
-                                       *ptr++ = ' ';
-                                       ptr = lutil_strcopy( ptr, tab->key.bv_val );
-                                       ptr = lutil_strcopy( ptr, tab->aux[i].word.bv_val );
-                                       break;
+
+                       if ( tab->aux != NULL ) {
+                               slap_verbmasks *aux = (slap_verbmasks *)tab->aux;
+
+                               for ( i = 0; !BER_BVISNULL( &aux[i].word ); i++ ) {
+                                       if ( *iptr == aux[i].mask ) {
+                                               *ptr++ = ' ';
+                                               ptr = lutil_strcopy( ptr, tab->key.bv_val );
+                                               ptr = lutil_strcopy( ptr, aux[i].word.bv_val );
+                                               break;
+                                       }
                                }
-                       }
-                       break;
 
-               case 'i':
-                       iptr = (int *)((char *)src + tab->off);
-                       *ptr++ = ' ';
-                       ptr = lutil_strcopy( ptr, tab->key.bv_val );
-                       ptr += snprintf( ptr, sizeof( buf ) - ( ptr - buf ), "%d", *iptr );
+                       } else {
+                               *ptr++ = ' ';
+                               ptr = lutil_strcopy( ptr, tab->key.bv_val );
+                               ptr += snprintf( ptr, sizeof( buf ) - ( ptr - buf ), "%d", *iptr );
+                       }
                        break;
 
                case 'u':
@@ -1307,7 +1335,7 @@ strtok_quote( char *line, char *sep, char **quote_ptr )
        return( tmp );
 }
 
-static char    buf[BUFSIZ];
+static char    buf[AC_LINE_MAX];
 static char    *line;
 static size_t lmax, lcur;
 
@@ -1315,7 +1343,7 @@ static size_t lmax, lcur;
        do { \
                size_t len = strlen( buf ); \
                while ( lcur + len + 1 > lmax ) { \
-                       lmax += BUFSIZ; \
+                       lmax += AC_LINE_MAX; \
                        line = (char *) ch_realloc( line, lmax ); \
                } \
                strcpy( line + lcur, buf ); \
@@ -1497,11 +1525,15 @@ int config_generic_wrapper( Backend *be, const char *fname, int lineno,
        c.argc = argc;
        c.argv = argv;
        c.valx = -1;
+       c.line = line;
+       c.op = SLAP_CONFIG_ADD;
        snprintf( c.log, sizeof( c.log ), "%s: line %d", fname, lineno );
 
        rc = SLAP_CONF_UNKNOWN;
        ct = config_find_keyword( be->be_cf_ocs->co_table, &c );
-       if ( ct )
+       if ( ct ) {
+               c.table = be->be_cf_ocs->co_type;
                rc = config_add_vals( ct, &c );
+       }
        return rc;
 }