summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/biruda.c94
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 );