]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/config.c
Another concurrency typo.
[openldap] / servers / slapd / config.c
index 66050586ab794ac4f4e258306e58de0e293206ac..06d5c4f3c43ba616dd19ea10c5f702024a6c330e 100644 (file)
@@ -1,19 +1,18 @@
 /* config.c - configuration file handling routines */
 
+#include "portable.h"
+
 #include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include "slap.h"
+
+#include <ac/string.h>
+#include <ac/ctype.h>
+#include <ac/socket.h>
+
 #include "ldapconfig.h"
+#include "slap.h"
 
 #define MAXARGS        100
 
-extern Backend *new_backend();
-extern char    *default_referral;
-extern int     ldap_syslog;
-extern int     global_schemacheck;
-
 /*
  * defaults for various global variables
  */
@@ -25,17 +24,28 @@ char                *replogfile;
 int            global_lastmod;
 char           *ldap_srvtab = "";
 
-static char    *fp_getline();
-static void    fp_getline_init();
-static void    fp_parse_line();
+char   *slapd_pid_file  = NULL;
+char   *slapd_args_file = NULL;
 
-static char    *strtok_quote();
+static char    *fp_getline(FILE *fp, int *lineno);
+static void    fp_getline_init(int *lineno);
+static void    fp_parse_line(char *line, int *argcp, char **argv);
 
+static char    *strtok_quote(char *line, char *sep);
+
+/*  the old interface for tools  */
 void
 read_config( char *fname, Backend **bep, FILE *pfp )
+{
+       read_config_env( fname, bep, pfp, 0 );
+}
+
+/*  the new interface for slapd  */
+void
+read_config_env( char *fname, Backend **bep, FILE *pfp, int startup )
 {
        FILE    *fp;
-       char    *line, *savefname, *dn;
+       char    *line, *savefname;
        int     cargc, savelineno;
        char    *cargv[MAXARGS];
        int     lineno, i;
@@ -81,6 +91,31 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                        *bep = new_backend( cargv[1] );
                        be = *bep;
 
+               /* assign a default depth limit for alias deref */
+               be->be_maxDerefDepth = SLAPD_DEFAULT_MAXDEREFDEPTH; 
+
+               /* get pid file name */
+               } else if ( strcasecmp( cargv[0], "pidfile" ) == 0 ) {
+                       if ( cargc < 2 ) {
+                               Debug( LDAP_DEBUG_ANY,
+           "%s: line %d: missing file name in \"pidfile <file>\" line\n",
+                                   fname, lineno, 0 );
+                               exit( 1 );
+                       }
+
+                       slapd_pid_file = ch_strdup( cargv[1] );
+
+               /* get args file name */
+               } else if ( strcasecmp( cargv[0], "argsfile" ) == 0 ) {
+                       if ( cargc < 2 ) {
+                               Debug( LDAP_DEBUG_ANY,
+           "%s: line %d: missing file name in \"argsfile <file>\" line\n",
+                                   fname, lineno, 0 );
+                               exit( 1 );
+                       }
+
+                       slapd_args_file = ch_strdup( cargv[1] );
+
                /* set size limit */
                } else if ( strcasecmp( cargv[0], "sizelimit" ) == 0 ) {
                        if ( cargc < 2 ) {
@@ -126,11 +161,74 @@ read_config( char *fname, Backend **bep, FILE *pfp )
 "%s: line %d: suffix line must appear inside a database definition (ignored)\n",
                                    fname, lineno, 0 );
                        } else {
-                               dn = strdup( cargv[1] );
-                               (void) dn_normalize( dn );
+                               char *dn = ch_strdup( cargv[1] );
+                               (void) dn_normalize_case( dn );
                                charray_add( &be->be_suffix, dn );
                        }
 
