/* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * * 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 * . */ /* 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 "ldap_pvt.h" #include "slap.h" #include "lutil.h" #include "ldif.h" #ifdef LDAP_SLAPI #include "slapi/slapi.h" #endif #ifdef LDAP_SIGCHLD static RETSIGTYPE wait4child( int sig ); #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 typedef int (MainFunc) LDAP_P(( int argc, char *argv[] )); extern MainFunc slapadd, slapcat, slapdn, slapindex, slappasswd, slaptest, slapauth, slapacl; static struct { char *name; MainFunc *func; } tools[] = { {"slapadd", slapadd}, {"slapcat", slapcat}, {"slapdn", slapdn}, {"slapindex", slapindex}, {"slappasswd", slappasswd}, {"slaptest", slaptest}, {"slapauth", slapauth}, {"slapacl", slapacl}, /* NOTE: new tools must be added in chronological order, * not in alphabetical order, because for backwards * compatibility name[4] is used to identify the * tools; so name[4]=='a' must refer to "slapadd" and * not to "slapauth". Alphabetical order can be used * for tools whose name[4] is not used yet */ {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 */ #ifndef HAVE_MKVERSION const char Versionstr[] = OPENLDAP_PACKAGE " " OPENLDAP_VERSION " Standalone LDAP Server (slapd)"; #endif #ifdef LOG_LOCAL4 #define DEFAULT_SYSLOG_USER LOG_LOCAL4 typedef struct _str2intDispatch { char *stringVal; int abbr; int intVal; } STRDISP, *STRDISP_P; /* table to compute syslog-options to integer */ static STRDISP syslog_types[] = { { "LOCAL0", sizeof("LOCAL0"), LOG_LOCAL0 }, { "LOCAL1", sizeof("LOCAL1"), LOG_LOCAL1 }, { "LOCAL2", sizeof("LOCAL2"), LOG_LOCAL2 }, { "LOCAL3", sizeof("LOCAL3"), LOG_LOCAL3 }, { "LOCAL4", sizeof("LOCAL4"), LOG_LOCAL4 }, { "LOCAL5", sizeof("LOCAL5"), LOG_LOCAL5 }, { "LOCAL6", sizeof("LOCAL6"), LOG_LOCAL6 }, { "LOCAL7", sizeof("LOCAL7"), LOG_LOCAL7 }, { NULL, 0, 0 } }; static int cnvt_str2int( char *, STRDISP_P, int ); #endif /* LOG_LOCAL4 */ #define CHECK_NONE 0x00 #define CHECK_CONFIG 0x01 static int check = CHECK_NONE; static int version = 0; void *slap_tls_ctx; static int slapd_opt_slp( const char *val, void *arg ) { #ifdef HAVE_SLP /* NULL is default */ if ( val == NULL || strcasecmp( val, "on" ) == 0 ) { slapd_register_slp = 1; } 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( "slapd: SLP support is not available\n", stderr ); return 0; #endif } struct option_helper { struct berval oh_name; int (*oh_fnc)(const char *val, void *arg); void *oh_arg; } option_helpers[] = { { BER_BVC("slp"), slapd_opt_slp, NULL }, { BER_BVNULL } }; static void usage( char *name ) { fprintf( stderr, "usage: %s options\n", name ); fprintf( stderr, "\t-4\t\tIPv4 only\n" "\t-6\t\tIPv6 only\n" "\t-T {add|auth|cat|dn|index|passwd|test}\n" "\t\t\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) "\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 "\t-l facility\tSyslog facility (default: LOCAL4)\n" #endif "\t-n serverName\tService name\n" "\t-o