]> git.sur5r.net Git - openldap/commitdiff
more about ITS#5940
authorPierangelo Masarati <ando@openldap.org>
Fri, 13 Feb 2009 01:12:56 +0000 (01:12 +0000)
committerPierangelo Masarati <ando@openldap.org>
Fri, 13 Feb 2009 01:12:56 +0000 (01:12 +0000)
servers/slapd/config.c
servers/slapd/config.h
servers/slapd/overlays/rwm.c

index 16e335e4047fccdc5afc67eb39daff59e438428c..f03a11be8e388bb6ea1f13848a46cae4f369e8f7 100644 (file)
@@ -86,7 +86,6 @@ int slapi_plugins_used = 0;
 
 static int fp_getline(FILE *fp, ConfigArgs *c);
 static void fp_getline_init(ConfigArgs *c);
-static int fp_parse_line(ConfigArgs *c);
 
 static char    *strtok_quote(char *line, char *sep, char **quote_ptr);
 static char *strtok_quote_ldif(char **line);
@@ -716,7 +715,7 @@ read_config_file(const char *fname, int depth, ConfigArgs *cf, ConfigTable *cft)
 
                c->argc = 0;
                ch_free( c->tline );
-               if ( fp_parse_line( c ) ) {
+               if ( config_fp_parse_line( c ) ) {
                        rc = 1;
                        goto done;
                }
@@ -1955,8 +1954,8 @@ fp_getline( FILE *fp, ConfigArgs *c )
        return(line[0] ? 1 : 0);
 }
 
-static int
-fp_parse_line(ConfigArgs *c)
+int
+config_fp_parse_line(ConfigArgs *c)
 {
        char *token;
        static char *const hide[] = {
index ae2faf1033c83671b74d41e7dc131dffc0fe092b..4dc902dac9336f07795f5997169dedd05efd52e9 100644 (file)
@@ -171,6 +171,8 @@ typedef struct config_args_s {
 #define value_dn values.v_dn.vdn_dn
 #define value_ndn values.v_dn.vdn_ndn
 
+int config_fp_parse_line(ConfigArgs *c);
+
 int config_register_schema(ConfigTable *ct, ConfigOCs *co);
 int config_del_vals(ConfigTable *cf, ConfigArgs *c);
 int config_get_vals(ConfigTable *ct, ConfigArgs *c);
index 8f81e040b5d647692275f228056652383dc8b0c0..b07b7e18a4d056f660c12582f3f97ea4dee55885 100644 (file)
@@ -1950,6 +1950,7 @@ slap_rewrite_unparse( BerVarray in, BerVarray *out )
 static int
 rwm_bva_rewrite_add(
        struct ldaprwmap        *rwmap,
+       int                     idx,
        const char              *argv[] )
 {
        char            *line;
@@ -1963,19 +1964,25 @@ rwm_bva_rewrite_add(
                AC_MEMCPY( &bv.bv_val[ len ], &bv.bv_val[ len + 1 ],
                        bv.bv_len - ( len + 1 ) );
                bv.bv_val[ bv.bv_len - 1 ] = '"';
-               ber_bvarray_add( &rwmap->rwm_bva_rewrite, &bv );
+
+               if ( idx == -1 ) {
+                       ber_bvarray_add( &rwmap->rwm_bva_rewrite, &bv );
+
+               } else {
+                       rwmap->rwm_bva_rewrite[ idx ] = bv;
+               }
        }
 
        return 0;
 }
 
 static int
-rwm_info_init( struct ldaprwmap *rwmap )
+rwm_info_init( struct rewrite_info ** rwm_rw )
 {
        char                    *rargv[ 3 ];
 
-       rwmap->rwm_rw = rewrite_info_init( REWRITE_MODE_USE_DEFAULT );
-       if ( rwmap->rwm_rw == NULL ) {
+       *rwm_rw = rewrite_info_init( REWRITE_MODE_USE_DEFAULT );
+       if ( *rwm_rw == NULL ) {
                return -1;
        }
 
@@ -1984,12 +1991,12 @@ rwm_info_init( struct ldaprwmap *rwmap )
        rargv[ 0 ] = "rewriteContext";
        rargv[ 1 ] = "searchFilter";
        rargv[ 2 ] = NULL;
-       rewrite_parse( rwmap->rwm_rw, "<suffix massage>", 1, 2, rargv );
+       rewrite_parse( *rwm_rw, "<suffix massage>", 1, 2, rargv );
 
        rargv[ 0 ] = "rewriteContext";
        rargv[ 1 ] = "default";
        rargv[ 2 ] = NULL;
-       rewrite_parse( rwmap->rwm_rw, "<suffix massage>", 2, 2, rargv );
+       rewrite_parse( *rwm_rw, "<suffix massage>", 2, 2, rargv );
 
        return 0;
 }
@@ -2061,7 +2068,48 @@ rwm_cf_gen( ConfigArgs *c )
                switch ( c->type ) {
                case RWM_CF_REWRITE:
                        if ( c->valx >= 0 ) {
-                               rc = 1;
+                               ConfigArgs ca = { 0 };
+                               int i;
+
+                               for ( i = 0; !BER_BVISNULL( &rwmap->rwm_bva_rewrite[ i ] ); i++ )
+                                       /* count'em */ ;
+
+                               if ( i >= c->valx ) {
+                                       rc = 1;
+                                       break;
+                               }
+
+                               ber_memfree( rwmap->rwm_bva_rewrite[ c->valx ].bv_val );
+                               for ( i = c->valx; !BER_BVISNULL( &rwmap->rwm_bva_rewrite[ i + 1 ] ); i++ )
+                               {
+                                       rwmap->rwm_bva_rewrite[ i ] = rwmap->rwm_bva_rewrite[ i + 1 ];
+                               }
+                               BER_BVZERO( &rwmap->rwm_bva_rewrite[ i ] );
+
+                               rewrite_info_delete( &rwmap->rwm_rw );
+                               assert( rwmap->rwm_rw == NULL );
+
+                               rc = rwm_info_init( &rwmap->rwm_rw );
+
+                               for ( i = 0; !BER_BVISNULL( &rwmap->rwm_bva_rewrite[ i ] ); i++ )
+                               {
+                                       ca.line = rwmap->rwm_bva_rewrite[ i ].bv_val;
+                                       ca.argc = 0;
+                                       config_fp_parse_line( &ca );
+                                       
+                                       if ( strcasecmp( ca.argv[ 0 ], "suffixmassage" ) == 0 ) {
+                                               rc = rwm_suffixmassage_config( &db, c->fname, c->lineno,
+                                                       ca.argc, ca.argv );
+
+                                       } else {
+                                               rc = rwm_rw_config( &db, c->fname, c->lineno,
+                                                       ca.argc, ca.argv );
+                                       }
+
+                                       ch_free( ca.tline );
+
+                                       assert( rc == 0 );
+                               }
 
                        } else if ( rwmap->rwm_rw != NULL ) {
                                rewrite_info_delete( &rwmap->rwm_rw );
@@ -2070,7 +2118,7 @@ rwm_cf_gen( ConfigArgs *c )
                                ber_bvarray_free( rwmap->rwm_bva_rewrite );
                                rwmap->rwm_bva_rewrite = NULL;
 
-                               rc = rwm_info_init( rwmap );
+                               rc = rwm_info_init( &rwmap->rwm_rw );
                        }
                        break;
 
@@ -2116,7 +2164,105 @@ rwm_cf_gen( ConfigArgs *c )
        switch ( c->type ) {
        case RWM_CF_REWRITE:
                if ( c->valx >= 0 ) {
-                       return 1;
+                       struct rewrite_info *rwm_rw = rwmap->rwm_rw;
+                       ConfigArgs ca = { 0 };
+                       int i, last;
+
+                       for ( last = 0; !BER_BVISNULL( &rwmap->rwm_bva_rewrite[ last ] ); last++ )
+                               /* count'em */ ;
+
+                       if ( c->valx > last ) {
+                               c->valx = last;
+                       }
+
+                       rwmap->rwm_rw = NULL;
+                       rc = rwm_info_init( &rwmap->rwm_rw );
+
+                       for ( i = 0; i < c->valx; i++ ) {
+                               ca.line = rwmap->rwm_bva_rewrite[ i ].bv_val;
+                               ca.argc = 0;
+                               config_fp_parse_line( &ca );
+
+                               argv0 = ca.argv[ 0 ];
+                               ca.argv[ 0 ] += STRLENOF( "rwm-" );
+                               
+                               if ( strcasecmp( ca.argv[ 0 ], "suffixmassage" ) == 0 ) {
+                                       rc = rwm_suffixmassage_config( &db, c->fname, c->lineno,
+                                               ca.argc, ca.argv );
+
+                               } else {
+                                       rc = rwm_rw_config( &db, c->fname, c->lineno,
+                                               ca.argc, ca.argv );
+                               }
+
+                               ca.argv[ 0 ] = argv0;
+
+                               ch_free( ca.tline );
+
+                               assert( rc == 0 );
+                       }
+
+                       argv0 = c->argv[ idx0 ];
+                       if ( strncasecmp( argv0, "rwm-", STRLENOF( "rwm-" ) ) != 0 ) {
+                               return 1;
+                       }
+                       c->argv[ idx0 ] += STRLENOF( "rwm-" );
+                       if ( strcasecmp( c->argv[ idx0 ], "suffixmassage" ) == 0 ) {
+                               rc = rwm_suffixmassage_config( &db, c->fname, c->lineno,
+                                       c->argc - idx0, &c->argv[ idx0 ] );
+
+                       } else {
+                               rc = rwm_rw_config( &db, c->fname, c->lineno,
+                                       c->argc - idx0, &c->argv[ idx0 ] );
+                       }
+                       c->argv[ idx0 ] = argv0;
+                       if ( rc != 0 ) {
+                               rewrite_info_delete( &rwmap->rwm_rw );
+                               assert( rwmap->rwm_rw == NULL );
+
+                               rwmap->rwm_rw = rwm_rw;
+                               return 1;
+                       }
+
+                       for ( i = c->valx; !BER_BVISNULL( &rwmap->rwm_bva_rewrite[ i ] ); i++ )
+                       {
+                               ca.line = rwmap->rwm_bva_rewrite[ i ].bv_val;
+                               ca.argc = 0;
+                               config_fp_parse_line( &ca );
+                               
+                               argv0 = ca.argv[ 0 ];
+                               ca.argv[ 0 ] += STRLENOF( "rwm-" );
+                               
+                               if ( strcasecmp( ca.argv[ 0 ], "suffixmassage" ) == 0 ) {
+                                       rc = rwm_suffixmassage_config( &db, c->fname, c->lineno,
+                                               ca.argc, ca.argv );
+
+                               } else {
+                                       rc = rwm_rw_config( &db, c->fname, c->lineno,
+                                               ca.argc, ca.argv );
+                               }
+
+                               ca.argv[ 0 ] = argv0;
+
+                               ch_free( ca.tline );
+
+                               assert( rc == 0 );
+                       }
+
+                       rwmap->rwm_bva_rewrite = ch_realloc( rwmap->rwm_bva_rewrite,
+                               ( last + 2 )*sizeof( struct berval ) );
+
+                       for ( i = last - 1; i >= c->valx; i-- )
+                       {
+                               rwmap->rwm_bva_rewrite[ i + 1 ] = rwmap->rwm_bva_rewrite[ i ];
+                       }
+
+                       rwm_bva_rewrite_add( rwmap, c->valx, &c->argv[ idx0 ] );
+
+                       rewrite_info_delete( &rwm_rw );
+                       assert( rwm_rw == NULL );
+
+                       break;
                }
 
                argv0 = c->argv[ idx0 ];
@@ -2137,7 +2283,7 @@ rwm_cf_gen( ConfigArgs *c )
                        return 1;
 
                } else {
-                       rwm_bva_rewrite_add( rwmap, &c->argv[ idx0 ] );
+                       rwm_bva_rewrite_add( rwmap, -1, &c->argv[ idx0 ] );
                }
                break;
 
@@ -2203,7 +2349,7 @@ rwm_db_init(
 
        rwmap = (struct ldaprwmap *)ch_calloc( 1, sizeof( struct ldaprwmap ) );
 
-       rc = rwm_info_init( rwmap );
+       rc = rwm_info_init( &rwmap->rwm_rw );
 
 error_return:;
        on->on_bi.bi_private = (void *)rwmap;