+                /* set database suffixAlias */
+                } else if ( strcasecmp( cargv[0], "suffixAlias" ) == 0 ) {
+                        if ( cargc < 2 ) {
+                                Debug( LDAP_DEBUG_ANY,
+                    "%s: line %d: missing alias and aliased_dn in \"suffixAlias <alias> <aliased_dn>\" line\n",
+                                    fname, lineno, 0 );
+                                exit( 1 );
+                        } else if ( cargc < 3 ) {
+                                Debug( LDAP_DEBUG_ANY,
+                    "%s: line %d: missing aliased_dn in \"suffixAlias <alias> <aliased_dn>\" line\n",
+                                    fname, lineno, 0 );
+                                exit( 1 );
+                        } else if ( cargc > 3 ) {
+                                Debug( LDAP_DEBUG_ANY,
+    "%s: line %d: extra cruft in suffixAlias line (ignored)\n",
+                                    fname, lineno, 0 );
+                        }
+                        if ( be == NULL ) {
+                                Debug( LDAP_DEBUG_ANY,
+"%s: line %d: suffixAlias line must appear inside a database definition (ignored)\n",
+                                    fname, lineno, 0 );
+                        } else {
+                                char *alias, *aliased_dn;
+
+                                                               alias = ch_strdup( cargv[1] );
+                                (void) dn_normalize( alias );
+
+                                aliased_dn = ch_strdup( cargv[2] );
+                                (void) dn_normalize( aliased_dn );
+
+
+                                                               if ( strcasecmp( alias, aliased_dn) == 0 ) {
+                                       Debug( LDAP_DEBUG_ANY,
+"%s: line %d: suffixAlias %s is not different from aliased dn (ignored)\n",
+                                    fname, lineno, alias );
+                                                               } else {
+                                       (void) dn_normalize_case( alias );
+                                       (void) dn_normalize_case( aliased_dn );
+                                       charray_add( &be->be_suffixAlias, alias );
+                                       charray_add( &be->be_suffixAlias, aliased_dn );
+                                                               }
+
+                                                               free(alias);
+                                                               free(aliased_dn);
+                        }
+
+               /* set max deref depth */
+               } else if ( strcasecmp( cargv[0], "maxDerefDepth" ) == 0 ) {
+                       if ( cargc < 2 ) {
+                               Debug( LDAP_DEBUG_ANY,
+                   "%s: line %d: missing depth in \"maxDerefDepth <depth>\" line\n",
+                                   fname, lineno, 0 );
+                               exit( 1 );
+                       }
+                       if ( be == NULL ) {
+                               Debug( LDAP_DEBUG_ANY,
+"%s: line %d: depth line must appear inside a database definition (ignored)\n",
+                                   fname, lineno, 0 );
+                       } else {
+                           be->be_maxDerefDepth = atoi (cargv[1]);
+                       }
+
+
                /* set magic "root" dn for this database */
                } else if ( strcasecmp( cargv[0], "rootdn" ) == 0 ) {
                        if ( cargc < 2 ) {
@@ -144,9 +242,8 @@ read_config( char *fname, Backend **bep, FILE *pfp )
 "%s: line %d: rootdn line must appear inside a database definition (ignored)\n",
                                    fname, lineno, 0 );
                        } else {
-                               dn = strdup( cargv[1] );
-                               (void) dn_normalize( dn );
-                               be->be_rootdn = dn;
+                               be->be_root_dn = ch_strdup( cargv[1] );
+                               be->be_root_ndn = dn_normalize_case( ch_strdup( cargv[1] ) );
                        }
 
                /* set super-secret magic database password */
@@ -162,7 +259,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
 "%s: line %d: rootpw line must appear inside a database definition (ignored)\n",
                                    fname, lineno, 0 );
                        } else {
-                               be->be_rootpw = strdup( cargv[1] );
+                               be->be_root_pw = ch_strdup( cargv[1] );
                        }
 
                /* make this database read-only */
@@ -193,7 +290,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                    fname, lineno, 0 );
                                exit( 1 );
                        }
-                       default_referral = (char *) malloc( strlen( cargv[1] )
+                       default_referral = (char *) ch_malloc( strlen( cargv[1] )
                            + sizeof("Referral:\n") + 1 );
                        strcpy( default_referral, "Referral:\n" );
                        strcat( default_referral, cargv[1] );
@@ -278,7 +375,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                        if ( strncasecmp( cargv[i], "host=", 5 )
                                            == 0 ) {
                                                charray_add( &be->be_replica,
-                                                   strdup( cargv[i] + 5 ) );
+                                                   ch_strdup( cargv[i] + 5 ) );
                                                break;
                                        }
                                }
@@ -302,8 +399,8 @@ read_config( char *fname, Backend **bep, FILE *pfp )
 "%s: line %d: updatedn line must appear inside a database definition (ignored)\n",
                                    fname, lineno, 0 );
                        } else {
-                               be->be_updatedn = strdup( cargv[1] );
-                               (void) dn_normalize( be->be_updatedn );
+                               be->be_update_ndn = ch_strdup( cargv[1] );
+                               (void) dn_normalize_case( be->be_update_ndn );
                        }
 
                /* replication log file to which changes are appended */
@@ -315,9 +412,9 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                exit( 1 );
                        }
                        if ( be ) {
-                               be->be_replogfile = strdup( cargv[1] );
+                               be->be_replogfile = ch_strdup( cargv[1] );
                        } else {
-                               replogfile = strdup( cargv[1] );
+                               replogfile = ch_strdup( cargv[1] );
                        }
 
                /* maintain lastmodified{by,time} attributes */
@@ -348,7 +445,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                    fname, lineno, 0 );
                                exit( 1 );
                        }
-                       savefname = strdup( cargv[1] );
+                       savefname = ch_strdup( cargv[1] );
                        savelineno = lineno;
                        read_config( savefname, bep, NULL );
                        be = *bep;
@@ -363,7 +460,7 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                                    fname, lineno, 0 );
                                exit( 1 );
                        }
-                       ldap_srvtab = strdup( cargv[1] );
+                       ldap_srvtab = ch_strdup( cargv[1] );
 
                /* pass anything else to the current backend config routine */
                } else {
@@ -382,6 +479,8 @@ read_config( char *fname, Backend **bep, FILE *pfp )
                }
        }
        fclose( fp );
+
+       if ( startup ) be_startup();
 }
 
 static void
@@ -434,11 +533,11 @@ strtok_quote( char *line, char *sep )
                        } else {
                                inquote = 1;
                        }
-                       strcpy( next, next + 1 );
+                       SAFEMEMCPY( next, next + 1, strlen( next + 1 ) + 1 );
                        break;
 
                case '\\':
-                       strcpy( next, next + 1 );
+                       SAFEMEMCPY( next, next + 1, strlen( next + 1 ) + 1 );
                        break;
 
                default: