X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmain.c;h=a70698f2f449dee3663350ad2dc8a321858e4074;hb=c4f99a5ddcd06ea4daaaa41ef3bcd5919c1e0549;hp=994f9fcfa933c663d6f7dace9eeb927d7df48a6b;hpb=da6d9eb0463255782f3fa70c61fd958d94c048cf;p=openldap diff --git a/servers/slapd/main.c b/servers/slapd/main.c index 994f9fcfa9..a70698f2f4 100644 --- a/servers/slapd/main.c +++ b/servers/slapd/main.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2007 The OpenLDAP Foundation. + * Copyright 1998-2011 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -65,7 +65,7 @@ static struct sockaddr_in bind_addr; typedef int (MainFunc) LDAP_P(( int argc, char *argv[] )); extern MainFunc slapadd, slapcat, slapdn, slapindex, slappasswd, - slaptest, slapauth, slapacl; + slaptest, slapauth, slapacl, slapschema, slapmodify; static struct { char *name; @@ -75,7 +75,9 @@ static struct { {"slapcat", slapcat}, {"slapdn", slapdn}, {"slapindex", slapindex}, + {"slapmodify", slapmodify}, {"slappasswd", slappasswd}, + {"slapschema", slapschema}, {"slaptest", slaptest}, {"slapauth", slapauth}, {"slapacl", slapacl}, @@ -98,6 +100,9 @@ const char Versionstr[] = OPENLDAP_PACKAGE " " OPENLDAP_VERSION " Standalone LDAP Server (slapd)"; #endif +extern OverlayInit slap_oinfo[]; +extern BackendInfo slap_binfo[]; + #define CHECK_NONE 0x00 #define CHECK_CONFIG 0x01 #define CHECK_LOGLEVEL 0x02 @@ -269,7 +274,18 @@ parse_debug_level( const char *arg, int *levelp, char ***unknowns ) ldap_charray_free( levels ); } else { - if ( lutil_atoix( &level, arg, 0 ) != 0 ) { + int rc; + + if ( arg[0] == '-' ) { + rc = lutil_atoix( &level, arg, 0 ); + } else { + unsigned ulevel; + + rc = lutil_atoux( &ulevel, arg, 0 ); + level = (int)ulevel; + } + + if ( rc ) { fprintf( stderr, "unrecognized log level " "\"%s\"\n", arg ); @@ -295,7 +311,7 @@ usage( char *name ) fprintf( stderr, "\t-4\t\tIPv4 only\n" "\t-6\t\tIPv6 only\n" - "\t-T {acl|add|auth|cat|dn|index|passwd|test}\n" + "\t-T {acl|add|auth|cat|dn|index|modify|passwd|test}\n" "\t\t\tRun in Tool mode\n" "\t-c cookie\tSync cookie of consumer\n" "\t-d level\tDebug level" "\n" @@ -305,7 +321,7 @@ usage( char *name ) "\t-g group\tGroup (id or name) to run as\n" #endif "\t-h URLs\t\tList of URLs to serve\n" -#ifdef LOG_LOCAL4 +#ifdef SLAP_DEFAULT_SYSLOG_USER "\t-l facility\tSyslog facility (default: LOCAL4)\n" #endif "\t-n serverName\tService name\n" @@ -328,7 +344,8 @@ usage( char *name ) #if defined(HAVE_SETUID) && defined(HAVE_SETGID) "\t-u user\t\tUser (id or name) to run as\n" #endif - "\t-V\t\tprint version info (-VV only)\n" + "\t-V\t\tprint version info (-VV exit afterwards, -VVV print\n" + "\t\t\tinfo about static overlays and backends)\n" ); } @@ -348,10 +365,13 @@ int main( int argc, char **argv ) #if defined(HAVE_CHROOT) char *sandbox = NULL; #endif -#ifdef LOG_LOCAL4 +#ifdef SLAP_DEFAULT_SYSLOG_USER int syslogUser = SLAP_DEFAULT_SYSLOG_USER; #endif +#ifndef HAVE_WINSOCK + int pid, waitfds[2]; +#endif int g_argc = argc; char **g_argv = argv; @@ -396,7 +416,7 @@ int main( int argc, char **argv ) #ifdef HAVE_NT_SERVICE_MANAGER { - int *i; + int *ip; char *newConfigFile; char *newConfigDir; char *newUrls; @@ -408,9 +428,9 @@ int main( int argc, char **argv ) regService = serverName; } - i = (int*)lutil_getRegParam( regService, "DebugLevel" ); - if ( i != NULL ) { - slap_debug = *i; + ip = (int*)lutil_getRegParam( regService, "DebugLevel" ); + if ( ip != NULL ) { + slap_debug = *ip; Debug( LDAP_DEBUG_ANY, "new debug level from registry is: %d\n", slap_debug, 0, 0 ); } @@ -427,13 +447,13 @@ int main( int argc, char **argv ) newConfigFile = (char*)lutil_getRegParam( regService, "ConfigFile" ); if ( newConfigFile != NULL ) { - configfile = newConfigFile; + configfile = ch_strdup(newConfigFile); Debug ( LDAP_DEBUG_ANY, "new config file from registry is: %s\n", configfile, 0, 0 ); } newConfigDir = (char*)lutil_getRegParam( regService, "ConfigDir" ); if ( newConfigDir != NULL ) { - configdir = newConfigDir; + configdir = ch_strdup(newConfigDir); Debug ( LDAP_DEBUG_ANY, "new config dir from registry is: %s\n", configdir, 0, 0 ); } } @@ -441,7 +461,7 @@ int main( int argc, char **argv ) while ( (i = getopt( argc, argv, "c:d:f:F:h:n:o:s:tT:V" -#if LDAP_PF_INET6 +#ifdef LDAP_PF_INET6 "46" #endif #ifdef HAVE_CHROOT @@ -532,7 +552,6 @@ int main( int argc, char **argv ) case 'o': { char *val = strchr( optarg, '=' ); struct berval opt; - int i; opt.bv_val = optarg; @@ -667,15 +686,34 @@ unhandled_option:; } } + if ( optind != argc ) + goto unhandled_option; + ber_set_option(NULL, LBER_OPT_DEBUG_LEVEL, &slap_debug); ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, &slap_debug); ldif_debug = slap_debug; if ( version ) { fprintf( stderr, "%s\n", Versionstr ); + if ( version > 2 ) { + if ( slap_oinfo[0].ov_type ) { + fprintf( stderr, "Included static overlays:\n"); + for ( i= 0 ; slap_oinfo[i].ov_type; i++ ) { + fprintf( stderr, " %s\n", slap_oinfo[i].ov_type ); + } + } + if ( slap_binfo[0].bi_type ) { + fprintf( stderr, "Included static backends:\n"); + for ( i= 0 ; slap_binfo[i].bi_type; i++ ) { + fprintf( stderr, " %s\n", slap_binfo[i].bi_type ); + } + } + } + if ( version > 1 ) goto stop; } +#if defined(LDAP_DEBUG) && defined(LDAP_SYSLOG) { char *logName; #ifdef HAVE_EBCDIC @@ -687,16 +725,20 @@ unhandled_option:; #ifdef LOG_LOCAL4 openlog( logName, OPENLOG_OPTIONS, syslogUser ); -#elif LOG_DEBUG +#elif defined LOG_DEBUG openlog( logName, OPENLOG_OPTIONS ); #endif #ifdef HAVE_EBCDIC free( logName ); #endif } +#endif /* LDAP_DEBUG && LDAP_SYSLOG */ Debug( LDAP_DEBUG_ANY, "%s", Versionstr, 0, 0 ); + global_host = ldap_pvt_get_fqdn( NULL ); + ber_str2bv( global_host, 0, 0, &global_host_bv ); + if( check == CHECK_NONE && slapd_daemon_init( urls ) != 0 ) { rc = 1; SERVICE_EXIT( ERROR_SERVICE_SPECIFIC_ERROR, 16 ); @@ -726,7 +768,6 @@ unhandled_option:; extops_init(); lutil_passwd_init(); - slap_op_init(); #ifdef HAVE_TLS rc = ldap_create( &slap_tls_ld ); @@ -734,6 +775,13 @@ unhandled_option:; SERVICE_EXIT( ERROR_SERVICE_SPECIFIC_ERROR, 20 ); goto destroy; } + /* Library defaults to full certificate checking. This is correct when + * a client is verifying a server because all servers should have a + * valid cert. But few clients have valid certs, so we want our default + * to be no checking. The config file can override this as usual. + */ + rc = LDAP_OPT_X_TLS_NEVER; + (void) ldap_pvt_tls_set_option( slap_tls_ld, LDAP_OPT_X_TLS_REQUIRE_CERT, &rc ); #endif rc = slap_init( serverMode, serverName ); @@ -783,7 +831,7 @@ unhandled_option:; } } - if ( glue_sub_attach( ) != 0 ) { + if ( glue_sub_attach( 0 ) != 0 ) { Debug( LDAP_DEBUG_ANY, "subordinate config error\n", 0, 0, 0 ); @@ -804,7 +852,7 @@ unhandled_option:; if( rc != 0) { Debug( LDAP_DEBUG_ANY, "main: TLS init failed: %d\n", - 0, 0, 0 ); + rc, 0, 0 ); rc = 1; SERVICE_EXIT( ERROR_SERVICE_SPECIFIC_ERROR, 20 ); goto destroy; @@ -830,6 +878,12 @@ unhandled_option:; } #endif +#ifdef HAVE_CYRUS_SASL + if( sasl_host == NULL ) { + sasl_host = ch_strdup( global_host ); + } +#endif + (void) SIGNAL( LDAP_SIGUSR1, slap_sig_wake ); (void) SIGNAL( LDAP_SIGUSR2, slap_sig_shutdown ); @@ -853,7 +907,26 @@ unhandled_option:; #endif #ifndef HAVE_WINSOCK - lutil_detach( no_detach, 0 ); + if ( !no_detach ) { + if ( lutil_pair( waitfds ) < 0 ) { + Debug( LDAP_DEBUG_ANY, + "main: lutil_pair failed: %d\n", + 0, 0, 0 ); + rc = 1; + goto destroy; + } + pid = lutil_detach( no_detach, 0 ); + if ( pid ) { + char buf[4]; + rc = EXIT_SUCCESS; + close( waitfds[1] ); + if ( read( waitfds[0], buf, 1 ) != 1 ) + rc = EXIT_FAILURE; + _exit( rc ); + } else { + close( waitfds[0] ); + } + } #endif /* HAVE_WINSOCK */ #ifdef CSRIMALLOC @@ -914,6 +987,8 @@ unhandled_option:; */ time( &starttime ); + connections_init(); + if ( slap_startup( NULL ) != 0 ) { rc = 1; SERVICE_EXIT( ERROR_SERVICE_SPECIFIC_ERROR, 21 ); @@ -922,6 +997,13 @@ unhandled_option:; Debug( LDAP_DEBUG_ANY, "slapd starting\n", 0, 0, 0 ); +#ifndef HAVE_WINSOCK + if ( !no_detach ) { + write( waitfds[1], "1", 1 ); + close( waitfds[1] ); + } +#endif + #ifdef HAVE_NT_EVENT_LOG if (is_NT_Service) lutil_LogStartedEvent( serverName, slap_debug, configfile ? @@ -957,8 +1039,6 @@ destroy: module_kill(); #endif - slap_op_destroy(); - extops_kill(); supported_feature_destroy(); @@ -984,13 +1064,15 @@ stop: controls_destroy(); + filter_destroy(); + schema_destroy(); lutil_passwd_destroy(); #ifdef HAVE_TLS if ( slap_tls_ld ) { - SSL_CTX_free( slap_tls_ctx ); + ldap_pvt_tls_ctx_free( slap_tls_ctx ); ldap_unbind_ext( slap_tls_ld, NULL, NULL ); } ldap_pvt_tls_destroy(); @@ -1013,6 +1095,8 @@ stop: ch_free( configdir ); if ( urls ) ch_free( urls ); + if ( global_host ) + ch_free( global_host ); /* kludge, get symbols referenced */ tavl_free( NULL, NULL ); @@ -1037,13 +1121,12 @@ wait4child( int sig ) int save_errno = errno; #ifdef WNOHANG - errno = 0; + do + errno = 0; #ifdef HAVE_WAITPID - while ( waitpid( (pid_t)-1, NULL, WNOHANG ) > 0 || errno == EINTR ) - ; /* NULL */ + while ( waitpid( (pid_t)-1, NULL, WNOHANG ) > 0 || errno == EINTR ); #else - while ( wait3( NULL, WNOHANG, NULL ) > 0 || errno == EINTR ) - ; /* NULL */ + while ( wait3( NULL, WNOHANG, NULL ) > 0 || errno == EINTR ); #endif #else (void) wait( NULL ); @@ -1053,4 +1136,3 @@ wait4child( int sig ) } #endif /* LDAP_SIGCHLD */ -