/* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * * Copyright 1998-2015 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 * . */ /* 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 #include #include #include #include #include #include #include #include #include "slap.h" #include "lutil.h" #include "ldif.h" #ifdef LDAP_SIGCHLD static void wait4child( evutil_socket_t sig, short what, void *arg ); #endif #ifdef SIGPIPE static void sigpipe( evutil_socket_t sig, short what, void *arg ); #endif #ifdef HAVE_NT_SERVICE_MANAGER #define MAIN_RETURN(x) return static struct sockaddr_in bind_addr; #define SERVICE_EXIT( e, n ) \ do { \ if ( is_NT_Service ) { \ lutil_ServiceStatus.dwWin32ExitCode = (e); \ lutil_ServiceStatus.dwServiceSpecificExitCode = (n); \ } \ } while (0) #else #define SERVICE_EXIT( e, n ) #define MAIN_RETURN(x) return (x) #endif struct signal_handler { int signal; event_callback_fn handler; struct event *event; } signal_handlers[] = { { LDAP_SIGUSR2, slap_sig_shutdown }, #ifdef SIGPIPE { SIGPIPE, sigpipe }, #endif #ifdef SIGHUP { SIGHUP, slap_sig_shutdown }, #endif { SIGINT, slap_sig_shutdown }, { SIGTERM, slap_sig_shutdown }, #ifdef SIGTRAP { SIGTRAP, slap_sig_shutdown }, #endif #ifdef LDAP_SIGCHLD { LDAP_SIGCHLD, wait4child }, #endif #ifdef SIGBREAK /* SIGBREAK is generated when Ctrl-Break is pressed. */ { SIGBREAK, slap_sig_shutdown }, #endif { 0, NULL } }; /* * when more than one lloadd is running on one machine, each one might have * it's own LOCAL for syslogging and must have its own pid/args files */ #ifndef HAVE_MKVERSION const char Versionstr[] = OPENLDAP_PACKAGE " " OPENLDAP_VERSION " LDAP Load Balancer Server (lloadd)"; #endif #define CHECK_NONE 0x00 #define CHECK_CONFIG 0x01 #define CHECK_LOGLEVEL 0x02 static int check = CHECK_NONE; static int version = 0; void *slap_tls_ctx; LDAP *slap_tls_ld, *slap_tls_backend_ld; static int slapd_opt_slp( const char *val, void *arg ) { #ifdef HAVE_SLP /* NULL is default */ if ( val == NULL || *val == '(' || strcasecmp( val, "on" ) == 0 ) { slapd_register_slp = 1; slapd_slp_attrs = ( val != NULL && *val == '(' ) ? val : NULL; } else if ( strcasecmp( val, "off" ) == 0 ) { slapd_register_slp = 0; /* NOTE: add support for URL specification? */ } else { fprintf( stderr, "unrecognized value \"%s\" for SLP option\n", val ); return -1; } return 0; #else fputs( "lloadd: SLP support is not available\n", stderr ); return 0; #endif } /* * Option helper structure: * * oh_nam is left-hand part of