]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/config.c
Fix compiler error and warnings.
[openldap] / servers / slapd / config.c
index 2040b689f4e174ff9ffa20cd9d0580d0cba26216..4d60f6ef08cefca0756225a16acc79f86cdbe93b 100644 (file)
@@ -60,8 +60,6 @@ char  *global_host = NULL;
 char   *global_realm = NULL;
 char           *ldap_srvtab = "";
 char           **default_passwd_hash = NULL;
-char   *passwd_salt;
-char   *logfileName;
 struct berval default_search_base = BER_BVNULL;
 struct berval default_search_nbase = BER_BVNULL;
 
@@ -84,6 +82,9 @@ int use_reverse_lookup = 0;
 static char *replica_pidFile, *replica_argsFile;
 static int replicationInterval;
 
+static char    *passwd_salt;
+static char    *logfileName;
+
 #ifdef LDAP_SLAPI
 int slapi_plugins_used = 0;
 #endif
@@ -99,6 +100,7 @@ int read_config_file(const char *fname, int depth, ConfigArgs *cf);
 
 static int add_syncrepl LDAP_P(( Backend *, char **, int ));
 static int parse_syncrepl_line LDAP_P(( char **, int, syncinfo_t *));
+static void syncrepl_unparse LDAP_P (( syncinfo_t *, struct berval *));
 
 /* All of these table entries and handlers really belong
  * in back-config, only the parser/table engine belongs here.
@@ -226,13 +228,13 @@ static ConfigTable SystemConfiguration[] = {
                &config_generic, "( OLcfgAt:5 NAME 'olcAttributeOptions' "
                        "EQUALITY caseIgnoreMatch "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "auth-rewrite", NULL, 2, 2, 14,
+       { "authid-rewrite", NULL, 2, 0, 0,
 #ifdef SLAP_AUTH_REWRITE
                ARG_MAGIC|CFG_REWRITE, &config_generic,
 #else
                ARG_IGNORED, NULL,
 #endif
-                "( OLcfgAt:6 NAME 'olcAuthRewrite' "
+                "( OLcfgAt:6 NAME 'olcAuthIDRewrite' "
                        "EQUALITY caseIgnoreMatch "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
        { "authz-policy", "policy", 2, 2, 0, ARG_STRING|ARG_MAGIC|CFG_AZPOLICY,
@@ -428,7 +430,7 @@ static ConfigTable SystemConfiguration[] = {
 #endif
                "( OLcfgAt:54 NAME 'olcSaslRealm' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "sasl-regexp", NULL, 2, 2, 0, ARG_MAGIC|CFG_AZREGEXP,
+       { "sasl-regexp", NULL, 3, 3, 0, ARG_MAGIC|CFG_AZREGEXP,
                &config_generic, NULL, NULL, NULL },
        { "sasl-secprops", "properties", 2, 2, 0,
 #ifdef HAVE_CYRUS_SASL
@@ -438,7 +440,7 @@ static ConfigTable SystemConfiguration[] = {
 #endif
                "( OLcfgAt:56 NAME 'olcSaslSecProps' "
                        "SYNTAX OMsDirectoryString )", NULL, NULL },
-       { "saslRegexp", NULL, 2, 2, 0, ARG_MAGIC|CFG_AZREGEXP,
+       { "saslRegexp", NULL, 3, 3, 0, ARG_MAGIC|CFG_AZREGEXP,
                &config_generic, NULL, NULL, NULL },
        { "schemacheck", "on|off", 2, 2, 0, ARG_ON_OFF|ARG_MAGIC|CFG_CHECK,
                &config_generic, "( OLcfgAt:57 NAME 'olcSchemaCheck' "
@@ -979,7 +981,7 @@ config_generic(ConfigArgs *c) {
                        else
                                rc = 1;
                        break;
-               case CFG_LIMITS:
+               case CFG_LIMITS:        /* FIXME */
                        rc = 1;
                        break;
                case CFG_RO:
@@ -992,14 +994,14 @@ config_generic(ConfigArgs *c) {
                        rc = 1;
                        break;
 #ifdef HAVE_CYRUS_SASL
-               case CFG_SASLSECP:
+               case CFG_SASLSECP:      /* FIXME */
                        rc = 1;
                        break;
 #endif
                case CFG_DEPTH:
                        c->value_int = c->be->be_max_deref_depth;
                        break;
-               case CFG_OID:
+               case CFG_OID:   /* FIXME */
                        rc = 1;
                        break;
                case CFG_CHECK:
@@ -1059,18 +1061,18 @@ config_generic(ConfigArgs *c) {
                        c->value_int = index_substr_if_minlen;
                        break;
 #ifdef SLAPD_MODULES
-               case CFG_MODLOAD:
+               case CFG_MODLOAD:       /* FIXME */
                case CFG_MODPATH:
                        rc = 1;
                        break;
 #endif
 #ifdef LDAP_SLAPI
-               case CFG_PLUGIN:
+               case CFG_PLUGIN:        /* FIXME */
                        rc = 1;
                        break;
 #endif
 #ifdef SLAP_AUTH_REWRITE
-               case CFG_REWRITE:
+               case CFG_REWRITE:       /* FIXME */
                        rc = 1;
                        break;
 #endif
@@ -1224,12 +1226,12 @@ config_generic(ConfigArgs *c) {
                        break;
 
                case CFG_LOGFILE: {
-                       if ( logfileName ) ch_free( logfileName );
-                       logfileName = c->value_string;
-                       FILE *logfile = fopen(logfileName, "w");
-                       if(logfile) lutil_debug_file(logfile);
-                       break;
-                       }
+                               FILE *logfile;
+                               if ( logfileName ) ch_free( logfileName );
+                               logfileName = c->value_string;
+                               logfile = fopen(logfileName, "w");
+                               if(logfile) lutil_debug_file(logfile);
+                       } break;
 
                case CFG_LASTMOD:
                        if(SLAP_NOLASTMODCMD(c->be)) {
@@ -1419,7 +1421,7 @@ config_sizelimit(ConfigArgs *c) {
        int i, rc = 0;
        char *next;
        struct slap_limits_set *lim = &c->be->be_def_limit;
-       if (c->emit) {
+       if (c->emit) {  /* FIXME */
                return 1;
        }
        for(i = 1; i < c->argc; i++) {
@@ -1459,7 +1461,7 @@ config_timelimit(ConfigArgs *c) {
        char *next;
        struct slap_limits_set *lim = &c->be->be_def_limit;
        if (c->emit) {
-               return 1;
+               return 1;       /* FIXME */
        }
        for(i = 1; i < c->argc; i++) {
                if(!strncasecmp(c->argv[i], "time", 4)) {
@@ -1809,6 +1811,12 @@ config_loglevel(ConfigArgs *c) {
 static int
 config_syncrepl(ConfigArgs *c) {
        if (c->emit) {
+               if ( c->be->be_syncinfo ) {
+                       struct berval bv;
+                       syncrepl_unparse( c->be->be_syncinfo, &bv ); 
+                       ber_bvarray_add( &c->rvalue_vals, &bv );
+                       return 0;
+               }
                return 1;
        }
        if(SLAP_SHADOW(c->be)) {
@@ -1948,7 +1956,7 @@ static cf_aux_table bindkey[] = {
        { BER_BVC("realm="), offsetof(slap_bindconf, sb_realm), 0, NULL },
        { BER_BVC("authcID="), offsetof(slap_bindconf, sb_authcId), 0, NULL },
        { BER_BVC("authzID="), offsetof(slap_bindconf, sb_authzId), 1, NULL },
-       { BER_BVNULL, 0, NULL }
+       { BER_BVNULL, 0, 0, NULL }
 };
 
 int bindconf_parse( char *word, slap_bindconf *bc ) {
@@ -2039,15 +2047,29 @@ void bindconf_free( slap_bindconf *bc ) {
        }
 }
 
+static char *
+anlist_unparse( AttributeName *an, char *ptr ) {
+       int comma = 0;
+
+       for (; !BER_BVISNULL( &an->an_name ); an++) {
+               if ( comma ) *ptr++ = ',';
+               ptr = lutil_strcopy( ptr, an->an_name.bv_val );
+               comma = 1;
+       }
+       return ptr;
+}
+
 static void
-replica_unparse( struct slap_replica_info *ri, struct berval *bv )
+replica_unparse( struct slap_replica_info *ri, int i, struct berval *bv )
 {
        int len;
-       int i;
        char *ptr;
        struct berval bc = {0};
+       char numbuf[32];
 
-       len = strlen( ri->ri_uri ) + STRLENOF("replica uri=");
+       len = sprintf(numbuf, "{%d}", i );
+
+       len += strlen( ri->ri_uri ) + STRLENOF("uri=");
        if ( ri->ri_nsuffix ) {
                for (i=0; !BER_BVISNULL( &ri->ri_nsuffix[i] ); i++) {
                        len += ri->ri_nsuffix[i].bv_len + STRLENOF(" suffix=\"\"");
@@ -2066,7 +2088,8 @@ replica_unparse( struct slap_replica_info *ri, struct berval *bv )
        bv->bv_val = ch_malloc(len + 1);
        bv->bv_len = len;
 
-       ptr = lutil_strcopy( bv->bv_val, "replica uri=" );
+       ptr = lutil_strcopy( bv->bv_val, numbuf );
+       ptr = lutil_strcopy( ptr, "uri=" );
        ptr = lutil_strcopy( ptr, ri->ri_uri );
 
        if ( ri->ri_nsuffix ) {
@@ -2077,17 +2100,15 @@ replica_unparse( struct slap_replica_info *ri, struct berval *bv )
                }
        }
        if ( ri->ri_attrs ) {
-               int comma = 0;
                ptr = lutil_strcopy( ptr, "attr" );
                if ( ri->ri_exclude ) *ptr++ = '!';
                *ptr++ = '=';
-               for (i=0; !BER_BVISNULL( &ri->ri_attrs[i].an_name ); i++) {
-                       if ( comma ) *ptr++ = ',';
-                       ptr = lutil_strcopy( ptr, ri->ri_attrs[i].an_name.bv_val );
-               }
+               ptr = anlist_unparse( ri->ri_attrs, ptr );
        }
-       if ( bc.bv_val )
+       if ( bc.bv_val ) {
                strcpy( ptr, bc.bv_val );
+               ch_free( bc.bv_val );
+       }
 }
 
 static int
@@ -2100,7 +2121,7 @@ config_replica(ConfigArgs *c) {
                if (c->be->be_replica) {
                        struct berval bv;
                        for (i=0;c->be->be_replica[i]; i++) {
-                               replica_unparse( c->be->be_replica[i], &bv );
+                               replica_unparse( c->be->be_replica[i], i, &bv );
                                ber_bvarray_add( &c->rvalue_vals, &bv );
                        }
                        return 0;
@@ -2326,7 +2347,7 @@ config_tls_config(ConfigArgs *c) {
                { "never",      LDAP_OPT_X_TLS_NEVER },
                { "demand",     LDAP_OPT_X_TLS_DEMAND },
                { "try",        LDAP_OPT_X_TLS_TRY },
-               { "hard",       LDAP_OPT_X_TLS_HARD }
+               { "hard",       LDAP_OPT_X_TLS_HARD },
                { NULL, 0 }
        }, *keys;
        switch(c->type) {
@@ -2345,7 +2366,7 @@ config_tls_config(ConfigArgs *c) {
                for (i=0; keys[i].word; i++) {
                        if (keys[i].mask == c->value_int) {
                                c->value_string = ch_strdup( keys[i].word );
-                               rc = 0;
+                               return 0;
                        }
                }
                return 1;
@@ -2623,7 +2644,6 @@ add_syncrepl(
 /* FIXME: undocumented */
 #define OLDAUTHCSTR            "bindprincipal"
 #define EXATTRSSTR             "exattrs"
-#define MANAGEDSAITSTR         "manageDSAit"
 #define RETRYSTR               "retry"
 
 /* FIXME: unused */
@@ -2633,7 +2653,7 @@ add_syncrepl(
 #define LMREQSTR               "req"
 #define SRVTABSTR              "srvtab"
 #define SUFFIXSTR              "suffix"
-#define UPDATEDNSTR            "updatedn"
+#define MANAGEDSAITSTR         "manageDSAit"
 
 /* mandatory */
 #define GOT_ID                 0x0001
@@ -2642,6 +2662,20 @@ add_syncrepl(
 /* check */
 #define GOT_ALL                        (GOT_ID|GOT_PROVIDER)
 
+static struct {
+       struct berval key;
+       int val;
+} scopes[] = {
+       { BER_BVC("base"), LDAP_SCOPE_BASE },
+       { BER_BVC("one"), LDAP_SCOPE_ONELEVEL },
+#ifdef LDAP_SCOPE_SUBORDINATE
+       { BER_BVC("children"), LDAP_SCOPE_SUBORDINATE },
+       { BER_BVC("subordinate"), 0 },
+#endif
+       { BER_BVC("sub"), LDAP_SCOPE_SUBTREE },
+       { BER_BVNULL, 0 }
+};
+
 static int
 parse_syncrepl_line(
        char            **cargv,
@@ -2710,20 +2744,17 @@ parse_syncrepl_line(
                } else if ( !strncasecmp( cargv[ i ], SCOPESTR "=",
                                        STRLENOF( SCOPESTR "=" ) ) )
                {
+                       int j;
                        val = cargv[ i ] + STRLENOF( SCOPESTR "=" );
-                       if ( !strncasecmp( val, "base", STRLENOF( "base" ) )) {
-                               si->si_scope = LDAP_SCOPE_BASE;
-                       } else if ( !strncasecmp( val, "one", STRLENOF( "one" ) )) {
-                               si->si_scope = LDAP_SCOPE_ONELEVEL;
-#ifdef LDAP_SCOPE_SUBORDINATE
-                       } else if ( !strcasecmp( val, "subordinate" ) ||
-                               !strcasecmp( val, "children" ))
-                       {
-                               si->si_scope = LDAP_SCOPE_SUBORDINATE;
-#endif
-                       } else if ( !strncasecmp( val, "sub", STRLENOF( "sub" ) )) {
-                               si->si_scope = LDAP_SCOPE_SUBTREE;
-                       } else {
+                       for ( j=0; !BER_BVISNULL(&scopes[j].key); j++ ) {
+                               if (!strncasecmp( val, scopes[j].key.bv_val,
+                                       scopes[j].key.bv_len )) {
+                                       while (!scopes[j].val) j--;
+                                       si->si_scope = scopes[j].val;
+                                       break;
+                               }
+                       }
+                       if ( BER_BVISNULL(&scopes[j].key) ) {
                                fprintf( stderr, "Error: parse_syncrepl_line: "
                                        "unknown scope \"%s\"\n", val);
                                return -1;
@@ -2744,7 +2775,7 @@ parse_syncrepl_line(
                                        ch_free( attr_fname );
                                        return -1;
                                }
-                               ch_free( attr_fname );
+                               si->si_anfile = attr_fname;
                        } else {
                                char *str, *s, *next;
                                char delimstr[] = " ,\t";
@@ -2937,6 +2968,119 @@ parse_syncrepl_line(
        return 0;
 }
 
+
+
+static void
+syncrepl_unparse( syncinfo_t *si, struct berval *bv )
+{
+       struct berval bc;
+       char buf[BUFSIZ*2], *ptr;
+       int i, len;
+
+       bindconf_unparse( &si->si_bindconf, &bc );
+       ptr = buf;
+       ptr += sprintf( ptr, IDSTR "=%03d " PROVIDERSTR "=%s",
+               si->si_rid, si->si_provideruri.bv_val );
+       if ( !BER_BVISNULL( &bc )) {
+               ptr = lutil_strcopy( ptr, bc.bv_val );
+               free( bc.bv_val );
+       }
+       if ( !BER_BVISEMPTY( &si->si_filterstr )) {
+               ptr = lutil_strcopy( ptr, " " FILTERSTR "=\"" );
+               ptr = lutil_strcopy( ptr, si->si_filterstr.bv_val );
+               *ptr++ = '"';
+       }
+       if ( !BER_BVISNULL( &si->si_base )) {
+               ptr = lutil_strcopy( ptr, " " SEARCHBASESTR "=\"" );
+               ptr = lutil_strcopy( ptr, si->si_base.bv_val );
+               *ptr++ = '"';
+       }
+       for (i=0; !BER_BVISNULL(&scopes[i].key);i++) {
+               if ( si->si_scope == scopes[i].val ) {
+                       ptr = lutil_strcopy( ptr, " " SCOPESTR "=" );
+                       ptr = lutil_strcopy( ptr, scopes[i].key.bv_val );
+                       break;
+               }
+       }
+       if ( si->si_attrsonly ) {
+               ptr = lutil_strcopy( ptr, " " ATTRSONLYSTR "=yes" );
+       }
+       if ( si->si_anfile ) {
+               ptr = lutil_strcopy( ptr, " " ATTRSSTR "=:include:" );
+               ptr = lutil_strcopy( ptr, si->si_anfile );
+       } else if ( si->si_allattrs || si->si_allopattrs ||
+               ( si->si_anlist && !BER_BVISNULL(&si->si_anlist[0].an_name) )) {
+               char *old;
+               ptr = lutil_strcopy( ptr, " " ATTRSSTR "=\"" );
+               old = ptr;
+               ptr = anlist_unparse( si->si_anlist, ptr );
+               if ( si->si_allattrs ) {
+                       if ( old != ptr ) *ptr++ = ',';
+                       *ptr++ = '*';
+               }
+               if ( si->si_allopattrs ) {
+                       if ( old != ptr ) *ptr++ = ',';
+                       *ptr++ = '+';
+               }
+               *ptr++ = '"';
+       }
+       if ( si->si_exanlist && !BER_BVISNULL(&si->si_exanlist[0].an_name) ) {
+               ptr = lutil_strcopy( ptr, " " EXATTRSSTR "=" );
+               ptr = anlist_unparse( si->si_exanlist, ptr );
+       }
+       ptr = lutil_strcopy( ptr, " " SCHEMASTR "=" );
+       ptr = lutil_strcopy( ptr, si->si_schemachecking ? "on" : "off" );
+       
+       ptr = lutil_strcopy( ptr, " " TYPESTR "=" );
+       ptr = lutil_strcopy( ptr, si->si_type == LDAP_SYNC_REFRESH_AND_PERSIST ?
+               "refreshAndPersist" : "refreshOnly" );
+
+       if ( si->si_type == LDAP_SYNC_REFRESH_ONLY ) {
+               int dd, hh, mm, ss;
+
+               dd = si->si_interval;
+               ss = dd % 60;
+               dd /= 60;
+               mm = dd % 60;
+               dd /= 60;
+               hh = dd % 24;
+               dd /= 24;
+               ptr = lutil_strcopy( ptr, " " INTERVALSTR "=" );
+               ptr += sprintf( ptr, "%02d:%02d:%02d:%02d", dd, hh, mm, ss );
+       } else if ( si->si_retryinterval ) {
+               int space=0;
+               ptr = lutil_strcopy( ptr, " " RETRYSTR "=\"" );
+               for (i=0; si->si_retryinterval[i]; i++) {
+                       if ( space ) *ptr++ = ' ';
+                       space = 1;
+                       ptr += sprintf( ptr, "%d", si->si_retryinterval[i] );
+                       if ( si->si_retrynum_init[i] == -1 )
+                               *ptr++ = '+';
+                       else
+                               ptr += sprintf( ptr, "%d", si->si_retrynum_init );
+               }
+               *ptr++ = '"';
+       }
+
+#if 0 /* FIXME: unused in syncrepl.c, should remove it */
+       ptr = lutil_strcopy( ptr, " " MANAGEDSAITSTR "=" );
+       ptr += sprintf( ptr, "%d", si->si_manageDSAit );
+#endif
+
+       if ( si->si_slimit ) {
+               ptr = lutil_strcopy( ptr, " " SLIMITSTR "=" );
+               ptr += sprintf( ptr, "%d", si->si_slimit );
+       }
+
+       if ( si->si_tlimit ) {
+               ptr = lutil_strcopy( ptr, " " TLIMITSTR "=" );
+               ptr += sprintf( ptr, "%d", si->si_tlimit );
+       }
+       bc.bv_len = ptr - buf;
+       bc.bv_val = buf;
+       ber_dupbv( bv, &bc );
+}
+
 char **
 slap_str2clist( char ***out, char *in, const char *brkstr )
 {