X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fconfig.c;h=c1f05a635e8857b8cf89e520481f6c0a498ece98;hb=20965abe9c5bb80d79e5ad791cd2b59ec60259b5;hp=787449c694445092629548d502b87eecad5df7d0;hpb=d611a4b49a00238ed32ae84c68f27c6a0ef2273a;p=openldap diff --git a/servers/slapd/config.c b/servers/slapd/config.c index 787449c694..c1f05a635e 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -34,7 +34,6 @@ #include #include -#include "ldap_pvt.h" #include "slap.h" #ifdef LDAP_SLAPI #include "slapi/slapi.h" @@ -103,7 +102,6 @@ read_config( const char *fname, int depth ) static BackendDB *be = NULL; char *next; - vals[1].bv_val = NULL; if ( depth == 0 ) { @@ -191,6 +189,28 @@ read_config( const char *fname, int depth ) return( 1 ); } + /* set local security factor */ + } else if ( strcasecmp( cargv[0], "localSSF" ) == 0 ) { + long ssf; + if ( cargc < 2 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: missing ssf in \"localSSF \" line\n", + fname, lineno, 0 ); + return( 1 ); + } + + ssf = atol( cargv[1] ); + + if( ssf < 0 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: invalid ssf value (%ld) in " + "\"localSSF \" line.\n", + fname, lineno, ssf ); + return( 1 ); + } + + local_ssf = ssf; + /* set thread concurrency */ } else if ( strcasecmp( cargv[0], "concurrency" ) == 0 ) { int c; @@ -220,6 +240,82 @@ read_config( const char *fname, int depth ) ldap_pvt_thread_set_concurrency( c ); + /* set substring initial/final index minimum length */ + } else if ( strcasecmp( cargv[0], "index_substr_if_minlen" ) == 0 ) { + long min; + if ( cargc < 2 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: missing min in \"index_substr_if_minlen \" line\n", + fname, lineno, 0 ); + return( 1 ); + } + min = atoi( cargv[1] ); + if( min < 1 || min > index_substr_if_maxlen ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: invalid min value (%ld) in " + "\"index_substr_if_minlen \" line.\n", + fname, lineno, min ); + return( 1 ); + } + index_substr_if_minlen = min; + + /* set substring initial/final index maximum length */ + } else if ( strcasecmp( cargv[0], "index_substr_if_maxlen" ) == 0 ) { + long max; + if ( cargc < 2 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: missing max in \"index_substr_if_maxlen \" line\n", + fname, lineno, 0 ); + return( 1 ); + } + max = atol( cargv[1] ); + if( max < 1 || max < index_substr_if_minlen ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: invalid max value (%ld) in " + "\"index_substr_maxlen \" line.\n", + fname, lineno, max ); + return( 1 ); + } + index_substr_if_maxlen = max; + + /* set substring any index len */ + } else if ( strcasecmp( cargv[0], "index_substr_any_len" ) == 0 ) { + long len; + if ( cargc < 2 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: missing len in \"index_substr_any_len \" line\n", + fname, lineno, 0 ); + return( 1 ); + } + len = atol( cargv[1] ); + if( len < 1 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: invalid len value (%ld) in " + "\"index_substr_any_len \" line.\n", + fname, lineno, len ); + return( 1 ); + } + index_substr_any_len = len; + + /* set substring any index step */ + } else if ( strcasecmp( cargv[0], "index_substr_any_step" ) == 0 ) { + long step; + if ( cargc < 2 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: missing step in \"index_substr_any_step \" line\n", + fname, lineno, 0 ); + return( 1 ); + } + step = atol( cargv[1] ); + if( step < 1 ) { + Debug( LDAP_DEBUG_ANY, + "%s: line %d: invalid step value (%ld) in " + "\"index_substr_any_step \" line.\n", + fname, lineno, step ); + return( 1 ); + } + index_substr_any_step = step; + /* set sockbuf max */ } else if ( strcasecmp( cargv[0], "sockbuf_max_incoming" ) == 0 ) { long max; @@ -1134,7 +1230,6 @@ restrict_unknown:; be->be_requires = requires; } - /* required security factors */ } else if ( strcasecmp( cargv[0], "security" ) == 0 ) { slap_ssf_set_t *set; @@ -1250,25 +1345,6 @@ restrict_unknown:; if( value_add( &default_referral, vals ) ) return LDAP_OTHER; - /* start of a new database definition */ - } else if ( strcasecmp( cargv[0], "debug" ) == 0 ) { - int level; - if ( cargc < 3 ) { - Debug( LDAP_DEBUG_ANY, - "%s: line %d: Error in debug directive, \"debug subsys level\"\n", - fname, lineno, 0 ); - return( 1 ); - } - level = strtol( cargv[2], &next, 10 ); - if ( next == NULL || next[0] != '\0' ){ - Debug( LDAP_DEBUG_ANY, - "%s: line %d: unable to parse level \"%s\" in debug directive, " - "\"debug \"\n", fname, lineno , cargv[2] ); - return( 1 ); - } - - if ( level <= 0 ) level = lutil_mnem2level( cargv[2] ); - lutil_set_debug_level( cargv[1], level ); /* specify an Object Identifier macro */ } else if ( strcasecmp( cargv[0], "objectidentifier" ) == 0 ) { rc = parse_oidm( fname, lineno, cargc, cargv ); @@ -1459,6 +1535,14 @@ restrict_unknown:; } else { int nr = -1; + if ( SLAP_MONITOR( be ) ) { + Debug( LDAP_DEBUG_ANY, "%s: line %d: " + "\"replica\" should not be used " + "inside monitor database\n", + fname, lineno, 0 ); + /* FIXME: turn into an error? */ + } + for ( i = 1; i < cargc; i++ ) { if ( strncasecmp( cargv[i], "host=", 5 ) == 0 ) { @@ -1635,7 +1719,15 @@ restrict_unknown:; return( 1 ); } if ( be ) { + if ( SLAP_MONITOR( be ) ) { + Debug( LDAP_DEBUG_ANY, "%s: line %d: " + "\"replogfile\" should not be used " + "inside monitor database\n", + fname, lineno, 0 ); + /* FIXME: turn into an error? */ + } be->be_replogfile = ch_strdup( cargv[1] ); + } else { replogfile = ch_strdup( cargv[1] ); } @@ -2251,20 +2343,22 @@ add_syncrepl( } si->si_bindmethod = LDAP_AUTH_SIMPLE; si->si_schemachecking = 0; - ber_str2bv( "(objectclass=*)", STRLENOF("(objectclass=*)"), 0, + ber_str2bv( "(objectclass=*)", STRLENOF("(objectclass=*)"), 1, &si->si_filterstr ); si->si_base.bv_val = NULL; si->si_scope = LDAP_SCOPE_SUBTREE; si->si_attrsonly = 0; - si->si_attrs = (char **) ch_calloc( 1, sizeof( char * )); - si->si_attrs[0] = NULL; - si->si_exattrs = (char **) ch_calloc( 1, sizeof( char * )); - si->si_exattrs[0] = NULL; + si->si_anlist = (AttributeName *) ch_calloc( 1, sizeof( AttributeName )); + si->si_exanlist = (AttributeName *) ch_calloc( 1, sizeof( AttributeName )); + si->si_attrs = NULL; + si->si_allattrs = 0; + si->si_allopattrs = 0; + si->si_exattrs = NULL; si->si_type = LDAP_SYNC_REFRESH_ONLY; si->si_interval = 86400; - si->si_retryinterval = 0; - si->si_retrynum_init = 0; - si->si_retrynum = 0; + si->si_retryinterval = NULL; + si->si_retrynum_init = NULL; + si->si_retrynum = NULL; si->si_syncCookie.ctxcsn = NULL; si->si_syncCookie.octet_str = NULL; si->si_syncCookie.sid = -1; @@ -2289,42 +2383,8 @@ add_syncrepl( } if ( rc < 0 || duplicated_replica_id ) { - syncinfo_t *si_entry; - /* Something bad happened - back out */ Debug( LDAP_DEBUG_ANY, "failed to add syncinfo\n", 0, 0, 0 ); - - /* If error, remove all syncinfo */ - LDAP_STAILQ_FOREACH( si_entry, &be->be_syncinfo, si_next ) { - if ( si_entry->si_updatedn.bv_val ) { - ch_free( si->si_updatedn.bv_val ); - } - if ( si_entry->si_filterstr.bv_val ) { - ch_free( si->si_filterstr.bv_val ); - } - if ( si_entry->si_attrs ) { - int i = 0; - while ( si_entry->si_attrs[i] != NULL ) { - ch_free( si_entry->si_attrs[i] ); - i++; - } - ch_free( si_entry->si_attrs ); - } - if ( si_entry->si_exattrs ) { - int i = 0; - while ( si_entry->si_exattrs[i] != NULL ) { - ch_free( si_entry->si_exattrs[i] ); - i++; - } - ch_free( si_entry->si_exattrs ); - } - } - - while ( !LDAP_STAILQ_EMPTY( &be->be_syncinfo )) { - si_entry = LDAP_STAILQ_FIRST( &be->be_syncinfo ); - LDAP_STAILQ_REMOVE_HEAD( &be->be_syncinfo, si_next ); - ch_free( si_entry ); - } - LDAP_STAILQ_INIT( &be->be_syncinfo ); + syncinfo_free( si ); return 1; } else { Debug( LDAP_DEBUG_CONFIG, @@ -2339,48 +2399,54 @@ add_syncrepl( } } +/* NOTE: used & documented in slapd.conf(5) */ #define IDSTR "rid" #define PROVIDERSTR "provider" -#define SUFFIXSTR "suffix" +#define TYPESTR "type" +#define INTERVALSTR "interval" +#define SEARCHBASESTR "searchbase" +#define FILTERSTR "filter" +#define SCOPESTR "scope" +#define ATTRSSTR "attrs" +#define ATTRSONLYSTR "attrsonly" +#define SLIMITSTR "sizelimit" +#define TLIMITSTR "timelimit" +#define SCHEMASTR "schemachecking" #define UPDATEDNSTR "updatedn" #define BINDMETHSTR "bindmethod" -#define SIMPLESTR "simple" -#define SASLSTR "sasl" +#define SIMPLESTR "simple" +#define SASLSTR "sasl" #define BINDDNSTR "binddn" -#define CREDSTR "credentials" -#define OLDAUTHCSTR "bindprincipal" +#define SASLMECHSTR "saslmech" #define AUTHCSTR "authcID" #define AUTHZSTR "authzID" -#define SRVTABSTR "srvtab" -#define SASLMECHSTR "saslmech" +#define CREDSTR "credentials" #define REALMSTR "realm" #define SECPROPSSTR "secprops" -#define STARTTLSSTR "starttls" -#define CRITICALSTR "critical" -#define SCHEMASTR "schemachecking" -#define FILTERSTR "filter" -#define SEARCHBASESTR "searchbase" -#define SCOPESTR "scope" -#define ATTRSSTR "attrs" -#define ATTRSONLYSTR "attrsonly" +/* FIXME: undocumented */ +#define OLDAUTHCSTR "bindprincipal" +#define STARTTLSSTR "starttls" +#define CRITICALSTR "critical" #define EXATTRSSTR "exattrs" -#define TYPESTR "type" -#define INTERVALSTR "interval" +#define MANAGEDSAITSTR "manageDSAit" +#define RETRYSTR "retry" + +/* FIXME: unused */ #define LASTMODSTR "lastmod" -#define LMREQSTR "req" #define LMGENSTR "gen" #define LMNOSTR "no" -#define MANAGEDSAITSTR "manageDSAit" -#define SLIMITSTR "sizelimit" -#define TLIMITSTR "timelimit" - -#define RETRYSTR "retry" +#define LMREQSTR "req" +#define SRVTABSTR "srvtab" +#define SUFFIXSTR "suffix" +/* mandatory */ #define GOT_ID 0x0001 -#define GOT_PROVIDER 0x0002 +#define GOT_PROVIDER 0x0002 #define GOT_METHOD 0x0004 -#define GOT_ALL 0x0007 + +/* check */ +#define GOT_ALL (GOT_ID|GOT_PROVIDER|GOT_METHOD) static int parse_syncrepl_line( @@ -2395,10 +2461,12 @@ parse_syncrepl_line( int nr_attr = 0; for ( i = 1; i < cargc; i++ ) { - if ( !strncasecmp( cargv[ i ], IDSTR, sizeof( IDSTR ) - 1 )) { + if ( !strncasecmp( cargv[ i ], IDSTR "=", + STRLENOF( IDSTR "=" ) ) ) + { int tmp; /* '\0' string terminator accounts for '=' */ - val = cargv[ i ] + sizeof( IDSTR ); + val = cargv[ i ] + STRLENOF( IDSTR "=" ); tmp= atoi( val ); if ( tmp >= 1000 || tmp < 0 ) { fprintf( stderr, "Error: parse_syncrepl_line: " @@ -2407,38 +2475,40 @@ parse_syncrepl_line( } si->si_rid = tmp; gots |= GOT_ID; - } else if ( !strncasecmp( cargv[ i ], PROVIDERSTR, - sizeof( PROVIDERSTR ) - 1 )) { - val = cargv[ i ] + sizeof( PROVIDERSTR ); + } else if ( !strncasecmp( cargv[ i ], PROVIDERSTR "=", + STRLENOF( PROVIDERSTR "=" ) ) ) + { + val = cargv[ i ] + STRLENOF( PROVIDERSTR "=" ); si->si_provideruri = ch_strdup( val ); si->si_provideruri_bv = (BerVarray) ch_calloc( 2, sizeof( struct berval )); ber_str2bv( si->si_provideruri, strlen( si->si_provideruri ), - 0, &si->si_provideruri_bv[0] ); + 1, &si->si_provideruri_bv[0] ); si->si_provideruri_bv[1].bv_len = 0; si->si_provideruri_bv[1].bv_val = NULL; gots |= GOT_PROVIDER; - } else if ( !strncasecmp( cargv[ i ], STARTTLSSTR, - sizeof(STARTTLSSTR) - 1 ) ) + } else if ( !strncasecmp( cargv[ i ], STARTTLSSTR "=", + STRLENOF(STARTTLSSTR "=") ) ) { - val = cargv[ i ] + sizeof( STARTTLSSTR ); + val = cargv[ i ] + STRLENOF( STARTTLSSTR "=" ); if( !strcasecmp( val, CRITICALSTR ) ) { si->si_tls = SYNCINFO_TLS_CRITICAL; } else { si->si_tls = SYNCINFO_TLS_ON; } - } else if ( !strncasecmp( cargv[ i ], - UPDATEDNSTR, sizeof( UPDATEDNSTR ) - 1 ) ) + } else if ( !strncasecmp( cargv[ i ], UPDATEDNSTR "=", + STRLENOF( UPDATEDNSTR "=" ) ) ) { - struct berval updatedn = {0, NULL}; - val = cargv[ i ] + sizeof( UPDATEDNSTR ); + struct berval updatedn = BER_BVNULL; + + val = cargv[ i ] + STRLENOF( UPDATEDNSTR "=" ); ber_str2bv( val, 0, 0, &updatedn ); ch_free( si->si_updatedn.bv_val ); dnNormalize( 0, NULL, NULL, &updatedn, &si->si_updatedn, NULL ); - } else if ( !strncasecmp( cargv[ i ], BINDMETHSTR, - sizeof( BINDMETHSTR ) - 1 ) ) + } else if ( !strncasecmp( cargv[ i ], BINDMETHSTR "=", + STRLENOF( BINDMETHSTR "=" ) ) ) { - val = cargv[ i ] + sizeof( BINDMETHSTR ); + val = cargv[ i ] + STRLENOF( BINDMETHSTR "=" ); if ( !strcasecmp( val, SIMPLESTR )) { si->si_bindmethod = LDAP_AUTH_SIMPLE; gots |= GOT_METHOD; @@ -2449,48 +2519,60 @@ parse_syncrepl_line( #else /* HAVE_CYRUS_SASL */ fprintf( stderr, "Error: parse_syncrepl_line: " "not compiled with SASL support\n" ); - return 1; + return -1; #endif /* HAVE_CYRUS_SASL */ } else { si->si_bindmethod = -1; } - } else if ( !strncasecmp( cargv[ i ], - BINDDNSTR, sizeof( BINDDNSTR ) - 1 ) ) { - val = cargv[ i ] + sizeof( BINDDNSTR ); + } else if ( !strncasecmp( cargv[ i ], BINDDNSTR "=", + STRLENOF( BINDDNSTR "=" ) ) ) + { + val = cargv[ i ] + STRLENOF( BINDDNSTR "=" ); si->si_binddn = ch_strdup( val ); - } else if ( !strncasecmp( cargv[ i ], - CREDSTR, sizeof( CREDSTR ) - 1 ) ) { - val = cargv[ i ] + sizeof( CREDSTR ); + } else if ( !strncasecmp( cargv[ i ], CREDSTR "=", + STRLENOF( CREDSTR "=" ) ) ) + { + val = cargv[ i ] + STRLENOF( CREDSTR "=" ); si->si_passwd = ch_strdup( val ); - } else if ( !strncasecmp( cargv[ i ], - SASLMECHSTR, sizeof( SASLMECHSTR ) - 1 ) ) { - val = cargv[ i ] + sizeof( SASLMECHSTR ); + } else if ( !strncasecmp( cargv[ i ], SASLMECHSTR "=", + STRLENOF( SASLMECHSTR "=" ) ) ) + { + val = cargv[ i ] + STRLENOF( SASLMECHSTR "=" ); si->si_saslmech = ch_strdup( val ); - } else if ( !strncasecmp( cargv[ i ], - SECPROPSSTR, sizeof( SECPROPSSTR ) - 1 ) ) { - val = cargv[ i ] + sizeof( SECPROPSSTR ); + } else if ( !strncasecmp( cargv[ i ], SECPROPSSTR "=", + STRLENOF( SECPROPSSTR "=" ) ) ) + { + val = cargv[ i ] + STRLENOF( SECPROPSSTR "=" ); si->si_secprops = ch_strdup( val ); - } else if ( !strncasecmp( cargv[ i ], - REALMSTR, sizeof( REALMSTR ) - 1 ) ) { - val = cargv[ i ] + sizeof( REALMSTR ); + } else if ( !strncasecmp( cargv[ i ], REALMSTR "=", + STRLENOF( REALMSTR "=" ) ) ) + { + val = cargv[ i ] + STRLENOF( REALMSTR "=" ); si->si_realm = ch_strdup( val ); - } else if ( !strncasecmp( cargv[ i ], - AUTHCSTR, sizeof( AUTHCSTR ) - 1 ) ) { - val = cargv[ i ] + sizeof( AUTHCSTR ); + } else if ( !strncasecmp( cargv[ i ], AUTHCSTR "=", + STRLENOF( AUTHCSTR "=" ) ) ) + { + val = cargv[ i ] + STRLENOF( AUTHCSTR "=" ); + if ( si->si_authcId ) + ch_free( si->si_authcId ); si->si_authcId = ch_strdup( val ); - } else if ( !strncasecmp( cargv[ i ], - OLDAUTHCSTR, sizeof( OLDAUTHCSTR ) - 1 ) ) { + } else if ( !strncasecmp( cargv[ i ], OLDAUTHCSTR "=", + STRLENOF( OLDAUTHCSTR "=" ) ) ) + { /* Old authcID is provided for some backwards compatibility */ - val = cargv[ i ] + sizeof( OLDAUTHCSTR ); + val = cargv[ i ] + STRLENOF( OLDAUTHCSTR "=" ); + if ( si->si_authcId ) + ch_free( si->si_authcId ); si->si_authcId = ch_strdup( val ); - } else if ( !strncasecmp( cargv[ i ], - AUTHZSTR, sizeof( AUTHZSTR ) - 1 ) ) { - val = cargv[ i ] + sizeof( AUTHZSTR ); + } else if ( !strncasecmp( cargv[ i ], AUTHZSTR "=", + STRLENOF( AUTHZSTR "=" ) ) ) + { + val = cargv[ i ] + STRLENOF( AUTHZSTR "=" ); si->si_authzId = ch_strdup( val ); - } else if ( !strncasecmp( cargv[ i ], - SCHEMASTR, sizeof( SCHEMASTR ) - 1 ) ) + } else if ( !strncasecmp( cargv[ i ], SCHEMASTR "=", + STRLENOF( SCHEMASTR "=" ) ) ) { - val = cargv[ i ] + sizeof( SCHEMASTR ); + val = cargv[ i ] + STRLENOF( SCHEMASTR "=" ); if ( !strncasecmp( val, "on", STRLENOF( "on" ) )) { si->si_schemachecking = 1; } else if ( !strncasecmp( val, "off", STRLENOF( "off" ) ) ) { @@ -2498,28 +2580,28 @@ parse_syncrepl_line( } else { si->si_schemachecking = 1; } - } else if ( !strncasecmp( cargv[ i ], - FILTERSTR, sizeof( FILTERSTR ) - 1 ) ) + } else if ( !strncasecmp( cargv[ i ], FILTERSTR "=", + STRLENOF( FILTERSTR "=" ) ) ) { - val = cargv[ i ] + sizeof( FILTERSTR ); + val = cargv[ i ] + STRLENOF( FILTERSTR "=" ); ber_str2bv( val, 0, 1, &si->si_filterstr ); - } else if ( !strncasecmp( cargv[ i ], - SEARCHBASESTR, sizeof( SEARCHBASESTR ) - 1 ) ) + } else if ( !strncasecmp( cargv[ i ], SEARCHBASESTR "=", + STRLENOF( SEARCHBASESTR "=" ) ) ) { struct berval bv; - val = cargv[ i ] + sizeof( SEARCHBASESTR ); + val = cargv[ i ] + STRLENOF( SEARCHBASESTR "=" ); if ( si->si_base.bv_val ) { ch_free( si->si_base.bv_val ); } ber_str2bv( val, 0, 0, &bv ); if ( dnNormalize( 0, NULL, NULL, &bv, &si->si_base, NULL )) { fprintf( stderr, "Invalid base DN \"%s\"\n", val ); - return 1; + return -1; } - } else if ( !strncasecmp( cargv[ i ], - SCOPESTR, sizeof( SCOPESTR ) - 1 ) ) + } else if ( !strncasecmp( cargv[ i ], SCOPESTR "=", + STRLENOF( SCOPESTR "=" ) ) ) { - val = cargv[ i ] + sizeof( SCOPESTR ); + val = cargv[ i ] + STRLENOF( SCOPESTR "=" ); if ( !strncasecmp( val, "base", STRLENOF( "base" ) )) { si->si_scope = LDAP_SCOPE_BASE; } else if ( !strncasecmp( val, "one", STRLENOF( "one" ) )) { @@ -2535,42 +2617,91 @@ parse_syncrepl_line( } else { fprintf( stderr, "Error: parse_syncrepl_line: " "unknown scope \"%s\"\n", val); - return 1; + return -1; } - } else if ( !strncasecmp( cargv[ i ], - ATTRSONLYSTR, sizeof( ATTRSONLYSTR ) - 1 ) ) + } else if ( !strncasecmp( cargv[ i ], ATTRSONLYSTR "=", + STRLENOF( ATTRSONLYSTR "=" ) ) ) { si->si_attrsonly = 1; - } else if ( !strncasecmp( cargv[ i ], - ATTRSSTR, sizeof( ATTRSSTR ) - 1 ) ) + } else if ( !strncasecmp( cargv[ i ], ATTRSSTR "=", + STRLENOF( ATTRSSTR "=" ) ) ) { - val = cargv[ i ] + sizeof( ATTRSSTR ); - str2clist( &si->si_attrs, val, "," ); - } else if ( !strncasecmp( cargv[ i ], - EXATTRSSTR, sizeof( EXATTRSSTR ) - 1 ) ) + val = cargv[ i ] + STRLENOF( ATTRSSTR "=" ); + if ( !strncasecmp( val, ":include:", STRLENOF(":include:") ) ) { + char *attr_fname; + attr_fname = ch_strdup( val + STRLENOF(":include:") ); + si->si_anlist = file2anlist( si->si_anlist, attr_fname, " ,\t" ); + if ( si->si_anlist == NULL ) { + ch_free( attr_fname ); + return -1; + } + ch_free( attr_fname ); + } else { + char *str, *s, *next; + char delimstr[] = " ,\t"; + str = ch_strdup( val ); + for ( s = ldap_pvt_strtok( str, delimstr, &next ); + s != NULL; + s = ldap_pvt_strtok( NULL, delimstr, &next ) ) + { + if ( strlen(s) == 1 && *s == '*' ) { + si->si_allattrs = 1; + *(val + ( s - str )) = delimstr[0]; + } + if ( strlen(s) == 1 && *s == '+' ) { + si->si_allopattrs = 1; + *(val + ( s - str )) = delimstr[0]; + } + } + ch_free( str ); + si->si_anlist = str2anlist( si->si_anlist, val, " ,\t" ); + if ( si->si_anlist == NULL ) { + return -1; + } + } + } else if ( !strncasecmp( cargv[ i ], EXATTRSSTR "=", + STRLENOF( EXATTRSSTR "=" ) ) ) { - val = cargv[ i ] + sizeof( EXATTRSSTR ); - str2clist( &si->si_exattrs, val, "," ); - } else if ( !strncasecmp( cargv[ i ], - TYPESTR, sizeof( TYPESTR ) - 1 ) ) + val = cargv[ i ] + STRLENOF( EXATTRSSTR "=" ); + if ( !strncasecmp( val, ":include:", STRLENOF(":include:") )) { + char *attr_fname; + attr_fname = ch_strdup( val + STRLENOF(":include:") ); + si->si_exanlist = file2anlist( + si->si_exanlist, attr_fname, " ,\t" ); + if ( si->si_exanlist == NULL ) { + ch_free( attr_fname ); + return -1; + } + ch_free( attr_fname ); + } else { + int j; + si->si_exanlist = str2anlist( si->si_exanlist, val, " ,\t" ); + if ( si->si_exanlist == NULL ) { + return -1; + } + } + } else if ( !strncasecmp( cargv[ i ], TYPESTR "=", + STRLENOF( TYPESTR "=" ) ) ) { - val = cargv[ i ] + sizeof( TYPESTR ); - if ( !strncasecmp( val, "refreshOnly", STRLENOF("refreshOnly") )) { + val = cargv[ i ] + STRLENOF( TYPESTR "=" ); + if ( !strncasecmp( val, "refreshOnly", + STRLENOF("refreshOnly") )) + { si->si_type = LDAP_SYNC_REFRESH_ONLY; } else if ( !strncasecmp( val, "refreshAndPersist", - STRLENOF("refreshAndPersist") )) + STRLENOF("refreshAndPersist") )) { si->si_type = LDAP_SYNC_REFRESH_AND_PERSIST; si->si_interval = 60; } else { fprintf( stderr, "Error: parse_syncrepl_line: " "unknown sync type \"%s\"\n", val); - return 1; + return -1; } - } else if ( !strncasecmp( cargv[ i ], - INTERVALSTR, sizeof( INTERVALSTR ) - 1 ) ) + } else if ( !strncasecmp( cargv[ i ], INTERVALSTR "=", + STRLENOF( INTERVALSTR "=" ) ) ) { - val = cargv[ i ] + sizeof( INTERVALSTR ); + val = cargv[ i ] + STRLENOF( INTERVALSTR "=" ); if ( si->si_type == LDAP_SYNC_REFRESH_AND_PERSIST ) { si->si_interval = 0; } else { @@ -2584,21 +2715,21 @@ parse_syncrepl_line( if ( hstr == NULL ) { fprintf( stderr, "Error: parse_syncrepl_line: " "invalid interval \"%s\"\n", val ); - return 1; + return -1; } *hstr++ = '\0'; mstr = strchr( hstr, ':' ); if ( mstr == NULL ) { fprintf( stderr, "Error: parse_syncrepl_line: " "invalid interval \"%s\"\n", val ); - return 1; + return -1; } *mstr++ = '\0'; sstr = strchr( mstr, ':' ); if ( sstr == NULL ) { fprintf( stderr, "Error: parse_syncrepl_line: " "invalid interval \"%s\"\n", val ); - return 1; + return -1; } *sstr++ = '\0'; @@ -2611,7 +2742,7 @@ parse_syncrepl_line( ( ss > 60 ) || ( ss < 0 ) || ( dd < 0 )) { fprintf( stderr, "Error: parse_syncrepl_line: " "invalid interval \"%s\"\n", val ); - return 1; + return -1; } si->si_interval = (( dd * 24 + hh ) * 60 + mm ) * 60 + ss; } @@ -2619,20 +2750,20 @@ parse_syncrepl_line( fprintf( stderr, "Error: parse_syncrepl_line: " "invalid interval \"%ld\"\n", (long) si->si_interval); - return 1; + return -1; } - } else if ( !strncasecmp( cargv[ i ], - RETRYSTR, sizeof( RETRYSTR ) - 1 ) ) + } else if ( !strncasecmp( cargv[ i ], RETRYSTR "=", + STRLENOF( RETRYSTR "=" ) ) ) { char *str; char **retry_list; int j, k, n; - val = cargv[ i ] + sizeof( RETRYSTR ); + val = cargv[ i ] + STRLENOF( RETRYSTR "=" ); retry_list = (char **) ch_calloc( 1, sizeof( char * )); retry_list[0] = NULL; - str2clist( &retry_list, val, " ,\t" ); + slap_str2clist( &retry_list, val, " ,\t" ); for ( k = 0; retry_list && retry_list[k]; k++ ) ; n = k / 2; @@ -2668,24 +2799,25 @@ parse_syncrepl_line( ch_free( retry_list[k] ); } ch_free( retry_list ); - } else if ( !strncasecmp( cargv[ i ], - MANAGEDSAITSTR, sizeof( MANAGEDSAITSTR ) - 1 ) ) + } else if ( !strncasecmp( cargv[ i ], MANAGEDSAITSTR "=", + STRLENOF( MANAGEDSAITSTR "=" ) ) ) { - val = cargv[ i ] + sizeof( MANAGEDSAITSTR ); + val = cargv[ i ] + STRLENOF( MANAGEDSAITSTR "=" ); si->si_manageDSAit = atoi( val ); - } else if ( !strncasecmp( cargv[ i ], - SLIMITSTR, sizeof( SLIMITSTR ) - 1 ) ) + } else if ( !strncasecmp( cargv[ i ], SLIMITSTR "=", + STRLENOF( SLIMITSTR "=") ) ) { - val = cargv[ i ] + sizeof( SLIMITSTR ); + val = cargv[ i ] + STRLENOF( SLIMITSTR "=" ); si->si_slimit = atoi( val ); - } else if ( !strncasecmp( cargv[ i ], - TLIMITSTR, sizeof( TLIMITSTR ) - 1 ) ) + } else if ( !strncasecmp( cargv[ i ], TLIMITSTR "=", + STRLENOF( TLIMITSTR "=" ) ) ) { - val = cargv[ i ] + sizeof( TLIMITSTR ); + val = cargv[ i ] + STRLENOF( TLIMITSTR "=" ); si->si_tlimit = atoi( val ); } else { fprintf( stderr, "Error: parse_syncrepl_line: " "unknown keyword \"%s\"\n", cargv[ i ] ); + return -1; } } @@ -2699,7 +2831,7 @@ parse_syncrepl_line( } char ** -str2clist( char ***out, char *in, const char *brkstr ) +slap_str2clist( char ***out, char *in, const char *brkstr ) { char *str; char *s; @@ -2709,7 +2841,7 @@ str2clist( char ***out, char *in, const char *brkstr ) char **new; /* find last element in list */ - for (i = 0; *out && *out[i]; i++); + for (i = 0; *out && (*out)[i]; i++); /* protect the input string from strtok */ str = ch_strdup( in ); @@ -2741,3 +2873,4 @@ str2clist( char ***out, char *in, const char *brkstr ) free( str ); return( *out ); } +