diff options
Diffstat (limited to 'src/testd.c')
-rw-r--r-- | src/testd.c | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/src/testd.c b/src/testd.c new file mode 100644 index 0000000..5138b12 --- /dev/null +++ b/src/testd.c @@ -0,0 +1,149 @@ +#include "port/stdbool.h" /* for bool */ +#include "port/string.h" /* for memset */ + +#include <sys/types.h> /* for pid_t */ +#include <unistd.h> /* for exit, unistd, getuid, getppid */ +#include <stdlib.h> /* for EXIT_FAILURE */ + +#include "errors.h" /* global error codes */ +#include "cmdline.h" /* for command line and option parsing (gengetopt) */ +#include "log.h" /* logging facility */ +#include "daemon.h" /* Unix daemonizing code */ +#include "signals.h" /* signal supension */ + +#include "port/unused.h" + +#define DEFAULT_CONFIG_FILE "/etc/" CMDLINE_PARSER_PACKAGE ".conf" + +static int parse_options_and_arguments( int argc, char *argv[], struct gengetopt_args_info *args_info ) { + cmdline_parser_init( args_info ); + + if( cmdline_parser2( argc, argv, args_info, 1, 0, 1 ) != 0 ) { + cmdline_parser_free( args_info ); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + +static int test_config( const char *filename ) { + UNUSED( filename ); + return EXIT_SUCCESS; +} + +static int read_config( const char *filename ) { + UNUSED( filename ); + return EXIT_SUCCESS; +} + +int main( int argc, char *argv[] ) { + struct gengetopt_args_info args_info; + error_t error; + daemon_params_t daemon_params; + daemon_p demon = NULL; + int sig = 0; + + if( parse_options_and_arguments( argc, argv, &args_info ) == EXIT_FAILURE ) { + exit( EXIT_FAILURE ); + } + + if( read_config( args_info.config_file_given ? + args_info.config_file_arg : DEFAULT_CONFIG_FILE ) == EXIT_FAILURE ) { + exit( EXIT_FAILURE ); + } + + if( args_info.test_given ) { + cmdline_parser_free( &args_info ); + exit( test_config( args_info.config_file_given ? + args_info.config_file_arg : DEFAULT_CONFIG_FILE ) ); + } + + openlogtostderr( LOG_DEBUG - 1 + (int)args_info.debug_given ); + if( args_info.logfile_given ) + openlogtofile( args_info.logfile_arg, + args_info.logfile_level_given ? + log_str_to_level( args_info.logfile_level_arg ) : LOG_NOTICE ); + + if( !args_info.foreground_given ) { + openlogtosyslog( CMDLINE_PARSER_PACKAGE, + args_info.syslog_facility_given ? + log_str_to_syslog_facility( args_info.syslog_facility_arg ) : LOG_DAEMON, + args_info.syslog_level_given ? + log_str_to_level( args_info.syslog_level_arg ) : LOG_NOTICE ); + + memset( &daemon_params, 0, sizeof( daemon_params ) ); + daemon_params.daemon_name = CMDLINE_PARSER_PACKAGE; + daemon_params.pid_filename = args_info.pidfile_given ? + args_info.pidfile_arg : NULL; + daemon_params.group_name = args_info.group_given ? + args_info.group_arg : NULL; + daemon_params.user_name = args_info.user_given ? + args_info.user_arg : NULL; + + demon = daemon_new( daemon_params, &error ); + if( demon == NULL ) { + cmdline_parser_free( &args_info ); + exit( EXIT_FAILURE ); + } + + if( ( error = daemon_start( demon ) ) != OK ) { + cmdline_parser_free( &args_info ); + daemon_exit( demon ); + } + } else { + if( ( error = signal_initialize( ) ) != OK ) { + cmdline_parser_free( &args_info ); + exit( EXIT_FAILURE ); + } + if( ( error = signal_install_handlers_daemon( ) ) != OK ) { + signal_terminate( ); + cmdline_parser_free( &args_info ); + exit( EXIT_FAILURE ); + } + } + + LOG( LOG_NOTICE, "Started %s daemon", CMDLINE_PARSER_PACKAGE ); + while( ( sig != SIGTERM ) && ( sig != SIGINT ) && ( sig != -1 ) ) { + sig = signal_suspend( 60, &error ); + switch( sig ) { + case 0: /* timeout */ + break; + + case -1: /* internal error */ + break; + + case SIGHUP: + LOG( LOG_NOTICE, "Rereading configuration" ); + break; + + case SIGTERM: + case SIGINT: + LOG( LOG_NOTICE, "Got termination signal, shutting down the daemon" ); + break; + + case SIGUSR1: + break; + + case SIGUSR2: + break; + + default: + LOG( LOG_ERR, "Unexpected signal '%s' (%s, %d)", + signal_get_long_name( sig ), + signal_get_short_name( sig ), + sig ); + } + } + LOG( LOG_NOTICE, "Stopped %s daemon", CMDLINE_PARSER_PACKAGE ); + + if( !args_info.foreground_given ) { + cmdline_parser_free( &args_info ); + daemon_exit( demon ); + } else { + cmdline_parser_free( &args_info ); + signal_terminate( ); + exit( EXIT_SUCCESS ); + } + + exit( EXIT_FAILURE ); +} |