]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/main.c
Fix prev commit
[openldap] / servers / slapd / main.c
index 2624b98d2f7dd3610e572b2032c69b3ea189d68a..497d40868161bcc3f2b7b8cf6e82aa1e442d6c65 100644 (file)
@@ -1,8 +1,28 @@
 /* $OpenLDAP$ */
-/*
- * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * Copyright 1998-2004 The OpenLDAP Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * <http://www.OpenLDAP.org/license.html>.
+ */
+/* Portions Copyright (c) 1995 Regents of the University of Michigan.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of Michigan at Ann Arbor. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software
+ * is provided ``as is'' without express or implied warranty.
  */
+
 #include "portable.h"
 
 #include <stdio.h>
@@ -21,7 +41,7 @@
 #include "ldif.h"
 
 #ifdef LDAP_SLAPI
-#include "slapi.h"
+#include "slapi/slapi.h"
 #endif
 
 #ifdef LDAP_SIGCHLD
@@ -44,6 +64,20 @@ static struct sockaddr_in    bind_addr;
 #define MAIN_RETURN(x) return(x)
 #endif
 
+typedef int (MainFunc) LDAP_P(( int argc, char *argv[] ));
+extern MainFunc slapadd, slapcat, slapindex, slappasswd;
+
+static struct {
+       char *name;
+       MainFunc *func;
+} tools[] = {
+       {"slapadd", slapadd},
+       {"slapcat", slapcat},
+       {"slapindex", slapindex},
+       {"slappasswd", slappasswd},
+       {NULL, NULL}
+};
+
 /*
  * when more than one slapd is running on one machine, each one might have
  * it's own LOCAL for syslogging and must have its own pid/args files
@@ -83,6 +117,7 @@ static int   cnvt_str2int( char *, STRDISP_P, int );
 #endif /* LOG_LOCAL4 */
 
 static int check_config = 0;
+static int version = 0;
 
 static void
 usage( char *name )
@@ -92,6 +127,8 @@ usage( char *name )
        fprintf( stderr,
                "\t-4\t\tIPv4 only\n"
                "\t-6\t\tIPv6 only\n"
+               "\t-T (a|c|i|p)\tRun in Tool mode\n"
+               "\t-c cookie\tSync cookie of consumer\n"
                "\t-d level\tDebug level" "\n"
                "\t-f filename\tConfiguration file\n"
 #if defined(HAVE_SETUID) && defined(HAVE_SETGID)
@@ -109,6 +146,7 @@ usage( char *name )
                "\t-t\t\tCheck configuration file and exit\n"
 #if defined(HAVE_SETUID) && defined(HAVE_SETGID)
                "\t-u user\t\tUser (id or name) to run as\n"
+               "\t-V\t\tprint version info (-VV only)\n"
 #endif
     );
 }
@@ -141,9 +179,13 @@ int main( int argc, char **argv )
 #else
        char            *configfile = SLAPD_DEFAULT_CONFIGFILE;
 #endif
-       char        *serverName = NULL;
+       char        *serverName;
        int         serverMode = SLAP_SERVER_MODE;
 
+       struct berval cookie = { 0, NULL };
+       struct sync_cookie *scp = NULL;
+       struct sync_cookie *scp_entry = NULL;
+
 #ifdef CSRIMALLOC
        FILE *leakfile;
        if( ( leakfile = fopen( "slapd.leak", "w" )) == NULL ) {
@@ -151,6 +193,19 @@ int main( int argc, char **argv )
        }
 #endif
 
