From 7a48a29357cccb9ffd6655c65d275c917156ce17 Mon Sep 17 00:00:00 2001 From: robijn Date: Sun, 16 Feb 2003 15:29:38 +0000 Subject: [PATCH] Modifications to main.c: - Now using CHAIN in stead of ESSENTIAL #define - Changed naming of report* local variables - Modified -s -f and -i options to accept boolean to be able to disable them too. --- server/main.c | 197 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 117 insertions(+), 80 deletions(-) diff --git a/server/main.c b/server/main.c index d5a4f61..0730bea 100644 --- a/server/main.c +++ b/server/main.c @@ -62,8 +62,8 @@ extern int optind, optopt, opterr; #include "drivers.h" #include "main.h" -#define DEFAULT_LCD_PORT LCDPORT #define DEFAULT_BIND_ADDR "127.0.0.1" +#define DEFAULT_BIND_PORT LCDPORT #define DEFAULT_CONFIGFILE "/etc/LCDd.conf" #define DEFAULT_USER "nobody" #define DEFAULT_DRIVER "curses" @@ -73,9 +73,7 @@ extern int optind, optopt, opterr; #define DEFAULT_ROTATE_SERVER_SCREEN 1 #define DEFAULT_REPORTTOSYSLOG 0 #define DEFAULT_REPORTLEVEL RPT_WARNING -#define DEFAULT_ADDR "127.0.0.1" -//#define DEFAULT_WAITTIME 8 #define DEFAULT_SCREEN_DURATION 32 #define DEFAULT_HEARTBEAT HEARTBEAT_ON @@ -116,8 +114,8 @@ char user[64]; /* The values will be overwritten anyway... */ int daemon_mode = UNSET_INT; int rotate_server_screen = UNSET_INT; -static int reportLevel = UNSET_INT; -static int reportToSyslog = UNSET_INT; +static int report_level = UNSET_INT; +static int report_to_syslog = UNSET_INT; /* The drivers and their driver parameters */ char *drivernames[MAX_DRIVERS]; @@ -131,6 +129,7 @@ long int timer = 0; /**** Local functions ****/ void exit_program (int val); void catch_reload_signal (int val); +int interpret_boolean_arg (char *s); void HelpScreen (); void clear_settings(); @@ -145,11 +144,13 @@ int init_drivers(); int init_screens(); void do_mainloop(); +#define CHAIN(e,f) { if( e>=0 ) { e=(f); }} +#define CHAIN_END(e,msg) { if( e<0 ) { report( RPT_CRIT,(msg)); exit(e); }} -#define ESSENTIAL(f) {int r; if( ( r=(f) )<0 ) { report( RPT_CRIT,"Critical error, abort"); exit_program(0);}} int main (int argc, char **argv) { + int e = 0; stored_argc = argc; stored_argv = argv; @@ -194,46 +195,47 @@ main (int argc, char **argv) clear_settings(); /* Read command line*/ - ESSENTIAL( process_command_line (argc, argv) ); + CHAIN( e, process_command_line (argc, argv) ); /* Read config file * Set configfile to default value first unless changed before */ if (strcmp(configfile, UNSET_STR)==0) strncpy (configfile, DEFAULT_CONFIGFILE, sizeof(configfile)); - ESSENTIAL( process_configfile (configfile) ); + CHAIN( e, process_configfile (configfile) ); /* Set default values*/ - set_default_settings(); + CHAIN( e, ( set_default_settings(), 0 )); /* Set reporting values*/ - ESSENTIAL( set_reporting( "LCDd", reportLevel, (reportToSyslog?RPT_DEST_SYSLOG:RPT_DEST_STDERR) ) ); - report( RPT_INFO, "Set report level to %d, output to %s", reportLevel, (reportToSyslog?"syslog":"stderr") ); + CHAIN( e, set_reporting( "LCDd", report_level, (report_to_syslog?RPT_DEST_SYSLOG:RPT_DEST_STDERR) ) ); + CHAIN( e, ( report( RPT_INFO, "Set report level to %d, output to %s", report_level, (report_to_syslog?"syslog":"stderr") ), 0 )); /* Startup the server*/ - ESSENTIAL( screenlist_init() ); - ESSENTIAL( init_drivers() ); - ESSENTIAL( init_sockets() ); - ESSENTIAL( input_init() ); - ESSENTIAL( menuscreens_init() ); - ESSENTIAL( server_screen_init() ); - ESSENTIAL( drop_privs(user) ); + CHAIN( e, screenlist_init() ); + CHAIN( e, init_drivers() ); + CHAIN( e, init_sockets() ); + CHAIN( e, input_init() ); + CHAIN( e, menuscreens_init() ); + CHAIN( e, server_screen_init() ); + CHAIN( e, drop_privs(user) ); + CHAIN_END( e, "Critical error while initializing, abort." ); /* Now, go into daemon mode...*/ if (daemon_mode) { report(RPT_INFO, "Server forking to background"); - ESSENTIAL( daemonize() ); + CHAIN( e, daemonize() ); } else { output_GPL_notice(); report(RPT_INFO, "Server running in foreground"); } + CHAIN_END( e, "Critical error while initializing, abort." ); do_mainloop(); /* This loop never stops; we'll get out only with a signal...*/ return 0; } -#undef ESSENTIAL void @@ -252,8 +254,8 @@ clear_settings () backlight = UNSET_INT; default_duration = UNSET_INT; - reportToSyslog = UNSET_INT; - reportLevel = UNSET_INT; + report_to_syslog = UNSET_INT; + report_level = UNSET_INT; for( i=0; i < num_drivers; i++ ) { free( drivernames[i] ); @@ -267,7 +269,8 @@ clear_settings () int process_command_line (int argc, char **argv) { - int c; + int c, b; + int e = 0; debug( RPT_DEBUG, "%s( argc=%d, argv=...)", __FUNCTION__, argc ); @@ -275,7 +278,7 @@ process_command_line (int argc, char **argv) optind = 0; /* analyze options here..*/ - while ((c = getopt(argc, argv, "a:p:d:hfib:w:c:u:sr:")) > 0) { + while ((c = getopt(argc, argv, "ha:p:f:ib:w:c:u:s:r:")) > 0) { /* FIXME: Setting of c in this loop clobbers s! * s is set equivalent to c. */ @@ -289,27 +292,44 @@ process_command_line (int argc, char **argv) num_drivers ++; } else report( RPT_ERR, "Too many drivers!" ); + e = 1; break; case 'p': lcd_port = atoi(optarg); break; case 'u': strncpy(user, optarg, sizeof(user)); + user[sizeof(user)-1] = 0; /* Terminate string */ break; case 'a': strncpy(bind_addr, optarg, sizeof(bind_addr)); + bind_addr[sizeof(bind_addr)-1] = 0; /* Terminate string */ break; case 'h': - HelpScreen (); + e = 1; /* Well, it's not an error, but + will give the same result */ break; case 'f': - daemon_mode = 0; + b = interpret_boolean_arg( optarg ); + if( b == -1 ) { + report( RPT_ERR, "Not a boolean value: '%s'", optarg ); + e = 1; + } else { + daemon_mode = !b; + } break; case 'c': strncpy(configfile, optarg, sizeof(configfile)); + configfile[sizeof(configfile)-1] = 0; /* Terminate string */ break; case 'i': - rotate_server_screen = 0; + b = interpret_boolean_arg( optarg ); + if( b == -1 ) { + report( RPT_ERR, "Not a boolean value: '%s'", optarg ); + e = 1; + } else { + rotate_server_screen = b; + } break; case 'b': if( strcmp( optarg, "on" ) == 0 ) { @@ -323,36 +343,46 @@ process_command_line (int argc, char **argv) } else if( strcmp( optarg, "" ) != 0 ) { report( RPT_ERR, "Backlight state should be on, off or open" ); - HelpScreen(); + e = 1; } break; case 'w': default_duration = (int) (atof(optarg) * 1e6 / TIME_UNIT); if ( default_duration * TIME_UNIT < 2e6 ) { report( RPT_ERR, "Waittime should be at least 2 (seconds), not %.8s", optarg ); - HelpScreen (); + e = 1; }; break; case 's': - reportToSyslog = 1; + b = interpret_boolean_arg( optarg ); + if( b == -1 ) { + report( RPT_ERR, "Not a boolean value: '%s'", optarg ); + e = 1; + } else { + report_to_syslog = b; + } break; case 'r': - reportLevel = atoi(optarg); + report_level = atoi(optarg); break; case '?': report( RPT_ERR, "Unknown option: '%c'", optopt ); - HelpScreen(); + e = 1; break; case ':': report( RPT_ERR, "Missing option argument!" ); - HelpScreen(); + e = 1; break; } } - if (optind < argc) + if (optind < argc) { report( RPT_ERR, "Non-option arguments on the command line !"); - + e = 1; + } + if( e ) { + HelpScreen(); + } return 0; } @@ -418,11 +448,11 @@ process_configfile ( char *configfile ) } } - if( reportToSyslog == UNSET_INT ) { - reportToSyslog = config_get_bool( "server", "reportToSyslog", 0, UNSET_INT ); + if( report_to_syslog == UNSET_INT ) { + report_to_syslog = config_get_bool( "server", "reportToSyslog", 0, UNSET_INT ); } - if( reportLevel == UNSET_INT ) { - reportLevel = config_get_int( "server", "reportLevel", 0, UNSET_INT ); + if( report_level == UNSET_INT ) { + report_level = config_get_int( "server", "reportLevel", 0, UNSET_INT ); } @@ -458,7 +488,7 @@ set_default_settings() /* Set defaults into unfilled variables....*/ if (lcd_port == UNSET_INT) - lcd_port = DEFAULT_LCD_PORT; + lcd_port = DEFAULT_BIND_PORT; if (strcmp( bind_addr, UNSET_STR ) == 0) strncpy (bind_addr, DEFAULT_BIND_ADDR, sizeof(bind_addr)); if (strcmp( user, UNSET_STR ) == 0) @@ -474,10 +504,10 @@ set_default_settings() if (backlight == UNSET_INT) backlight = BACKLIGHT_OPEN; - if (reportToSyslog == UNSET_INT ) - reportToSyslog = DEFAULT_REPORTTOSYSLOG; - if( reportLevel == UNSET_INT ) - reportLevel = DEFAULT_REPORTLEVEL; + if (report_to_syslog == UNSET_INT ) + report_to_syslog = DEFAULT_REPORTTOSYSLOG; + if( report_level == UNSET_INT ) + report_level = DEFAULT_REPORTLEVEL; /* Use default driver*/ @@ -497,7 +527,7 @@ output_GPL_notice() */ fprintf (stderr, "LCDd %s, LCDproc Protocol %s\n", VERSION, PROTOCOL_VERSION); fprintf (stderr, "Part of LCDproc\n"); - fprintf (stderr, "Copyright (C) 1998-2002 William Ferrell, Scott Scriven\n"); + fprintf (stderr, "Copyright (C) 1998-2003 William Ferrell, Scott Scriven\n"); fprintf (stderr, " and many other contributors\n\n"); fprintf (stderr, "This program is free software; you can redistribute it and/or\n"); fprintf (stderr, "modify it under the terms of the GNU General Public License\n"); @@ -647,40 +677,40 @@ init_screens () } if (!rotate_server_screen) { /* Display the server screen only when there are no other screens */ - server_screen->priority = 256; + server_screen->priority = PRI_BACKGROUND; } return 0; } -#define ESSENTIAL(f) {int r; if( ( r=(f) )<0 ) { report( RPT_CRIT,"Critical error while reloading, abort"); _exit(0);}} void do_reload () { + int e = 0; + drivers_unload_all (); /* Close all drivers */ config_clear(); clear_settings(); /* Reread command line*/ - ESSENTIAL( process_command_line (stored_argc, stored_argv) ); + CHAIN( e, process_command_line (stored_argc, stored_argv) ); /* Reread config file */ if (strcmp(configfile, UNSET_STR)==0) strncpy (configfile, DEFAULT_CONFIGFILE, sizeof(configfile)); - ESSENTIAL( process_configfile (configfile) ); + CHAIN( e, process_configfile (configfile) ); /* Set default values */ - set_default_settings(); + CHAIN( e, ( set_default_settings(), 0 )); /* Set reporting values */ - ESSENTIAL( set_reporting( "LCDd", reportLevel, (reportToSyslog?RPT_DEST_SYSLOG:RPT_DEST_STDERR) ) ); - report( RPT_INFO, "Set report level to %d, output to %s", reportLevel, (reportToSyslog?"syslog":"stderr") ); + CHAIN( e, set_reporting( "LCDd", report_level, (report_to_syslog?RPT_DEST_SYSLOG:RPT_DEST_STDERR) ) ); + CHAIN( e, ( report( RPT_INFO, "Set report level to %d, output to %s", report_level, (report_to_syslog?"syslog":"stderr") ), 0 )); /* And restart the drivers */ - ESSENTIAL( init_drivers() ); - + CHAIN( e, init_drivers() ); + CHAIN_END( e, "Critical error while reloading, abort." ); } -#undef ESSENTIAL void do_mainloop () @@ -780,11 +810,11 @@ exit_program (int val) } /* Set emergency reporting and flush all messages if not done already. */ - if( reportLevel == UNSET_INT ) - reportLevel = DEFAULT_REPORTLEVEL; - if( reportToSyslog == UNSET_INT ) - reportToSyslog = DEFAULT_REPORTTOSYSLOG; - set_reporting( "LCDd", reportLevel, (reportToSyslog?RPT_DEST_SYSLOG:RPT_DEST_STDERR) ); + if( report_level == UNSET_INT ) + report_level = DEFAULT_REPORTLEVEL; + if( report_to_syslog == UNSET_INT ) + report_to_syslog = DEFAULT_REPORTTOSYSLOG; + set_reporting( "LCDd", report_level, (report_to_syslog?RPT_DEST_SYSLOG:RPT_DEST_STDERR) ); goodbye_screen (); /* display goodbye screen on LCD display */ drivers_unload_all (); /* release driver memory and file descriptors */ @@ -806,6 +836,20 @@ catch_reload_signal (int val) got_reload_signal = 1; } +int +interpret_boolean_arg (char *s) +{ + if( strcmp( s, "on" ) == 0 || strcmp( s, "yes" ) + || strcmp( s, "true" ) || strcmp( s, "1" )) { + return 1; + } + if( strcmp( s, "off" ) == 0 || strcmp( s, "no" ) + || strcmp( s, "false" ) || strcmp( s, "0" )) { + return 0; + } + return -1; +} + void HelpScreen () { @@ -815,30 +859,23 @@ HelpScreen () debug( RPT_DEBUG, "%s()", __FUNCTION__ ); fprintf (stdout, "\nLCDd: LCDproc Server Daemon, %s\n", version); - fprintf (stdout, "Copyright (c) 1999 Scott Scriven, William Ferrell, and misc contributors\n"); + fprintf (stdout, "Copyright (c) 1999-2003 Scott Scriven, William Ferrell, and misc contributors\n"); fprintf (stdout, "This program is freely redistributable under the terms of the GNU Public License\n\n"); - fprintf (stdout, "Usage: LCDd [ -hfiws ] [ -c ] [ -d ] [ -a ] \\\n\t[ -p ] [ -u ] [ -w