]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/config.c
Sync with HEAD
[openldap] / servers / slapd / config.c
index 851fdae3b9d77d0234b7f6c86a78dc30a5f0b3dd..acf465c2fd834c247386730136b3f29bee335bd6 100644 (file)
@@ -92,7 +92,7 @@ new_config_args( BackendDB *be, const char *fname, int lineno, int argc, char **
        c->argc   = argc;
        c->argv   = argv; 
        c->lineno = lineno;
-       snprintf( c->log, sizeof( c->log ), "%s: line %lu", fname, lineno );
+       snprintf( c->log, sizeof( c->log ), "%s: line %d", fname, lineno );
        return(c);
 }
 
@@ -473,17 +473,34 @@ init_config_ocs( ConfigOCs *ocs ) {
 int
 config_parse_vals(ConfigTable *ct, ConfigArgs *c, int valx)
 {
-       int rc = 0;
+       int     rc = 0;
+       char    *saveline = NULL;
 
        snprintf( c->log, sizeof( c->log ), "%s: value #%d",
                ct->ad->ad_cname.bv_val, valx );
        c->argc = 1;
        c->argv[0] = ct->ad->ad_cname.bv_val;
+
+       if ( ( ct->arg_type & ARG_QUOTE ) && c->line[ 0 ] != '"' ) {
+               ber_len_t       len;
+
+               saveline = c->line;
+               len = strlen( c->line );
+               c->line = ch_malloc( len + STRLENOF( "\"\"" ) + 1 );
+               sprintf( c->line, "\"%s\"", saveline );
+       }
+
        if ( fp_parse_line( c ) ) {
                rc = 1;
        } else {
                rc = config_check_vals( ct, c, 1 );
        }
+
+       if ( saveline ) {
+               ch_free( c->line );
+               c->line = saveline;
+       }
+
        if ( rc )
                rc = LDAP_CONSTRAINT_VIOLATION;
 
@@ -494,12 +511,24 @@ config_parse_vals(ConfigTable *ct, ConfigArgs *c, int valx)
 int
 config_parse_add(ConfigTable *ct, ConfigArgs *c)
 {
-       int rc = 0;
+       int     rc = 0;
+       char    *saveline = NULL;
 
        snprintf( c->log, sizeof( c->log ), "%s: value #%d",
                ct->ad->ad_cname.bv_val, c->valx );
        c->argc = 1;
        c->argv[0] = ct->ad->ad_cname.bv_val;
+
+       if ( ( ct->arg_type & ARG_QUOTE ) && c->line[ 0 ] != '"' ) {
+               ber_len_t       len;
+
+               saveline = c->line;
+               len = strlen( c->line );
+                       
+               c->line = ch_malloc( len + STRLENOF( "\"\"" ) + 1 );
+               sprintf( c->line, "\"%s\"", saveline );
+       }
+
        if ( fp_parse_line( c ) ) {
                rc = 1;
        } else {
@@ -507,6 +536,11 @@ config_parse_add(ConfigTable *ct, ConfigArgs *c)
                rc = config_add_vals( ct, c );
        }
 
+       if ( saveline ) {
+               ch_free( c->line );
+               c->line = saveline;
+       }
+
        ch_free( c->tline );
        return rc;
 }
@@ -686,18 +720,6 @@ read_config_file(const char *fname, int depth, ConfigArgs *cf, ConfigTable *cft)
                }
        }
 
-       if ( BER_BVISNULL( &frontendDB->be_schemadn ) ) {
-               ber_str2bv( SLAPD_SCHEMA_DN, STRLENOF( SLAPD_SCHEMA_DN ), 1,
-                       &frontendDB->be_schemadn );
-               rc = dnNormalize( 0, NULL, NULL, &frontendDB->be_schemadn, &frontendDB->be_schemandn, NULL );
-               if ( rc != LDAP_SUCCESS ) {
-                       Debug(LDAP_DEBUG_ANY, "%s: "
-                               "unable to normalize default schema DN \"%s\"\n",
-                               c->log, frontendDB->be_schemadn.bv_val, 0 );
-                       /* must not happen */
-                       assert( 0 );
-               }
-       }
        rc = 0;
 
 leave:
@@ -731,6 +753,9 @@ verbs_to_mask(int argc, char *argv[], slap_verbmasks *v, slap_mask_t *m) {
        return(0);
 }
 
+/* Mask keywords that represent multiple bits should occur before single
+ * bit keywords in the verbmasks array.
+ */
 int
 mask_to_verbs(slap_verbmasks *v, slap_mask_t m, BerVarray *bva) {
        int i;
@@ -740,11 +765,28 @@ mask_to_verbs(slap_verbmasks *v, slap_mask_t m, BerVarray *bva) {
                if (!v[i].mask) continue;
                if (( m & v[i].mask ) == v[i].mask ) {
                        value_add_one( bva, &v[i].word );
+                       m ^= v[i].mask;
+                       if ( !m ) break;
                }
        }
        return 0;
 }
 
+int
+enum_to_verb(slap_verbmasks *v, slap_mask_t m, struct berval *bv) {
+       int i;
+
+       for (i=0; !BER_BVISNULL(&v[i].word); i++) {
+               if ( m == v[i].mask ) {
+                       if ( bv != NULL ) {
+                               *bv = v[i].word;
+                       }
+                       return i;
+               }
+       }
+       return -1;
+}
+
 static slap_verbmasks tlskey[] = {
        { BER_BVC("no"),        SB_TLS_OFF },
        { BER_BVC("yes"),       SB_TLS_ON },
@@ -753,9 +795,7 @@ static slap_verbmasks tlskey[] = {
 };
 
 static slap_verbmasks methkey[] = {
-#if 0
        { BER_BVC("none"),      LDAP_AUTH_NONE },
-#endif
        { BER_BVC("simple"),    LDAP_AUTH_SIMPLE },
 #ifdef HAVE_CYRUS_SASL
        { BER_BVC("sasl"),      LDAP_AUTH_SASL },
@@ -1151,7 +1191,7 @@ int config_generic_wrapper( Backend *be, const char *fname, int lineno,
        c.argc = argc;
        c.argv = argv;
        c.valx = -1;
-       sprintf( c.log, "%s: line %lu", fname, lineno );
+       sprintf( c.log, "%s: line %d", fname, lineno );
 
        rc = SLAP_CONF_UNKNOWN;
        ct = config_find_keyword( be->be_cf_ocs->co_table, &c );