summaryrefslogtreecommitdiff
path: root/src/testd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/testd.c')
-rw-r--r--src/testd.c149
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 );
+}