From 9a39dcb7d414a1be578d5796d5cf7dc9ef8d5be5 Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Tue, 15 Apr 2003 21:56:21 +0000 Subject: [PATCH] add slurpd pid/args files --- doc/man/man5/slapd.conf.5 | 13 ++++++++++++ servers/slurpd/ch_malloc.c | 19 ++++++++++++++++++ servers/slurpd/config.c | 38 ++++++++++++++++++++++++++++++++++- servers/slurpd/main.c | 39 ++++++++++++++++++++++++++++++++++++ servers/slurpd/proto-slurp.h | 5 +++++ 5 files changed, 113 insertions(+), 1 deletion(-) diff --git a/doc/man/man5/slapd.conf.5 b/doc/man/man5/slapd.conf.5 index 2dea58c450..dbaf756a05 100644 --- a/doc/man/man5/slapd.conf.5 +++ b/doc/man/man5/slapd.conf.5 @@ -550,6 +550,19 @@ Specify the referral to pass back when cannot find a local database to handle a request. If specified multiple times, each url is provided. .TP +.B replica-argsfile +The ( absolute ) name of a file that will hold the +.B slurpd +server's command line options +if started without the debugging command line option. +.TP +.B replica-pidfile +The ( absolute ) name of a file that will hold the +.B slurpd +server's process ID ( see +.BR getpid (2) +) if started without the debugging command line option. +.TP .B require Specify a set of conditions (separated by white space) to require (default none). diff --git a/servers/slurpd/ch_malloc.c b/servers/slurpd/ch_malloc.c index 9c95a72cb7..2b42ab2663 100644 --- a/servers/slurpd/ch_malloc.c +++ b/servers/slurpd/ch_malloc.c @@ -109,6 +109,25 @@ ch_calloc( return( new ); } +/* + * Just like strdup, except we check the returned value and exit + * if anything goes wrong. + */ +char * +ch_strdup( + const char *string +) +{ + char *new; + + if ( (new = ber_strdup( string )) == NULL ) { + fprintf( stderr, "ch_strdup: duplication of \"%s\" failed\n", + string ); + exit( EXIT_FAILURE ); + } + + return( new ); +} /* * Just like free, except we check to see if p is null. diff --git a/servers/slurpd/config.c b/servers/slurpd/config.c index 4c6af08b51..4c3a285347 100644 --- a/servers/slurpd/config.c +++ b/servers/slurpd/config.c @@ -48,7 +48,8 @@ char **cargv; /* current config file line # */ static int lineno; - +char *slurpd_pid_file = NULL; +char *slurpd_args_file = NULL; /* * Read the slapd config file, looking only for config options we're @@ -153,6 +154,41 @@ slurpd_read_config( free( savefname ); lineno = savelineno - 1; + + } else if ( strcasecmp( cargv[0], "replica-pidfile" ) == 0 ) { + if ( cargc < 2 ) { +#ifdef NEW_LOGGING + LDAP_LOG( CONFIG, CRIT, + "%s: line %d missing file name in \"replica-pidfile \" " + "line.\n", fname, lineno, 0 ); +#else + Debug( LDAP_DEBUG_ANY, + "%s: line %d: missing file name in \"replica-pidfile \" line\n", + fname, lineno, 0 ); +#endif + + return( 1 ); + } + + slurpd_pid_file = ch_strdup( cargv[1] ); + + } else if ( strcasecmp( cargv[0], "replica-argsfile" ) == 0 ) { + if ( cargc < 2 ) { +#ifdef NEW_LOGGING + LDAP_LOG( CONFIG, CRIT, + "%s: %d: missing file name in " + "\"argsfile \" line.\n", + fname, lineno, 0 ); +#else + Debug( LDAP_DEBUG_ANY, + "%s: line %d: missing file name in \"argsfile \" line\n", + fname, lineno, 0 ); +#endif + + return( 1 ); + } + + slurpd_args_file = ch_strdup( cargv[1] ); } } fclose( fp ); diff --git a/servers/slurpd/main.c b/servers/slurpd/main.c index 5afd941cb7..c12f9e9022 100644 --- a/servers/slurpd/main.c +++ b/servers/slurpd/main.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "slurp.h" #include "globals.h" @@ -176,6 +177,35 @@ int main( int argc, char **argv ) goto stop; } + + if ( slurpd_pid_file != NULL ) { + FILE *fp = fopen( slurpd_pid_file, "w" ); + + if( fp != NULL ) { + fprintf( fp, "%d\n", (int) getpid() ); + fclose( fp ); + + } else { + free(slurpd_pid_file); + slurpd_pid_file = NULL; + } + } + + if ( slurpd_args_file != NULL ) { + FILE *fp = fopen( slurpd_args_file, "w" ); + + if( fp != NULL ) { + for ( i = 0; i < argc; i++ ) { + fprintf( fp, "%s ", argv[i] ); + } + fprintf( fp, "\n" ); + fclose( fp ); + } else { + free(slurpd_args_file); + slurpd_args_file = NULL; + } + } + /* * Detach from the controlling terminal * unless the -d flag is given or in one-shot mode. @@ -262,6 +292,15 @@ stop: #else Debug( LDAP_DEBUG_ANY, "slurpd: terminated.\n", 0, 0, 0 ); #endif + + if ( slurpd_pid_file != NULL ) { + unlink( slurpd_pid_file ); + } + if ( slurpd_args_file != NULL ) { + unlink( slurpd_args_file ); + } + + MAIN_RETURN(rc); #endif /* !NO_THREADS */ } diff --git a/servers/slurpd/proto-slurp.h b/servers/slurpd/proto-slurp.h index bdcce9ad68..dc25d09e68 100644 --- a/servers/slurpd/proto-slurp.h +++ b/servers/slurpd/proto-slurp.h @@ -21,17 +21,22 @@ int doargs LDAP_P((int argc, char **argv, struct globals *g)); #define ch_malloc malloc #define ch_realloc realloc #define ch_calloc calloc +#define ch_strdup strdup #define ch_free free #else void *ch_malloc LDAP_P((ber_len_t size)); void *ch_realloc LDAP_P((void *block, ber_len_t size)); void *ch_calloc LDAP_P((ber_len_t nelem, ber_len_t size)); +char *ch_strdup LDAP_P((const char *str)); void ch_free LDAP_P((void *p)); #endif /* config.c */ int slurpd_read_config LDAP_P((char *fname)); +char *slurpd_pid_file; +char *slurpd_args_file; + /* ch_malloc.c */ void ch_free LDAP_P(( void *p )); -- 2.39.5