diff options
-rw-r--r-- | src/biruda.c | 94 |
1 files changed, 57 insertions, 37 deletions
diff --git a/src/biruda.c b/src/biruda.c index 81f0172..c6679a0 100644 --- a/src/biruda.c +++ b/src/biruda.c @@ -64,8 +64,8 @@ static int read_config( const char *filename, cfg_t **cfg ) }; cfg_opt_t opts[] = { - CFG_SEC( "master", opts_master, 0 ), - CFG_SEC( "coordinator", opts_coordinator, 0 ), + CFG_SEC( "master", opts_master, CFGF_MULTI ), + CFG_SEC( "coordinator", opts_coordinator, CFGF_MULTI ), CFG_SEC( "worker", opts_worker, CFGF_MULTI | CFGF_TITLE ), CFG_SEC( "webserver", opts_webserver, 0 ), CFG_END( ) @@ -92,28 +92,33 @@ static int read_config( const char *filename, cfg_t **cfg ) static void print_config( struct gengetopt_args_info *args_info, cfg_t *cfg ) { cfg_t *master_cfg = cfg_getnsec( cfg, "master", 0 ); - - puts( "Master:" ); - printf( " Control channel: %s\n", cfg_getstr( master_cfg, "control" ) ); - puts( "" ); - + unsigned int has_master = cfg_size( cfg, "master" ); + if( has_master ) { + puts( "Master:" ); + printf( " Control channel: %s\n", cfg_getstr( master_cfg, "control" ) ); + puts( "" ); + } + cfg_t *coordinator_cfg = cfg_getnsec( cfg, "coordinator", 0 ); - - puts( "Coordinator:" ); - printf( " Control channel: %s\n", cfg_getstr( coordinator_cfg, "control" ) ); - puts( "" ); - - printf( "Workers:\n" ); - + unsigned int has_coordinator = cfg_size( cfg, "coordinator" ); + if( has_coordinator ) { + puts( "Coordinator:" ); + printf( " Control channel: %s\n", cfg_getstr( coordinator_cfg, "control" ) ); + puts( "" ); + } + unsigned int nof_workers = cfg_size( cfg, "worker" ); - for( unsigned int i = 0; i < nof_workers; i++ ) { - cfg_t *worker_cfg = cfg_getnsec( cfg, "worker", i ); - - printf( " Worker %d:\n", i ); - printf( " Control channel: %s\n", cfg_getstr( worker_cfg, "control" ) ); + if( nof_workers > 0 ) { + printf( "Workers:\n" ); + for( unsigned int i = 0; i < nof_workers; i++ ) { + cfg_t *worker_cfg = cfg_getnsec( cfg, "worker", i ); + + printf( " Worker %s:\n", cfg_title( worker_cfg ) ); + printf( " Control channel: %s\n", cfg_getstr( worker_cfg, "control" ) ); + } + puts( "" ); } - puts( "" ); - + cfg_t *webserver_cfg = cfg_getnsec( cfg, "webserver", 0 ); puts( "Webserver:" ); @@ -168,27 +173,42 @@ int main( int argc, char *argv[] ) return( ( test_config( &args_info ) == 0 ) ? EXIT_SUCCESS : EXIT_FAILURE ); } - if( create_coordinator( cfg ) != 0 ) { - fprintf( stderr, "FATAL: Unable to create coordinator thread!\n" ); - cfg_free( cfg ); - cmdline_parser_free( &args_info ); - exit( EXIT_FAILURE ); + unsigned int has_master = cfg_size( cfg, "master" ); + if( has_master ) { + if( create_master( cfg ) != 0 ) { + fprintf( stderr, "FATAL: Unable to create master thread!\n" ); + cfg_free( cfg ); + cmdline_parser_free( &args_info ); + exit( EXIT_FAILURE ); + } } - - if( create_master( cfg ) != 0 ) { - fprintf( stderr, "FATAL: Unable to create master thread!\n" ); - cfg_free( cfg ); - cmdline_parser_free( &args_info ); - exit( EXIT_FAILURE ); + + unsigned int has_coordinator = cfg_size( cfg, "coordinator" ); + if( has_coordinator ) { + if( create_coordinator( cfg ) != 0 ) { + fprintf( stderr, "FATAL: Unable to create coordinator thread!\n" ); + cfg_free( cfg ); + cmdline_parser_free( &args_info ); + exit( EXIT_FAILURE ); + } } - + sleep( 4 ); - coordinator_terminate( ); - master_terminate( ); + if( has_coordinator ) { + coordinator_terminate( ); + } + if( has_master ) { + master_terminate( ); + } + + if( has_coordinator ) { + coordinator_free( ); + } + if( has_master ) { + master_free( ); + } - coordinator_free( ); - master_free( ); cfg_free( cfg ); cmdline_parser_free( &args_info ); |