+       sl_mem_init();
+
+       serverName = lutil_progname( "slapd", argc, argv );
+
+       if ( strcmp( serverName, "slapd" ) ) {
+               for (i=0; tools[i].name; i++) {
+                       if ( !strcmp( serverName, tools[i].name ) ) {
+                               rc = tools[i].func(argc, argv);
+                               MAIN_RETURN(rc);
+                       }
+               }
+       }
+
 #ifdef HAVE_NT_SERVICE_MANAGER
        {
                int *i;
@@ -159,7 +214,6 @@ int main( int argc, char **argv )
                char *regService = NULL;
 
                if ( is_NT_Service ) {
-                       serverName = argv[0];
                        lutil_CommenceStartupProcessing( serverName, slap_sig_shutdown );
                        if ( strcmp(serverName, SERVICE_NAME) )
                            regService = serverName;
@@ -212,7 +266,7 @@ int main( int argc, char **argv )
 #endif
 
        while ( (i = getopt( argc, argv,
-                            "d:f:h:s:n:t"
+                            "c:d:f:h:s:n:t:T:V"
 #if LDAP_PF_INET6
                                "46"
 #endif
@@ -239,7 +293,32 @@ int main( int argc, char **argv )
                case 'h':       /* listen URLs */
                        if ( urls != NULL ) free( urls );
                        urls = ch_strdup( optarg );
-           break;
+                       break;
+
+               case 'c':       /* provide sync cookie, override if exist in replica */
+                       scp = (struct sync_cookie *) ch_calloc( 1,
+                                                                               sizeof( struct sync_cookie ));
+                       ber_str2bv( optarg, strlen( optarg ), 1, &cookie );
+                       ber_bvarray_add( &scp->octet_str, &cookie );
+                       slap_parse_sync_cookie( scp );
+
+                       LDAP_STAILQ_FOREACH( scp_entry, &slap_sync_cookie, sc_next ) {
+                               if ( scp->rid == scp_entry->rid ) {
+#ifdef NEW_LOGGING
+                                       LDAP_LOG( OPERATION, CRIT,
+                                                       "main: duplicated replica id in cookies\n",
+                                                       0, 0, 0 );
+#else
+                                       Debug( LDAP_DEBUG_ANY,
+                                                   "main: duplicated replica id in cookies\n",
+                                                       0, 0, 0 );
+#endif
+                                       slap_sync_cookie_free( scp, 1 );
+                                       goto destroy;
+                               }
+                       }
+                       LDAP_STAILQ_INSERT_TAIL( &slap_sync_cookie, scp, sc_next );
+                       break;
 
                case 'd':       /* set debug level and 'do not detach' flag */
                        no_detach = 1;
@@ -287,14 +366,24 @@ int main( int argc, char **argv )
 #endif /* SETUID && GETUID */
 
                case 'n':  /* NT service name */
-                       if( serverName != NULL ) free( serverName );
                        serverName = ch_strdup( optarg );
                        break;
 
                case 't':
                        check_config++;
                        break;
+               case 'V':
+                       version++;
+                       break;
 
+               case 'T':
+                       for (i=0; tools[i].name; i++) {
+                               if ( optarg[0] == tools[i].name[4] ) {
+                                       rc = tools[i].func(argc, argv);
+                                       MAIN_RETURN(rc);
+                               }
+                       }
+                       /* FALLTHRU */
                default:
                        usage( argv[0] );
                        rc = 1;
@@ -312,24 +401,34 @@ int main( int argc, char **argv )
        ldif_debug = slap_debug;
 #endif
 
-#ifdef NEW_LOGGING
-       LDAP_LOG( SLAPD, INFO, "%s", Versionstr, 0, 0 );
+       if ( version ) {
+               fprintf( stderr, "%s\n", Versionstr );
+               if ( version > 1 ) goto stop;
+       }
+
+       {
+               char *logName;
+#ifdef HAVE_EBCDIC
+               logName = ch_strdup( serverName );
+               __atoe( logName );
 #else
-       Debug( LDAP_DEBUG_TRACE, "%s", Versionstr, 0, 0 );
+               logName = serverName;
 #endif
 
-       if( serverName == NULL ) {
-               if ( (serverName = strrchr( argv[0], *LDAP_DIRSEP )) == NULL ) {
-                       serverName = argv[0];
-               } else {
-                       serverName = serverName + 1;
-               }
-       }
-
 #ifdef LOG_LOCAL4
-       openlog( serverName, OPENLOG_OPTIONS, syslogUser );
+               openlog( logName, OPENLOG_OPTIONS, syslogUser );
 #elif LOG_DEBUG
-       openlog( serverName, OPENLOG_OPTIONS );
+               openlog( logName, OPENLOG_OPTIONS );
+#endif
+#ifdef HAVE_EBCDIC
+               free( logName );
+#endif
+       }
+
+#ifdef NEW_LOGGING
+       LDAP_LOG( SLAPD, INFO, "%s", Versionstr, 0, 0 );
+#else
+       Debug( LDAP_DEBUG_ANY, "%s", Versionstr, 0, 0 );
 #endif
 
        if( !check_config && slapd_daemon_init( urls ) != 0 ) {
@@ -361,6 +460,7 @@ int main( int argc, char **argv )
 
        extops_init();
        lutil_passwd_init();
+       slap_op_init();
 
 #ifdef SLAPD_MODULES
        if ( module_init() != 0 ) {
@@ -370,12 +470,6 @@ int main( int argc, char **argv )
        }
 #endif
 
-       if ( slap_init( serverMode, serverName ) != 0 ) {
-               rc = 1;
-               SERVICE_EXIT( ERROR_SERVICE_SPECIFIC_ERROR, 18 );
-               goto destroy;
-       }
-
        if ( slap_schema_init( ) != 0 ) {
 #ifdef NEW_LOGGING
                LDAP_LOG( OPERATION, CRIT, "main: schema initialization error\n", 0, 0, 0 );
@@ -388,6 +482,12 @@ int main( int argc, char **argv )
                goto destroy;
        }
 
+       if ( slap_init( serverMode, serverName ) != 0 ) {
+               rc = 1;
+               SERVICE_EXIT( ERROR_SERVICE_SPECIFIC_ERROR, 18 );
+               goto destroy;
+       }
+
        if ( slap_controls_init( ) != 0 ) {
 #ifdef NEW_LOGGING
                LDAP_LOG( OPERATION, CRIT, "main: controls initialization error\n", 0, 0, 0 );
@@ -411,7 +511,7 @@ int main( int argc, char **argv )
 #endif
 
 #ifdef LDAP_SLAPI
-       if ( slapi_init() != 0 ) {
+       if ( slapi_int_initialize() != 0 ) {
 #ifdef NEW_LOGGING
                LDAP_LOG( OPERATION, CRIT, "main: slapi initialization error\n", 0, 0, 0 );
 #else
@@ -424,6 +524,10 @@ int main( int argc, char **argv )
        }
 #endif /* LDAP_SLAPI */
 
+       if ( overlay_init() ) {
+               goto destroy;
+       }
+
        if ( read_config( configfile, 0 ) != 0 ) {
                rc = 1;
                SERVICE_EXIT( ERROR_SERVICE_SPECIFIC_ERROR, 19 );
@@ -521,6 +625,12 @@ int main( int argc, char **argv )
        mal_leaktrace(1);
 #endif
 
+       /*
+        * FIXME: moved here from slapd_daemon_task()
+        * because back-monitor db_open() needs it
+        */
+       time( &starttime );
+
        if ( slap_startup( NULL )  != 0 ) {
                rc = 1;
                SERVICE_EXIT( ERROR_SERVICE_SPECIFIC_ERROR, 21 );
@@ -583,10 +693,18 @@ destroy:
        /* remember an error during destroy */
        rc |= slap_destroy();
 
+       while ( !LDAP_STAILQ_EMPTY( &slap_sync_cookie )) {
+               scp = LDAP_STAILQ_FIRST( &slap_sync_cookie );
+               LDAP_STAILQ_REMOVE_HEAD( &slap_sync_cookie, sc_next );
+               ch_free( scp );
+       }
+
 #ifdef SLAPD_MODULES
        module_kill();
 #endif
 
+       slap_op_destroy();
+
        extops_kill();
 
 stop: