]> git.sur5r.net Git - openldap/blobdiff - servers/slurpd/config.c
updatedn can add '' rooted entries (according to ACLs)
[openldap] / servers / slurpd / config.c
index 9bde24e88f7ed1357622d7d8e9c1ef4db782ee1a..6eb02b2b83bb57762aa40aa620545df7a3ad92f8 100644 (file)
@@ -1,4 +1,8 @@
 /* $OpenLDAP$ */
+/*
+ * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+ */
 /*
  * Copyright (c) 1996 Regents of the University of Michigan.
  * All rights reserved.
@@ -30,7 +34,7 @@
 #include "slurp.h"
 #include "globals.h"
 
-#define MAXARGS        100
+#define MAXARGS        500
 
 /* Forward declarations */
 static void    add_replica LDAP_P(( char **, int ));
@@ -107,6 +111,34 @@ slurpd_read_config(
            }
        } else if ( strcasecmp( cargv[0], "replica" ) == 0 ) {
            add_replica( cargv, cargc );
+           
+           /* include another config file */
+       } else if ( strcasecmp( cargv[0], "include" ) == 0 ) {
+           char *savefname;
+           int savelineno;
+
+            if ( cargc < 2 ) {
+#ifdef NEW_LOGGING
+                LDAP_LOG(( "config", LDAP_LEVEL_CRIT,
+                        "%s: line %d: missing filename in \"include "
+                        "<filename>\" line.\n", fname, lineno ));
+#else
+                Debug( LDAP_DEBUG_ANY,
+        "%s: line %d: missing filename in \"include <filename>\" line\n",
+                        fname, lineno, 0 );
+#endif
+               
+                return( 1 );
+            }
+           savefname = strdup( cargv[1] );
+           savelineno = lineno;
+           
+           if ( slurpd_read_config( savefname ) != 0 ) {
+               return( 1 );
+           }
+               
+           free( savefname );
+           lineno = savelineno - 1;
        }
     }
     fclose( fp );
@@ -227,13 +259,17 @@ getline(
     CATLINE( buf );
     while ( fgets( buf, sizeof(buf), fp ) != NULL ) {
        if ( (p = strchr( buf, '\n' )) != NULL ) {
-           *p = '\0';
+               if( p > buf && p[-1] == '\r' ) --p;       
+               *p = '\0';
        }
        lineno++;
        if ( ! isspace( (unsigned char) buf[0] ) ) {
            return( line );
        }
 
+       /* change leading whitespace to space */
+       buf[0] = ' ';
+
        CATLINE( buf );
     }
     buf[0] = '\0';
@@ -333,8 +369,8 @@ parse_replica_line(
     char       *hp, *val;
 
     for ( i = 1; i < cargc; i++ ) {
-       if ( !strncasecmp( cargv[ i ], HOSTSTR, strlen( HOSTSTR ))) {
-           val = cargv[ i ] + strlen( HOSTSTR ) + 1;
+       if ( !strncasecmp( cargv[ i ], HOSTSTR, sizeof( HOSTSTR ) - 1 ) ) {
+           val = cargv[ i ] + sizeof( HOSTSTR ); /* '\0' string terminator accounts for '=' */
            if (( hp = strchr( val, ':' )) != NULL ) {
                *hp = '\0';
                hp++;
@@ -345,21 +381,24 @@ parse_replica_line(
            }
            ri->ri_hostname = strdup( val );
            gots |= GOT_HOST;
-       } else if ( !strncasecmp( cargv[ i ], TLSSTR, strlen( TLSSTR ))) {
-           val = cargv[ i ] + strlen( TLSSTR ) + 1;
+       } else if ( !strncasecmp( cargv[ i ], 
+                       SUFFIXSTR, sizeof( SUFFIXSTR ) - 1 ) ) {
+           /* ignore it */ ;
+       } else if ( !strncasecmp( cargv[ i ], TLSSTR, sizeof( TLSSTR ) - 1 ) ) {
+           val = cargv[ i ] + sizeof( TLSSTR );
                if( !strcasecmp( val, TLSCRITICALSTR ) ) {
                        ri->ri_tls = TLS_CRITICAL;
                } else {
                        ri->ri_tls = TLS_ON;
                }
        } else if ( !strncasecmp( cargv[ i ],
-               BINDDNSTR, strlen( BINDDNSTR ))) { 
-           val = cargv[ i ] + strlen( BINDDNSTR ) + 1;
+                       BINDDNSTR, sizeof( BINDDNSTR ) - 1 ) ) { 
+           val = cargv[ i ] + sizeof( BINDDNSTR );
            ri->ri_bind_dn = strdup( val );
            gots |= GOT_DN;
        } else if ( !strncasecmp( cargv[ i ], BINDMETHSTR,
-               strlen( BINDMETHSTR ))) {
-           val = cargv[ i ] + strlen( BINDMETHSTR ) + 1;
+               sizeof( BINDMETHSTR ) - 1 ) ) {
+           val = cargv[ i ] + sizeof( BINDMETHSTR );
            if ( !strcasecmp( val, KERBEROSSTR )) {
            fprintf( stderr, "Error: a bind method of \"kerberos\" was\n" );
            fprintf( stderr, "specified in the slapd configuration file.\n" );
@@ -374,31 +413,39 @@ parse_replica_line(
            } else {
                ri->ri_bind_method = -1;
            }
-       } else if ( !strncasecmp( cargv[ i ], SASLMECHSTR, strlen( SASLMECHSTR ))) {
-           val = cargv[ i ] + strlen( SASLMECHSTR ) + 1;
+       } else if ( !strncasecmp( cargv[ i ], 
+                       SASLMECHSTR, sizeof( SASLMECHSTR ) - 1 ) ) {
+           val = cargv[ i ] + sizeof( SASLMECHSTR );
            gots |= GOT_MECH;
            ri->ri_saslmech = strdup( val );
-       } else if ( !strncasecmp( cargv[ i ], CREDSTR, strlen( CREDSTR ))) {
-           val = cargv[ i ] + strlen( CREDSTR ) + 1;
+       } else if ( !strncasecmp( cargv[ i ], 
+                       CREDSTR, sizeof( CREDSTR ) - 1 ) ) {
+           val = cargv[ i ] + sizeof( CREDSTR );
            ri->ri_password = strdup( val );
-       } else if ( !strncasecmp( cargv[ i ], SECPROPSSTR, strlen( SECPROPSSTR ))) {
-           val = cargv[ i ] + strlen( SECPROPSSTR ) + 1;
+       } else if ( !strncasecmp( cargv[ i ], 
+                       SECPROPSSTR, sizeof( SECPROPSSTR ) - 1 ) ) {
+           val = cargv[ i ] + sizeof( SECPROPSSTR );
            ri->ri_secprops = strdup( val );
-       } else if ( !strncasecmp( cargv[ i ], REALMSTR, strlen( REALMSTR ))) {
-           val = cargv[ i ] + strlen( REALMSTR ) + 1;
+       } else if ( !strncasecmp( cargv[ i ], 
+                       REALMSTR, sizeof( REALMSTR ) - 1 ) ) {
+           val = cargv[ i ] + sizeof( REALMSTR );
            ri->ri_realm = strdup( val );
-       } else if ( !strncasecmp( cargv[ i ], AUTHCSTR, strlen( AUTHCSTR ))) {
-           val = cargv[ i ] + strlen( AUTHCSTR ) + 1;
+       } else if ( !strncasecmp( cargv[ i ], 
+                       AUTHCSTR, sizeof( AUTHCSTR ) - 1 ) ) {
+           val = cargv[ i ] + sizeof( AUTHCSTR );
            ri->ri_authcId = strdup( val );
-       } else if ( !strncasecmp( cargv[ i ], OLDAUTHCSTR, strlen( OLDAUTHCSTR ))) {
+       } else if ( !strncasecmp( cargv[ i ], 
+                       OLDAUTHCSTR, sizeof( OLDAUTHCSTR ) - 1 ) ) {
            /* Old authcID is provided for some backwards compatibility */
-           val = cargv[ i ] + strlen( OLDAUTHCSTR ) + 1;
+           val = cargv[ i ] + sizeof( OLDAUTHCSTR );
            ri->ri_authcId = strdup( val );
-       } else if ( !strncasecmp( cargv[ i ], AUTHZSTR, strlen( AUTHZSTR ))) {
-           val = cargv[ i ] + strlen( AUTHZSTR ) + 1;
+       } else if ( !strncasecmp( cargv[ i ], 
+                       AUTHZSTR, sizeof( AUTHZSTR ) - 1 ) ) {
+           val = cargv[ i ] + sizeof( AUTHZSTR );
            ri->ri_authzId = strdup( val );
-       } else if ( !strncasecmp( cargv[ i ], SRVTABSTR, strlen( SRVTABSTR ))) {
-           val = cargv[ i ] + strlen( SRVTABSTR ) + 1;
+       } else if ( !strncasecmp( cargv[ i ], 
+                       SRVTABSTR, sizeof( SRVTABSTR ) - 1 ) ) {
+           val = cargv[ i ] + sizeof( SRVTABSTR );
            if ( ri->ri_srvtab != NULL ) {
                free( ri->ri_srvtab );
            }