Minor changes (almost entirely in main.c):

* Heavily commented options
* Fixed bug introduced into default_duration and -w (my fault)
* Defined configuration file string defaults (no processing yet)
* Added simple optimization to option processing
* Reformed some comments for easier readability
* Fixed bug that caused program not to drop root privs when
  running on port under 1024
* Converted further to use syslog instead of printf
This commit is contained in:
ddouthitt
2001-09-25 14:03:13 +00:00
parent 4a75325042
commit a7bf3b00ad
2 changed files with 176 additions and 113 deletions
+174 -111
View File
@@ -38,6 +38,7 @@
#define MAX_TIMER 0x10000
#define DEFAULT_USER "nobody"
#define CONFIG_FILE "/etc/LCDd.conf"
int debug_level = 3;
char *version = VERSION;
@@ -111,7 +112,7 @@ int
main (int argc, char **argv)
{
// TODO: Use a config file!
//char cfgfile[256] = "/etc/LCDd.cf";
char cfgfile[256] = CONFIG_FILE;
int i, err;
int daemon_mode = 1;
int disable_server_screen = 1;
@@ -119,14 +120,10 @@ main (int argc, char **argv)
char *str, *ing; // strings for commandline handling
char *user = DEFAULT_USER;
// Ctrl-C will cause a clean exit...
signal (SIGINT, exit_program);
// and "kill"...
signal (SIGTERM, exit_program);
// and "kill -HUP" (hangup)...
signal (SIGHUP, exit_program);
// and just in case, "kill -KILL" (which cannot be trapped; but oh well)
signal (SIGKILL, exit_program);
signal (SIGINT, exit_program); // Ctrl-C will cause a clean exit...
signal (SIGTERM, exit_program); // and "kill"...
signal (SIGHUP, exit_program); // and "kill -HUP" (hangup)...
signal (SIGKILL, exit_program); // and just in case, "kill -KILL" (which cannot be trapped; but oh well)
// If no paramaters given, give the help screen.
if (argc == 1)
@@ -174,124 +171,196 @@ main (int argc, char **argv)
// Parse the command line now...
// TODO: Move this to a separate function?
for (i = 1; i < argc; i++) {
if (0 == strcmp (argv[i], "-d") || 0 == strcmp (argv[i], "--driver")) {
if (argc <= i + 1)
HelpScreen ();
str = argv[++i];
ing = NULL;
if (argv[i][0] == '-') {
// Check to see if the next parameter is intended for LCDd,
// or if it should be passed to the driver...
if (argc > i + 1) {
int j, skip = 0;
for (j = 1; args[j].lg; j++) // check each option except "help"
if (!strcmp (argv[i + 1], args[j].sh) || !strcmp (argv[i + 1], args[j].lg))
skip = 1;
/*
* -d <driver> [ <driver_opts> ... ]
* --driver <driver> [ <driver_opts> ... ]
*
* This option does not transfer to a getopt() version;
* will have to change the option format...
*/
if (!skip) {
ing = argv[++i];
}
//else i++;
}
err = lcd_add_driver (str, ing);
if (err <= 0) {
printf ("Error loading driver %s. Continuing anyway...\n", str);
}
if ((err > 0) && (0 == strcmp (str, "curses")))
daemon_mode = 0;
} else if (0 == strcmp (argv[i], "-h") || 0 == strcmp (argv[i], "--help")) {
HelpScreen ();
}
// Redundant, but it prevents errors...
else if (0 == strcmp (argv[i], "-f") || 0 == strcmp (argv[i], "--foreground")) {
daemon_mode = 0;
} else if (0 == strcmp (argv[i], "-b") || 0 == strcmp (argv[i], "--backlight")) {
if (argc <= i + 1)
HelpScreen ();
str = argv[++i];
if (0 == strcmp (str, "off"))
backlight_state = backlight = BACKLIGHT_OFF;
else if (0 == strcmp (str, "on"))
backlight_state = backlight = BACKLIGHT_ON;
else if (0 == strcmp (str, "open"))
backlight = BACKLIGHT_OPEN;
else
HelpScreen ();
} else if (0 == strcmp (argv[i], "-t") || 0 == strcmp (argv[i], "--type")) {
if (i + 1 > argc)
HelpScreen ();
else {
int wid, hgt;
i++;
sscanf (argv[i], "%ix%i", &wid, &hgt);
if (wid > 80 || wid < 16 || hgt > 25 || hgt < 2) {
fprintf (stderr, "LCDd: Invalid lcd size \"%s\". Using 20x4.\n", argv[i]);
lcd.wid = 20;
lcd.hgt = 4;
} else {
lcd.wid = wid;
lcd.hgt = hgt;
}
}
} else if (0 == strcmp (argv[i], "-i") || 0 == strcmp (argv[i], "--serverinfo")) {
if (i + 1 > argc)
HelpScreen ();
else {
i++;
if (0 == strcmp (argv[i], "off"))
disable_server_screen = 1;
if (0 == strcmp (argv[i], "on"))
disable_server_screen = 0;
}
} else if (0 == strcmp (argv[i], "-w") || 0 == strcmp (argv[i], "--waittime")) {
if (i + 1 > argc)
HelpScreen ();
else {
int tmp ;
i++;
tmp = atoi( argv[i] );
if ( tmp < 16 || tmp > 10000 ) {
printf ("Wait time should be between 16 and 10000 (1/8ths of second), not %s\n", argv[i]);
if (0 == strcmp (argv[i], "-d") || 0 == strcmp (argv[i], "--driver")) {
if (argc <= i + 1)
HelpScreen ();
} else {
default_duration = tmp ;
};
str = argv[++i];
ing = NULL;
// Check to see if the next parameter is intended for LCDd,
// or if it should be passed to the driver...
if (argc > i + 1) {
int j, skip = 0;
for (j = 1; args[j].lg; j++) // check each option except "help"
if (!strcmp (argv[i + 1], args[j].sh) || !strcmp (argv[i + 1], args[j].lg))
skip = 1;
if (!skip) {
ing = argv[++i];
}
//else i++;
}
err = lcd_add_driver (str, ing);
if (err <= 0) {
printf ("Error loading driver %s. Continuing anyway...\n", str);
}
if ((err > 0) && (0 == strcmp (str, "curses")))
daemon_mode = 0;
/*
* -h
* --help
*
* Help function
*/
} else if (0 == strcmp (argv[i], "-h") || 0 == strcmp (argv[i], "--help")) {
HelpScreen ();
}
/*
* -f
* --foreground
*
* Keep program in foreground; use for debugging, such
* as with gdb
*/
// Redundant, but it prevents errors...
else if (0 == strcmp (argv[i], "-f") || 0 == strcmp (argv[i], "--foreground")) {
daemon_mode = 0;
/*
* -b [ "on" | "off" | "open" ]
* --backlight [ "on" | "off" | "open" ]
*
* This should be a driver option, likely within the config file.
* What IS "open" anyway?
*/
} else if (0 == strcmp (argv[i], "-b") || 0 == strcmp (argv[i], "--backlight")) {
if (argc <= i + 1)
HelpScreen ();
str = argv[++i];
if (0 == strcmp (str, "off"))
backlight_state = backlight = BACKLIGHT_OFF;
else if (0 == strcmp (str, "on"))
backlight_state = backlight = BACKLIGHT_ON;
else if (0 == strcmp (str, "open"))
backlight = BACKLIGHT_OPEN;
else
HelpScreen ();
/*
* -t
* --type
*
* Type of LCD; this *DEFINITELY* should only be
* a driver option.
*/
} else if (0 == strcmp (argv[i], "-t") || 0 == strcmp (argv[i], "--type")) {
if (i + 1 > argc)
HelpScreen ();
else {
int wid, hgt;
i++;
sscanf (argv[i], "%ix%i", &wid, &hgt);
if (wid > 80 || wid < 16 || hgt > 25 || hgt < 2) {
fprintf (stderr, "LCDd: Invalid lcd size \"%s\". Using 20x4.\n", argv[i]);
lcd.wid = 20;
lcd.hgt = 4;
} else {
lcd.wid = wid;
lcd.hgt = hgt;
}
}
/*
* -i
* --serverinfo
*
* Display server information during normal screen
* updates when windows are active; server information
* is always shown if there are no windows active.
*/
} else if (0 == strcmp (argv[i], "-i") || 0 == strcmp (argv[i], "--serverinfo")) {
if (i + 1 > argc)
HelpScreen ();
else {
i++;
if (0 == strcmp (argv[i], "off"))
disable_server_screen = 1;
if (0 == strcmp (argv[i], "on"))
disable_server_screen = 0;
}
/*
* -w <1/8 secs>
* --waittime <1/8 secs>
*
* Sets the default duration that a screen
* is present.
*/
} else if (0 == strcmp (argv[i], "-w") || 0 == strcmp (argv[i], "--waittime")) {
if (i + 1 > argc)
HelpScreen ();
else {
int tmp ;
i++;
tmp = atoi( argv[i] );
if ( tmp < 16 || tmp > 10000 ) {
printf ("Wait time should be between 16 and 10000 (1/8ths of second), not %s\n", argv[i]);
HelpScreen ();
} else {
default_duration = tmp ;
};
}
} else {
/*
* End of valid options
*/
printf ("Invalid parameter: %s\n", argv[i]);
HelpScreen ();
}
} else {
// otherwise... Get help!
printf ("Invalid parameter: %s\n", argv[i]);
printf("non-option: %s", argv[i]);
HelpScreen ();
}
}
// switch to a different user for the real work...
if (lcd_port >= 1024)
if (lcd_port >= 1024) // unpriviledged port
drop_privs(user);
if (sock_create_server (&bind_addr, lcd_port) <= 0) {
printf ("Error opening socket.\n");
syslog(LOG_ERR, "error opening socket");
return 1;
}
if (lcd_port > 1024)
if (lcd_port < 1024) // priviledged port
drop_privs(user);
// Now init a bunch of required stuff...
if (client_init () < 0) {
printf ("Error initializing client list\n");
syslog(LOG_ERR, "error initializing client list");
return 1;
}
if (screenlist_init () < 0) {
printf ("Error initializing screen list\n");
syslog(LOG_ERR, "error initializing screen list");
return 1;
}
// Make sure the server screen shows up every once in a while..
if (server_screen_init () < 0) {
printf ("Error initializing server screens\n");
syslog(LOG_ERR, "error initializing server screens");
return 1;
} else if (disable_server_screen) {
server_screen->priority = 256;
@@ -368,22 +437,16 @@ exit_program (int val)
// Other values should not be seen, but just in case..
}
// Make note in the logs...
syslog(LOG_NOTICE, buf);
// Say goodbye!
goodbye_screen ();
// Can go anywhere...
lcd_shutdown ();
syslog(LOG_NOTICE, buf); // send message to syslog
goodbye_screen (); // display goodbye screen on LCD display
lcd_shutdown (); // release driver memory and file descriptors
// Must come before screenlist_shutdown
client_shutdown ();
// Must come after client_shutdown
screenlist_shutdown ();
// Should come after client_shutdown
sock_close_all ();
client_shutdown (); // shutdown clients (must come first)
screenlist_shutdown (); // shutdown screens (must come after client_shutdown)
sock_close_all (); // close all open sockets (must come after client_shutdown)
exit (0);
}
void
+2 -2
View File
@@ -14,7 +14,7 @@
#include "main.h"
int default_priority = 128 ;
int default_duration = 64 ; // About 8 seconds
int default_duration = DEFAULT_SCREEN_DURATION ; // About 8 seconds
screen *
screen_create ()
@@ -30,7 +30,7 @@ screen_create ()
s->id = NULL;
s->name = NULL;
s->priority = DEFAULT_SCREEN_PRIORITY;
s->duration = DEFAULT_SCREEN_DURATION;
s->duration = default_duration;
s->heartbeat = DEFAULT_HEARTBEAT;
s->wid = lcd.wid;
s->hgt = lcd.hgt;