From 285d29edf3ab35d859f87863176277b48bf62f94 Mon Sep 17 00:00:00 2001 From: robijn Date: Thu, 29 Nov 2001 14:09:13 +0000 Subject: [PATCH] Reporting patch. --- LCDd.conf | 7 +- acconfig.h | 2 + configure.in | 2 + server/client_data.c | 14 +- server/client_functions.c | 133 ++++++++--------- server/clients.c | 57 ++++--- server/configfile.c | 26 ++-- server/drivers.c | 15 +- server/drivers/debug.c | 61 ++++---- server/drivers/lcd.c | 2 +- server/drivers/sed1330.c | 59 +++++--- server/input.c | 13 +- server/main.c | 302 +++++++++++++++++++++++--------------- server/menus.c | 6 +- server/parse.c | 24 +-- server/render.c | 32 ++-- server/screen.c | 24 +-- server/screenlist.c | 56 ++++--- server/serverscreens.c | 24 +-- server/sock.c | 74 +++++----- server/widget.c | 52 +++---- shared/Makefile.am | 2 +- shared/sockets.c | 24 +-- 23 files changed, 534 insertions(+), 477 deletions(-) diff --git a/LCDd.conf b/LCDd.conf index 1126e31..bea96e9 100644 --- a/LCDd.conf +++ b/LCDd.conf @@ -52,8 +52,11 @@ Bind=127.0.0.1 Port=13666 # Listen on this specified port; defaults to 13666. -#Debug=5 -# Sets the debugging level; defaults to 0 (no debugging output). +#ReportLevel=3 +# Sets the reporting level; defaults to 2 (warnings and errors only). + +#ReportToSyslog=yes +# Should we report to syslog instead of stderr ? Default: no WaitTime=5 # Sets the default time in seconds to displays a screen. diff --git a/acconfig.h b/acconfig.h index 8933966..4e93b79 100644 --- a/acconfig.h +++ b/acconfig.h @@ -66,6 +66,8 @@ /* Define the protocol version */ #undef PROTOCOL_VERSION +#undef API_VERSION + #undef SLI_DRV #undef SOLARIS diff --git a/configure.in b/configure.in index 1df25fa..ab5b3d2 100644 --- a/configure.in +++ b/configure.in @@ -109,6 +109,8 @@ AC_DEFINE_UNQUOTED(LCDPORT, $LCDPORT) AC_DEFINE_UNQUOTED(PROTOCOL_VERSION, "0.3") +AC_DEFINE_UNQUOTED(API_VERSION, "0.4") + AC_ARG_WITH(loadmax, [ --with-loadmax= Max Load Avg at which the backlight will] diff --git a/server/client_data.c b/server/client_data.c index 482df46..e7705e9 100644 --- a/server/client_data.c +++ b/server/client_data.c @@ -10,7 +10,7 @@ #include #include -#include "shared/debug.h" +#include "shared/report.h" #include "client_data.h" #include "screen.h" @@ -34,14 +34,14 @@ client_data_init (client_data * d) d->screenlist = NewScreen(); if (!d->screenlist) { - fprintf (stderr, "client_data_init: Error allocating screenlist\n"); + report( RPT_ERR, "client_data_init: Error allocating screenlist"); return -1; } /* TODO: this section... (client menus) d->menulist = LL_new(); if(!d->menulist) { - fprintf(stderr, "client_data_init: Error allocating menulist\n"); + report( RPT_ERR, "client_data_init: Error allocating menulist"); return -1; } */ @@ -53,7 +53,7 @@ client_data_destroy (client_data * d) { screen *s; - debug ("client_data_destroy\n"); + report( RPT_INFO, "client_data_destroy"); if (!d) return -1; @@ -69,18 +69,18 @@ client_data_destroy (client_data * d) free (d->client_keys); // Clean up the screenlist... - debug ("client_data_destroy: Cleaning screenlist\n"); + debug( RPT_DEBUG, "client_data_destroy: Cleaning screenlist"); ResetScreenList (d->screenlist); do { s = NextScreen(d->screenlist); if (s) { - debug ("client_data_destroy: removing screen %s\n", s->id); + debug( RPT_DEBUG, "client_data_destroy: removing screen %s", s->id); // FIXME? This shouldn't be handled here... // Now, remove it from the screenlist... if (screenlist_remove_all (s) < 0) { // Not a serious error.. - fprintf (stderr, "client_data_destroy: Error dequeueing screen\n"); + report( RPT_ERR, "client_data_destroy: Error dequeueing screen"); return 0; } // Free its memory... diff --git a/server/client_functions.c b/server/client_functions.c index 4dc632f..abf33b9 100644 --- a/server/client_functions.c +++ b/server/client_functions.c @@ -1,12 +1,12 @@ /* client_functions.c - + This contains definitions for all the functions which clients can run. The functions here are to be called only from parse.c's interpreter. - + The client's available function set is defined here, as is the syntax for each command. - + */ #include @@ -15,9 +15,8 @@ #include #include #include -#include -#include "shared/debug.h" +#include "shared/report.h" #include "shared/sockets.h" #include "drivers/lcd.h" @@ -83,7 +82,7 @@ test_func_func (client * c, int argc, char **argv) for (i = 0; i < argc; i++) { snprintf (str, sizeof(str), "test_func_func: %i -> %s\n", i, argv[i]); - printf (str); + report (RPT_INFO, str); sock_send_string (c->sock, str); } return 0; @@ -107,7 +106,7 @@ hello_func (client * c, int argc, char **argv) sock_send_string (c->sock, "huh? extra parameters ignored\n"); } - debug ("Hello!\n"); + debug(RPT_INFO, "Hello!"); memset(str, '\0', sizeof(str)); snprintf (str, sizeof(str), "connect LCDproc %s protocol %s lcd wid %i hgt %i cellwid %i cellhgt %i\n", @@ -178,9 +177,7 @@ client_set_func (client * c, int argc, char **argv) } else { strncpy(str, argv[i], sizeof(str) - 1); - debug ("client_set: name=\"%s\"\n", argv[i]); - - syslog(LOG_INFO, "client set name to %s", str); + debug(RPT_DEBUG, "client_set: name=\"%s\"", argv[i]); // set the name... if (c->data->name) @@ -229,7 +226,7 @@ client_add_key_func (client * c, int argc, char **argv) } keys = argv[1]; - debug ("client_add_key: current client will handle key(s) %s\n", keys); + debug(RPT_DEBUG, "client_add_key: current client will handle key(s) %s", keys); if (!c->data->client_keys) { // No keys list, create a new one @@ -287,7 +284,7 @@ client_del_key_func (client * c, int argc, char **argv) } keys = argv[1] ; - debug ("client_del_key: Deleting key(s) %s from client_keys\n", keys); + debug(RPT_DEBUG, "client_del_key: Deleting key(s) %s from client_keys", keys); if (c->data->client_keys) { // Client has keys, remove keys from the list @@ -350,7 +347,7 @@ screen_add_key_func (client * c, int argc, char **argv) id = argv[1]; keys = argv[2]; - debug ("screen_add_key: Adding key(s) %s to screen %s\n", keys, id); + debug(RPT_DEBUG, "screen_add_key: Adding key(s) %s to screen %s", keys, id); // Find the screen s = screen_find (c, id); @@ -422,7 +419,7 @@ screen_del_key_func (client * c, int argc, char **argv) id = argv[1] ; keys = argv[2] ; - debug ("screen_del_key: Deleting key(s) %s from screen %s\n", keys, id); + debug(RPT_DEBUG, "screen_del_key: Deleting key(s) %s from screen %s", keys, id); // Find the screen s = screen_find (c, id); @@ -487,7 +484,7 @@ screen_add_func (client * c, int argc, char **argv) return 0; } - debug ("screen_add: Adding screen %s\n", argv[1]); + debug(RPT_DEBUG, "screen_add: Adding screen %s", argv[1]); memset(scr, '\0', sizeof(scr)); strncpy(scr, argv[1], sizeof(scr) - 1); @@ -496,12 +493,12 @@ screen_add_func (client * c, int argc, char **argv) if (err == 0) sock_send_string(c->sock, "success\n"); else if (err < 0) { - fprintf (stderr, "screen_add_func: Error adding screen\n"); + report(RPT_WARNING, "screen_add_func: Error adding screen"); sock_send_string (c->sock, "huh? failed to add screen id#\n"); } else sock_send_string (c->sock, "huh? You already have a screen with that id#\n"); - syslog(LOG_NOTICE, "added a screen (%s) to the display", scr); + report(RPT_NOTICE, "added a screen (%s) to the display", scr); return 0; } @@ -527,7 +524,7 @@ screen_del_func (client * c, int argc, char **argv) return 0; } - debug ("screen_del: Deleting screen %s\n", argv[1]); + debug (RPT_DEBUG, "screen_del: Deleting screen %s", argv[1]); // Enforce bounds limits on argv[1] memset(scr, '\0', sizeof(scr)); @@ -537,12 +534,12 @@ screen_del_func (client * c, int argc, char **argv) if ( err == 0 ) sock_send_string(c->sock, "success\n"); else if (err < 0) { - fprintf (stderr, "screen_del_func: Error removing screen\n"); + report(RPT_WARNING, "screen_del_func: Error removing screen"); sock_send_string(c->sock, "huh? failed to remove screen\n"); } else sock_send_string (c->sock, "huh? You don't have a screen with that id#\n"); - syslog(LOG_NOTICE, "removed a screen (%s) from the display", scr); + report(RPT_NOTICE, "removed a screen (%s) from the display", scr); return 0; } @@ -589,12 +586,12 @@ screen_set_func (client * c, int argc, char **argv) p = argv[i]; if (*p == '-') p++; - + // Handle the "name" parameter if (strcmp (p, "name") == 0) { if (argc > i + 1) { i++; - debug ("screen_set: name=\"%s\"\n", argv[i]); + debug (RPT_DEBUG, "screen_set: name=\"%s\"", argv[i]); // set the name... if (s->name) @@ -609,7 +606,7 @@ screen_set_func (client * c, int argc, char **argv) else if (strcmp (p, "priority") == 0) { if (argc > i + 1) { i++; - debug ("screen_set: priority=\"%s\"\n", argv[i]); + debug (RPT_DEBUG, "screen_set: priority=\"%s\"", argv[i]); // set the priority... number = atoi (argv[i]); @@ -624,7 +621,7 @@ screen_set_func (client * c, int argc, char **argv) else if (strcmp (p, "duration") == 0) { if (argc > i + 1) { i++; - debug ("screen_set: duration=\"%s\"\n", argv[i]); + debug (RPT_DEBUG, "screen_set: duration=\"%s\"", argv[i]); // set the duration... number = atoi (argv[i]); @@ -639,7 +636,7 @@ screen_set_func (client * c, int argc, char **argv) else if (strcmp (p, "heartbeat") == 0) { if (argc > i + 1) { i++; - debug ("screen_set: heartbeat=\"%s\"\n", argv[i]); + debug (RPT_DEBUG, "screen_set: heartbeat=\"%s\"", argv[i]); // set the heartbeat type... if (0 == strcmp (argv[i], "on")) @@ -665,7 +662,7 @@ screen_set_func (client * c, int argc, char **argv) else if (strcmp (p, "wid") == 0) { if (argc > i + 1) { i++; - debug ("screen_set: wid=\"%s\"\n", argv[i]); + debug (RPT_DEBUG, "screen_set: wid=\"%s\"", argv[i]); // set the duration... number = atoi (argv[i]); @@ -675,13 +672,13 @@ screen_set_func (client * c, int argc, char **argv) } else { sock_send_string (c->sock, "huh? -wid requires a parameter\n"); } - + } // Handle the "hgt" parameter else if (strcmp (p, "hgt") == 0) { if (argc > i + 1) { i++; - debug ("screen_set: hgt=\"%s\"\n", argv[i]); + debug (RPT_DEBUG, "screen_set: hgt=\"%s\"", argv[i]); // set the duration... number = atoi (argv[i]); @@ -696,43 +693,42 @@ screen_set_func (client * c, int argc, char **argv) else if (strcmp (p, "timeout") == 0) { if (argc > i + 1) { i++; - syslog(LOG_NOTICE, "Setting timeout."); - debug ("screen_set: timeout=\"%s\"\n", argv[i]); + debug (RPT_DEBUG, "screen_set: timeout=\"%s\"", argv[i]); // set the duration... number = atoi (argv[i]); // Add the timeout value (count of TIME_UNITS) // to struct, TIME_UNIT is 1/8th of a second if (number > 0) { s->timeout = number; - syslog(LOG_NOTICE, "Timeout set."); + report(RPT_NOTICE, "Timeout set."); } sock_send_string(c->sock, "success\n"); } else { sock_send_string (c->sock, "huh? -timeout requires a parameter\n"); } } - + // Handle the backlight parameter else if (strcmp (argv[i], "backlight") == 0) { if (argc > i + 1) { i++; - debug ("screen_set: backlight=\"%s\"\n", argv[i]); + debug (RPT_DEBUG, "screen_set: backlight=\"%s\"", argv[i]); // set the backlight status based on what the client has set switch(c->backlight_state) { case BACKLIGHT_OPEN: if (strcmp ("on", argv[i]) == 0) s->backlight_state = BACKLIGHT_ON; - + if (strcmp ("off", argv[i]) == 0) s->backlight_state = BACKLIGHT_OFF; - + if (strcmp ("toggle", argv[i]) == 0) { if (s->backlight_state == BACKLIGHT_ON) s->backlight_state = BACKLIGHT_OFF; else if (s-backlight_state == BACKLIGHT_OFF) s->backlight_state = BACKLIGHT_ON; } - + if (strcmp ("blink", argv[i]) == 0) s->backlight_state |= BACKLIGHT_BLINK; @@ -824,7 +820,7 @@ widget_add_func (client * c, int argc, char **argv) if (err == 0) sock_send_string(c->sock, "success\n"); else { - fprintf (stderr, "widget_add_func: Error adding widget\n"); + report(RPT_WARNING, "widget_add_func: Error adding widget"); sock_send_string(c->sock, "huh? failed\n"); } @@ -866,7 +862,7 @@ widget_del_func (client * c, int argc, char **argv) sid = argv[1]; wid = argv[2]; - debug ("screen_del: Deleting widget %s.%s\n", sid, wid); + debug (RPT_DEBUG, "screen_del: Deleting widget %s.%s", sid, wid); s = screen_find (c, sid); if (!s) { @@ -877,7 +873,7 @@ widget_del_func (client * c, int argc, char **argv) if (err == 0) sock_send_string(c->sock, "success\n"); else { - fprintf (stderr, "widget_del_func: Error removing widget\n"); + report( RPT_WARNING, "widget_del_func: Error removing widget"); sock_send_string(c->sock, "huh? failed\n"); } @@ -942,10 +938,9 @@ widget_set_func (client * c, int argc, char **argv) // Client Debugging... { int i; - fprintf (stderr, "huh? Invalid widget id (%s)\n", wid); + report( RPT_WARNING, "huh? Invalid widget id (%s)", wid); for (i = 0; i < argc; i++) - fprintf (stderr, "%s ", argv[i]); - fprintf (stderr, "\n"); + report( RPT_WARNING, " %.40s ", argv[i]); } return 0; } @@ -969,10 +964,10 @@ widget_set_func (client * c, int argc, char **argv) free (w->text); w->text = strdup (argv[i + 2]); if (!w->text) { - fprintf (stderr, "widget_set_func: Error allocating string\n"); + report( RPT_WARNING, "widget_set_func: Error allocating string"); return -1; } - debug ("Widget %s set to %s\n", wid, w->text); + debug (RPT_DEBUG, "Widget %s set to %s", wid, w->text); sock_send_string(c->sock, "success\n"); } } @@ -992,7 +987,7 @@ widget_set_func (client * c, int argc, char **argv) w->y = y; w->length = length; } - debug ("Widget %s set to %i\n", wid, w->length); + debug (RPT_DEBUG, "Widget %s set to %i", wid, w->length); sock_send_string(c->sock, "success\n"); } break; @@ -1011,7 +1006,7 @@ widget_set_func (client * c, int argc, char **argv) w->y = y; w->length = length; } - debug ("Widget %s set to %i\n", wid, w->length); + debug (RPT_DEBUG, "Widget %s set to %i", wid, w->length); sock_send_string(c->sock, "success\n"); } break; @@ -1040,10 +1035,10 @@ widget_set_func (client * c, int argc, char **argv) free (w->text); w->text = strdup (argv[i]); if (!w->text) { - fprintf (stderr, "widget_set_func: Error allocating string\n"); + report( RPT_WARNING, "widget_set_func: Error allocating string"); return -1; } - debug ("Widget %s set to %s\n", wid, w->text); + debug (RPT_DEBUG, "Widget %s set to %s", wid, w->text); sock_send_string(c->sock, "success\n"); } break; @@ -1058,17 +1053,17 @@ widget_set_func (client * c, int argc, char **argv) sock_send_string (c->sock, "huh? Invalid coordinates\n"); } else { left = atoi (argv[i]); - //debug("left: %d\n",left); + //debug("left: %d",left); top = atoi (argv[i + 1]); - //debug("top: %d\n",top); + //debug("top: %d",top); right = atoi (argv[i + 2]); - //debug("right: %d\n",right); + //debug("right: %d",right); bottom = atoi (argv[i + 3]); - //debug("bottom: %d\n",bottom); + //debug("bottom: %d",bottom); direction = (int) (argv[i + 4][0]); - //debug("dir: %c\n",(char)direction); + //debug("dir: %c",(char)direction); speed = atoi (argv[i + 5]); - //debug("speed: %d\n",speed); + //debug("speed: %d",speed); // Direction must be v or h if (((char) direction != 'h') && ((char) direction != 'v')) { sock_send_string (c->sock, "huh? Invalid direction\n"); @@ -1084,10 +1079,10 @@ widget_set_func (client * c, int argc, char **argv) w->text = strdup (argv[i + 6]); if (!w->text) { sock_send_string(c->sock, "huh? out of memory\n"); - fprintf (stderr, "widget_set_func: Error allocating string\n"); + report( RPT_WARNING, "widget_set_func: Error allocating string"); return -1; } - debug ("Widget %s set to %s\n", wid, w->text); + debug (RPT_DEBUG, "Widget %s set to %s", wid, w->text); sock_send_string(c->sock, "success\n"); } } @@ -1106,21 +1101,21 @@ widget_set_func (client * c, int argc, char **argv) sock_send_string (c->sock, "huh? Invalid coordinates\n"); } else { left = atoi (argv[i]); - //debug("left: %d\n",left); + //debug("left: %d",left); top = atoi (argv[i + 1]); - //debug("top: %d\n",top); + //debug("top: %d",top); right = atoi (argv[i + 2]); - //debug("right: %d\n",right); + //debug("right: %d",right); bottom = atoi (argv[i + 3]); - //debug("bottom: %d\n",bottom); + //debug("bottom: %d",bottom); width = atoi (argv[i + 4]); - //debug("right: %d\n",right); + //debug("right: %d",right); height = atoi (argv[i + 5]); - //debug("bottom: %d\n",bottom); + //debug("bottom: %d",bottom); direction = (int) (argv[i + 6][0]); - //debug("dir: %c\n",(char)direction); + //debug("dir: %c",(char)direction); speed = atoi (argv[i + 7]); - //debug("speed: %d\n",speed); + //debug("speed: %d",speed); // Direction must be v or h if (((char) direction != 'h') && ((char) direction != 'v')) { sock_send_string (c->sock, "huh? Invalid direction\n"); @@ -1133,7 +1128,7 @@ widget_set_func (client * c, int argc, char **argv) w->hgt = height; w->length = direction; w->speed = speed; - debug ("Widget %s set to (%i,%i)-(%i,%i) %ix%i\n", wid, left, top, right, bottom, width, height); + debug (RPT_DEBUG, "Widget %s set to (%i,%i)-(%i,%i) %ix%i", wid, left, top, right, bottom, width, height); sock_send_string(c->sock, "success\n"); } } @@ -1153,7 +1148,7 @@ widget_set_func (client * c, int argc, char **argv) w->x = x; w->y = y; } - debug ("Widget %s set to %i\n", wid, w->y); + debug (RPT_DEBUG, "Widget %s set to %i", wid, w->y); sock_send_string(c->sock, "success\n"); } break; @@ -1294,9 +1289,9 @@ backlight_func (client * c, int argc, char **argv) return 0; } - debug ("backlight(%s)\n", argv[1]); + debug (RPT_DEBUG, "backlight(%s)", argv[1]); + - backlight = (backlight && 1); // only preserves ON/OFF bit if (strcmp ("on", argv[1]) == 0) { @@ -1403,7 +1398,7 @@ output_func (client * c, int argc, char **argv) // lcd_ptr->output (output_state); - syslog(LOG_NOTICE, "output states changed"); + report(RPT_NOTICE, "output states changed"); return 0; } diff --git a/server/clients.c b/server/clients.c index f33e171..b226825 100644 --- a/server/clients.c +++ b/server/clients.c @@ -15,12 +15,11 @@ #include #include #include -#include #include "sock.h" #include "clients.h" #include "client_data.h" -#include "shared/debug.h" +#include "shared/report.h" #include "render.h" LinkedList *clients; @@ -29,11 +28,11 @@ LinkedList *clients; int client_init () { - debug ("client_init()\n"); + debug(RPT_INFO, "client_init()"); clients = LL_new (); if (!clients) { - fprintf (stderr, "client_init: Unable to create client list\n"); + report( RPT_ERR, "client_init: Unable to create client list"); return -1; } @@ -45,29 +44,29 @@ client_shutdown () { client *c; - debug ("client_shutdown()\n"); + debug (RPT_INFO, "client_shutdown()"); // Free all client structures... // Note that the regular list loop doesn't work here, because // client_destroy() calls LL_Remove() for (c = LL_Pop (clients); c; c = LL_Pop (clients)) { - debug ("client_shutdown: ...\n"); + debug (RPT_DEBUG, "client_shutdown: ..."); if (c) { - debug ("client_shutdown: ... %i ...\n", c->sock); + debug (RPT_DEBUG, "client_shutdown: ... %i ...", c->sock); if (client_destroy (c) != 0) { - fprintf (stderr, "client_shutdown: Error freeing client\n"); + report (RPT_ERR, "client_shutdown: Error freeing client"); } else { - debug ("client_shutdown: Freed client...\n"); + debug (RPT_DEBUG, "client_shutdown: Freed client..."); } } else { - debug ("client_shutdown: No client!\n"); + debug (RPT_DEBUG, "client_shutdown: No client!"); } } // Then, free the list... LL_Destroy (clients); - debug ("client_shutdown: done\n"); + debug (RPT_DEBUG, "client_shutdown: done"); return 0; } @@ -81,12 +80,12 @@ client_create (int sock) { client *c; - debug ("client_create(%i)\n", sock); + debug (RPT_DEBUG, "client_create(%i)", sock); // Allocate new client... c = malloc (sizeof (client)); if (!c) { - fprintf (stderr, "client_create: error allocating new client\n"); + report (RPT_ERR, "client_create: error allocating new client"); return NULL; } // Init struct members @@ -100,14 +99,14 @@ client_create (int sock) // Set up message list... c->messages = LL_new (); if (!c->messages) { - fprintf (stderr, "client_create: error allocating message list\n"); + report (RPT_ERR, "client_create: error allocating message list"); free (c); return NULL; } // TODO: allocate and init client data... c->data = malloc (sizeof (client_data)); if (!c->data) { - fprintf (stderr, "client_create: error allocating client data\n"); + report (RPT_ERR, "client_create: error allocating client data"); free (c->messages); free (c); return NULL; @@ -127,16 +126,16 @@ client_destroy (client * c) char *str; - debug ("client_destroy()\n"); + debug (RPT_INFO, "client_destroy()"); if (!c) return -1; // Eat the rest of the incoming requests... - debug ("client_destroy: get_messages\n"); + debug (RPT_DEBUG, "client_destroy: get_messages"); while ((str = client_get_message (c))) { if (str) { - debug ("client_destroy: kill message %s\n", str); + debug (RPT_DEBUG, "client_destroy: kill message %s", str); free (str); } } @@ -145,7 +144,7 @@ client_destroy (client * c) if (c->sock) { // sock_send_string (c->sock, "bye\n"); close(c->sock); - syslog(LOG_NOTICE, "closed socket for #%d\n", c->sock); + report(RPT_NOTICE, "closed socket for #%d", c->sock); } err = LL_Destroy (c->messages); @@ -171,7 +170,7 @@ client_add_message (client * c, char *message) char delimiters[] = "\n\r\0"; // int len; - //debug("client_add_message(%s)\n", message); + debug(RPT_DEBUG, "client_add_message(%s)", message); if (!c) return -1; @@ -184,17 +183,17 @@ client_add_message (client * c, char *message) // Copy the string to avoid overwriting the original... dup = strdup (message); if (!dup) { - fprintf (stderr, "client_add_message: Error allocating new string\n"); + report(RPT_ERR, "client_add_message: Error allocating new string"); return -1; } // Now split the string into lines and enqueue each one... for (str = strtok (dup, delimiters); str; str = strtok (NULL, delimiters)) { cp = strdup (str); - debug ("client_add_message: %s\n", cp); + debug (RPT_DEBUG, "client_add_message: %s", cp); err += LL_Enqueue (c->messages, (void *) cp); } - //debug("client_add_message(%s): %i errors\n", message, err); + //debug(RPT_DEBUG, "client_add_message(%s): %i errors", message, err); free (dup); // Fixed memory leak... // Err is the number of errors encountered... @@ -208,14 +207,14 @@ client_get_message (client * c) { char *str; - //debug("client_get_message()\n"); + debug(RPT_DEBUG, "client_get_message()"); if (!c) return NULL; str = (char *) LL_Dequeue (c->messages); - //debug("client_get_message: \"%s\"\n", str); + //debug(RPT_DEBUG, "client_get_message: \"%s\"", str); return str; } @@ -241,19 +240,19 @@ client_find_sock (int sock) { client *c; -// debug("client_find_sock(%i)\n", sock); +// debug(RPT_INFO, "client_find_sock(%i)", sock); LL_Rewind (clients); do { c = (client *) LL_Get (clients); -// debug("client_find_sock: ... %i ...\n", c->sock); +// debug(RPT_DEBUG, "client_find_sock: ... %i ...", c->sock); if (c->sock == sock) { -// debug("client_find_sock: ..! %i !..\n", c->sock); +// debug(RPT_DEBUG, "client_find_sock: ..! %i !..", c->sock); return c; } } while (LL_Next (clients) == 0); - debug ("client_find_sock: failed\n"); + debug (RPT_ERR, "client_find_sock: failed"); return NULL; } diff --git a/server/configfile.c b/server/configfile.c index 5781a04..dc8ca76 100644 --- a/server/configfile.c +++ b/server/configfile.c @@ -13,6 +13,8 @@ #include #include +#include "shared/report.h" + typedef struct key { char * name; @@ -219,7 +221,7 @@ int config_has_key( char *sectionname, char *keyname ) void config_clear() { - printf( "config_clear is unimplemented" ); + report( RPT_WARNING, "config_clear is unimplemented" ); } @@ -386,7 +388,7 @@ int process_config( section ** current_section, char (*get_next_char)(), char mo case ST_SECTIONNAME: switch( ch ) { case '\n': - fprintf( stderr, "Section name incorrectly closed on line %d of %s: %s\n", line_nr, source_descr, sectionname ); + report( RPT_WARNING, "Section name incorrectly closed on line %d of %s: %s", line_nr, source_descr, sectionname ); state = ST_INITIAL; break; case '\r': @@ -394,7 +396,7 @@ int process_config( section ** current_section, char (*get_next_char)(), char mo case ' ': case '"': case '[': - fprintf( stderr, "Section name contains invalid chars on line %d of %s: %s\n", line_nr, source_descr, sectionname ); + report( RPT_WARNING, "Section name contains invalid chars on line %d of %s: %s", line_nr, source_descr, sectionname ); state = ST_INVALID_SECTIONNAME; break; case ']': @@ -404,14 +406,14 @@ int process_config( section ** current_section, char (*get_next_char)(), char mo state = ST_INITIAL; break; case 0: - fprintf( stderr, "Section name incorrectly closed on line %d of %s: %s\n", line_nr, source_descr, sectionname ); + report( RPT_WARNING, "Section name incorrectly closed on line %d of %s: %s", line_nr, source_descr, sectionname ); break; default: if( sectionname_pos #include #include -#include #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "shared/LL.h" -#include "shared/debug.h" +#include "shared/report.h" #include "configfile.h" #include "drivers/lcd.h" @@ -40,14 +39,14 @@ load_driver ( char * name, char * filename, char * args ) void (*driver_init)(); lcd_logical_driver * driver; - debug ("load_driver(%s,%s,%s)\n", name,filename,args); + report( RPT_INFO, "load_driver(%s,%s,%s)", name, filename, args ); // First driver ? if( !loaded_drivers ) { // Create linked list loaded_drivers = LL_new (); if( !loaded_drivers ) { - fprintf( stderr, "Error allocating driver list.\n" ); + report( RPT_ERR, "Error allocating driver list." ); return -1; } } @@ -56,7 +55,7 @@ load_driver ( char * name, char * filename, char * args ) // Find the driver in the array of driver types if ((driver_init = (void *) lcd_find_init(name)) == NULL) { // Driver not found - fprintf( stderr, "invalid driver: %s\n", name); + report( RPT_ERR, "invalid driver: %s", name); return -1; } @@ -75,7 +74,7 @@ load_driver ( char * name, char * filename, char * args ) res = driver->init( driver, args ); if( res < 0 ) { - fprintf( stderr, "res<0\n" ); + report( RPT_ERR, "Driver load failed, return code < 0" ); // driver load failed, don't add driver to list return -1; } @@ -97,10 +96,10 @@ unload_all_drivers () { lcd_logical_driver * driver; - debug ("unload_all_driver()\n"); + report( RPT_INFO, "unload_all_driver()"); while( (driver = LL_Pop( loaded_drivers )) != NULL ) { - debug ("driver->close %p\n", driver ); + debug( RPT_DEBUG, "driver->close %p", driver ); driver->close(); } diff --git a/server/drivers/debug.c b/server/drivers/debug.c index 301a09b..5306508 100644 --- a/server/drivers/debug.c +++ b/server/drivers/debug.c @@ -5,10 +5,10 @@ #include #include #include -#include #include "lcd.h" #include "debug.h" +#include "shared/report.h" ////////////////////////////////////////////////////////////////////////// ////////////////////// For Debugging Output ////////////////////////////// @@ -22,7 +22,7 @@ static lcd_logical_driver *debug_drv; int debug_init (struct lcd_logical_driver *driver, char *args) { - syslog(LOG_DEBUG, "debug_init"); + report (RPT_INFO, "debug_init()"); debug_drv = driver; @@ -58,10 +58,10 @@ debug_init (struct lcd_logical_driver *driver, char *args) void debug_close () { - syslog(LOG_DEBUG, "debug_close()"); + report (RPT_INFO, "debug_close()"); if (debug_drv->framebuf) { - printf ("frame buffer: %010X", (int) debug_drv->framebuf); + report (RPT_DEBUG, "frame buffer: %010X", (int) debug_drv->framebuf); free (debug_drv->framebuf); } @@ -74,7 +74,7 @@ debug_close () void debug_clear () { - syslog(LOG_DEBUG, "clear()"); + report (RPT_INFO, "clear()"); memset (debug_drv->framebuf, ' ', debug_drv->wid * debug_drv->hgt); @@ -86,7 +86,7 @@ debug_clear () void debug_flush () { - syslog(LOG_DEBUG, "flush()"); + report (RPT_INFO, "flush()"); debug_drv->draw_frame (); } @@ -100,10 +100,8 @@ debug_string (int x, int y, char string[]) { int i; - char buf[64]; - snprintf(buf, sizeof(buf), "string(%i,%i): %s", x, y, string); - syslog (LOG_DEBUG, buf); + report(RPT_INFO, "string(%i,%i,%.40s)", x, y, string); y --; x --; // Convert 1-based coords to 0-based... @@ -119,10 +117,7 @@ debug_string (int x, int y, char string[]) void debug_chr (int x, int y, char c) { - char buf[64]; - - snprintf(buf, sizeof(buf), "character(%i,%i): %c", x, y, c); - syslog (LOG_DEBUG, buf); + report (RPT_DEBUG, "char(%i,%i,%c)", x, y, c); x--; y--; debug_drv->framebuf[(y * debug_drv->wid) + x] = c; @@ -131,50 +126,44 @@ debug_chr (int x, int y, char c) int debug_contrast (int contrast) { - syslog(LOG_DEBUG, "contrast: %i", contrast); + report (RPT_INFO, "contrast(%i)", contrast); return 0; } void debug_backlight (int on) { - if (on) - syslog(LOG_DEBUG, "backlight turned on"); - else - syslog(LOG_DEBUG, "backlight turned off"); + report (RPT_INFO, "backlight(%i)", on); } void debug_init_vbar () { - syslog(LOG_DEBUG, "Init vertical bars"); + report (LOG_INFO, "init_vbar()"); } void debug_init_hbar () { - syslog(LOG_DEBUG, "Init horizontal bars"); + report (RPT_INFO, "init_hbar()"); } void debug_init_num () { - syslog(LOG_DEBUG, "Big numbers"); + report (RPT_INFO, "init_bignum()"); } void debug_num (int x, int num) { - char buf[64]; - - snprintf(buf, sizeof(buf), "big number(%i): %i", x, num); - syslog (LOG_DEBUG, buf); + report (RPT_INFO, "big number(%i,%i)", x, num); } void debug_set_char (int n, char *dat) { - syslog(LOG_DEBUG, "set character %i", n); + report (RPT_INFO, "set_char(%i,data)", n); } ///////////////////////////////////////////////////////////////// @@ -185,7 +174,7 @@ debug_vbar (int x, int len) { int y; - syslog (LOG_DEBUG, "vbar(%i): len = %i", x, len); + report (RPT_INFO, "vbar(%i,%i)", x, len); for (y = debug_drv->hgt; y > 0 && len > 0; y--) { debug_chr (x, y, '|'); @@ -201,7 +190,7 @@ debug_vbar (int x, int len) void debug_hbar (int x, int y, int len) { - syslog(LOG_DEBUG, "hbar(%i,%i): len = %i", x, y, len); + report (RPT_INFO, "hbar(%i,%i,%i)", x, y, len); for (; x < debug_drv->wid && len > 0; x++) { debug_chr (x, y, '-'); @@ -217,13 +206,13 @@ debug_hbar (int x, int y, int len) void debug_icon (int which, char dest) { - syslog (LOG_DEBUG, "char %i = icon %i", dest, which); + report (RPT_INFO, "icon(%i,%i", which, dest); } void debug_flush_box (int lft, int top, int rgt, int bot) { - syslog (LOG_DEBUG, "flush_box(%i,%i) - (%i,%i)", lft, top, rgt, bot); + report (RPT_INFO, "flush_box(%i,%i,%i,%i)", lft, top, rgt, bot); debug_flush (); } @@ -235,25 +224,25 @@ debug_draw_frame (char *dat) char out[LCD_MAX_WIDTH]; - syslog (LOG_DEBUG, "draw_frame()"); + report (RPT_INFO, "draw_frame(data)"); if (!dat) return; -// printf("Frame (%ix%i): \n%s\n", debug_drv->wid, debug_drv->hgt, dat); +// report (RPT_DEBUG, "Frame (%ix%i): %s", debug_drv->wid, debug_drv->hgt, dat); for (i = 0; i < debug_drv->wid; i++) { out[i] = '-'; } out[debug_drv->wid] = 0; - //printf ("+%s+\n", out); + //report (RPT_DEBUG, "+%s+", out); for (i = 0; i < debug_drv->hgt; i++) { for (j = 0; j < debug_drv->wid; j++) { out[j] = dat[j + (i * debug_drv->wid)]; } out[debug_drv->wid] = 0; - //printf ("|%s|\n", out); + //report (RPT_DEBUG, "|%s|", out); } @@ -261,13 +250,13 @@ debug_draw_frame (char *dat) out[i] = '-'; } out[debug_drv->wid] = 0; - //printf ("+%s+\n", out); + //report (RPT_DEBUG, "+%s+", out); } char debug_getkey () { - syslog(LOG_DEBUG, "getkey"); + report (RPT_INFO, "getkey()"); return 0; } diff --git a/server/drivers/lcd.c b/server/drivers/lcd.c index b95103f..dace4dc 100644 --- a/server/drivers/lcd.c +++ b/server/drivers/lcd.c @@ -32,7 +32,7 @@ #endif #include "shared/LL.h" -#include "shared/debug.h" +#include "shared/report.h" #include "lcd.h" diff --git a/server/drivers/sed1330.c b/server/drivers/sed1330.c index 47ff514..1233c2a 100644 --- a/server/drivers/sed1330.c +++ b/server/drivers/sed1330.c @@ -165,7 +165,9 @@ #include "lpt-port.h" #include "lcd.h" #include "shared/str.h" -#include +#include "shared/report.h" +#include "configfile.h" + #include #include #include @@ -274,6 +276,9 @@ sed1330_init( lcd_logical_driver * driver, char *args ) sed1330 = driver; + + debug( RPT_INFO, "SED1330: init(%p,%s)", driver, args ); + // TODO: replace DriverName with driver->name when that field exists. #define DriverName "sed1330" @@ -291,13 +296,13 @@ sed1330_init( lcd_logical_driver * driver, char *args ) // READ THE CONFIG FILE // Port - port = driver->config_get_int( DriverName, "port", 0, 0x278 ); + port = config_get_int( DriverName, "port", 0, 0x278 ); data->port = port; // Type s = driver->config_get_string( DriverName, "type", 0, NULL ); if( !s ) { - printf( "SED1330: you need to specify the display type\n" ); + report( RPT_ERR, "SED1330: you need to specify the display type" ); } else if( strcmp( s, "G321D" ) == 0 ) { data->type = TYPE_G321D; data->graph_width = 320; @@ -311,14 +316,17 @@ sed1330_init( lcd_logical_driver * driver, char *args ) data->graph_width = 240; data->graph_height = 128; } else { - printf( "SED1330: Unknown display type: %s\n", s ); + report( RPT_ERR, "SED1330: Unknown display type: %s", s ); return -1; } - driver->wid = data->graph_width / CHARWIDTH; driver->hgt = data->graph_height / CHARHEIGHT; data->bytesperline = (data->graph_width - 1 ) / CHARWIDTH + 1; + report( RPT_INFO, "SED1330: Using LCD type: %s", s ); + report( RPT_INFO, "SED1330: Text size: %dx%d", driver->wid, driver->hgt ); + + // Keymap for( i=0; ikeymap[i] = (char *) malloc( strlen(s)+1 ); strcpy( data->keymap[i], s ); + report( RPT_INFO, "SED1330: Key %d: \"%s\"", i, s ); + } else { data->keymap[i] = ""; // Pointing to an constant empty string } @@ -360,6 +370,7 @@ sed1330_init( lcd_logical_driver * driver, char *args ) // Arrange for access to port + debug( RPT_DEBUG, "SED1330: getting port access" ); port_access(data->port); port_access(data->port+1); port_access(data->port+2); @@ -372,7 +383,7 @@ sed1330_init( lcd_logical_driver * driver, char *args ) struct sched_param param; param.sched_priority=1; if (( sched_setscheduler(0, SCHED_RR, ¶m)) == -1) { - fprintf (stderr, "HD44780_init: failed (%s)\n", strerror (errno)); + report( RPT_ERR, "HD44780_init: failed (%s)", strerror (errno)); return -1; } } @@ -404,6 +415,7 @@ sed1330_init( lcd_logical_driver * driver, char *args ) // INITIALIZE THE LCD // End reset-state + debug( RPT_DEBUG, "SED1330: initializing LCD" ); port_out( port+2, (nWR) ^ OUTMASK ); // raise ^RD and ^WR port_out( port+2, (nRESET|nWR) ^ OUTMASK ); // lower RESET uPause( 200 ); @@ -495,7 +507,7 @@ sed1330_command( char command, int datacount, char * data ) int i; int port = private_data->port; - printf( "sed1330_command %x #data=%d\n", command, datacount ); + debug( RPT_INFO, "sed1330_command %x #data=%d", command, datacount ); port_out( port+2, (nRESET|nWR|A0) ^ OUTMASK ); // set A0 to indicate command port_out( port, command ); // set up data @@ -531,7 +543,7 @@ void sed1330_update_cursor() char disp_en; char fc; // named after CF register in SED1330 - printf( "sed1330_update_cursor\n" ); + debug( RPT_INFO, "sed1330_update_cursor" ); cursor_pos = (data->cursor_y-1) * data->bytesperline + (data->cursor_x-1) + 256 * SCR1_H + SCR1_L; csrloc[0] = cursor_pos % 256; @@ -568,7 +580,7 @@ void sed1330_update_cursor() void sed1330_close() { - printf( "sed1330_close\n" ); + debug( RPT_INFO, "sed1330_close" ); //sed1330_command( CMD_DISP_DIS, 0, NULL ); // display off //port_out( port+2, (nWR) ^ OUTMASK ); // give LCD reset signal @@ -586,7 +598,7 @@ sed1330_clear() { private_data * data = sed1330->private_data; - printf( "sed1330_clear\n" ); + debug( RPT_INFO, "sed1330_clear" ); memset( data->framebuf_text, ' ', data->bytesperline * sed1330->hgt); memset( data->framebuf_graph, 0, data->bytesperline * data->graph_height ); @@ -603,7 +615,8 @@ sed1330_string( int x, int y, char *str ) char * start; int len; - printf( "sed1330_string x=%d y=%d s=\"%s\"\n", x, y, str ); + debug( RPT_INFO, "sed1330_string x=%d y=%d s=\"%s\"", x, y, str ); + if( y > sed1330->hgt ) { return; // outside framebuf_textfer } @@ -626,7 +639,7 @@ sed1330_chr( int x, int y, char c ) { private_data * data = sed1330->private_data; - printf( "sed1330_chr x=%d y=%d c='%c'\n", x, y, c ); + debug( RPT_INFO, "sed1330_chr x=%d y=%d c='%c'", x, y, c ); if( y > sed1330->hgt || x > sed1330->wid ) { return; // outside framebuf_textfer @@ -645,7 +658,7 @@ sed1330_flush() unsigned int pos, start_pos, nr_equal, fblen, len, cursor_pos; char csrloc[2]; - printf( "sed1330_flush\n" ); + debug( RPT_INFO, "sed1330_flush" ); sed1330_command( CMD_DISP_EN, 1, ((char[1]) {0x16}) ); // cursor off @@ -703,7 +716,7 @@ void sed1330_cursor( int x, int y, char state ) { private_data * data = sed1330->private_data; - printf( "sed1330_cursor x=%d y=%d state='%c'\n", x, y, state ); + debug( RPT_INFO, "sed1330_cursor x=%d y=%d state='%c'", x, y, state ); data->cursor_x = x; data->cursor_y = y; @@ -721,7 +734,7 @@ sed1330_backlight( int on ) { //private_data * data = sed1330->private_data; - printf( "sed1330_backlight on='%c'\n", on ); + debug( RPT_INFO, "sed1330_backlight on='%c'", on ); // unimplemented } @@ -737,7 +750,7 @@ sed1330_rect ( int x1, int y1, int x2, int y2, char pattern ) //private_data * data = sed1330->private_data; int x, y; - printf( "sed1330_rect x1=%d y1=%d x2=%d y2=%d pattern=%d\n", x1, y1, x2, y2, (int) pattern ); + debug( RPT_INFO, "sed1330_rect x1=%d y1=%d x2=%d y2=%d pattern=%d", x1, y1, x2, y2, (int) pattern ); // Swap coordinates if needed if( x1>x2 ) { @@ -771,7 +784,7 @@ sed1330_line ( int x1, int y1, int x2, int y2, char pattern ) //private_data * data = sed1330->private_data; int x, y; - printf( "sed1330_rect x1=%d y1=%d x2=%d y2=%d pattern=%d\n", x1, y1, x2, y2, (int) pattern ); + debug( RPT_INFO, "sed1330_rect x1=%d y1=%d x2=%d y2=%d pattern=%d", x1, y1, x2, y2, (int) pattern ); // Swap coordinates if needed if( x1>x2 ) { @@ -830,7 +843,7 @@ sed1330_set_pixel( int x, int y ) unsigned int bytepos; char bitmask; - //printf( "sed1330_set_pixel x=%d y=%d\n", x, y ); + //debug( RPT_INFO, "sed1330_set_pixel x=%d y=%d", x, y ); bytepos = y*data->bytesperline + x/PIXELSPERBYTE; bitmask = 0x80 >> (x % PIXELSPERBYTE); @@ -850,7 +863,7 @@ sed1330_clear_pixel( int x, int y ) int bytepos; char bitmask; - //printf( "sed1330_clear_pixel x=%d y=%d\n", x, y ); + //debug( RPT_INFO, "sed1330_clear_pixel x=%d y=%d", x, y ); bytepos = y*data->bytesperline + x/PIXELSPERBYTE; bitmask = 0x80 >> (x % PIXELSPERBYTE); @@ -866,7 +879,7 @@ sed1330_vbar( int x, int len ) { private_data * data = sed1330->private_data; - printf( "sed1330_hbar x=%d len=%d\n", x, len ); + debug( RPT_INFO, "sed1330_hbar x=%d len=%d", x, len ); sed1330_rect ( (x-1) * CHARWIDTH, data->graph_height-1, x * CHARWIDTH - 1, data->graph_height-1 - ((long) len * CHARHEIGHT / sed1330->cellhgt ), 1 ); } @@ -881,7 +894,7 @@ sed1330_hbar( int x, int y, int len ) { //private_data * data = sed1330->private_data; - printf( "sed1330_hbar x=%d y=%d len=%d\n", x, y, len ); + debug( RPT_INFO, "sed1330_hbar x=%d y=%d len=%d", x, y, len ); sed1330_rect ( (x-1) * CHARWIDTH, (y-1) * CHARHEIGHT, x * CHARWIDTH + len, y * CHARHEIGHT - 1, 1 ); } @@ -895,7 +908,7 @@ sed1330_num( int x, int num ) { //private_data * data = sed1330->private_data; - printf( "sed1330_bignum x=%d num=%d\n", x, num ); + debug( RPT_INFO, "sed1330_bignum x=%d num=%d", x, num ); } @@ -918,7 +931,7 @@ sed1330_heartbeat( int type ) { 0xFF, 0xAF, 0x07, 0x07, 0x07, 0x8F, 0xDF, 0xFF, 0x00, 0x00 } }; - printf( "sed1330_heartbeat type=%d\n", type ); + report( RPT_INFO, "sed1330_heartbeat type=%d", type ); data->framebuf_text[sed1330->wid-1] = ' '; whichIcon = (! ((timer + 4) & 5)); diff --git a/server/input.c b/server/input.c index 3574c9e..3f80a3b 100644 --- a/server/input.c +++ b/server/input.c @@ -66,10 +66,9 @@ #include #include #include -#include #include "shared/sockets.h" -#include "shared/debug.h" +#include "shared/report.h" #include "drivers/lcd.h" @@ -105,7 +104,7 @@ handle_input () if ((key = lcd_ptr->getkey ()) == 0) return 0; - //debug ("handle_input(%c)\n", (char) key); + //debug (RPT_DEBUG, "handle_input(%c)", (char) key); // Sequence: // Does the current screen want the key? @@ -162,8 +161,8 @@ handle_input () int server_input (int key) { - debug ("server_input(%c)\n", (char) key); - syslog(LOG_DEBUG, "key %d pressed on device", key); + debug (RPT_INFO, "server_input(%c)", (char) key); + report(RPT_INFO, "key %d pressed on device", key); switch ((char) key) { case PAUSE_KEY: @@ -181,11 +180,11 @@ server_input (int key) screenlist_next (); break; case MAIN_MENU_KEY: - debug ("got the menu key!\n"); + debug (RPT_DEBUG, "got the menu key!"); server_menu (); break; default: - debug ("server_input: Unused key \"%c\" (%i)\n", (char) key, key); + debug (RPT_DEBUG, "server_input: Unused key \"%c\" (%i)", (char) key, key); break; } diff --git a/server/main.c b/server/main.c index 49cfe79..2b2459a 100644 --- a/server/main.c +++ b/server/main.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -29,7 +28,7 @@ extern char *optarg; extern int optind, optopt, opterr; -#include "shared/debug.h" +#include "shared/report.h" #include "drivers.h" #include "sock.h" @@ -46,7 +45,7 @@ extern int optind, optopt, opterr; #define MAX_TIMER 0x10000 -#define DEFAULT_DEBUG_LEVEL 1 +//#define DEFAULT_DEBUG_LEVEL 1 #define DEFAULT_LCD_PORT LCDPORT #define DEFAULT_BIND_ADDR "127.0.0.1" #define DEFAULT_CONFIGFILE "/etc/LCDd.conf" @@ -56,11 +55,14 @@ extern int optind, optopt, opterr; #define MAX_DRIVERS 8 #define DEFAULT_DAEMON_MODE 1 #define DEFAULT_ENABLE_SERVER_SCREEN 0 +#define DEFAULT_REPORTTOSYSLOG 0 +#define DEFAULT_REPORTLEVEL RPT_WARNING /* Store some standard defines into vars... */ char *version = VERSION; char *protocol_version = PROTOCOL_VERSION; +char *api_version = API_VERSION; char *build_date = __DATE__; @@ -75,15 +77,22 @@ char *build_date = __DATE__; /**** Configuration variables ****/ -// All are set to 'unset' values -int debug_level = -1; -int lcd_port = -1; -char bind_addr[64] = ""; -char configfile[256] = ""; -char user[64] = ""; +// All variables are set to 'unset' values +#define UNSET_INT -1 +#define UNSET_STR "\01" -int daemon_mode = -1; -int enable_server_screen = -1; +//int debug_level = UNSET_INT; +int lcd_port = UNSET_INT; +char bind_addr[64] = UNSET_STR; +char configfile[256] = UNSET_STR; +char user[64] = UNSET_STR; + +int daemon_mode = UNSET_INT; +int enable_server_screen = UNSET_INT; + +static int reportLevel = UNSET_INT; +static int reportToSyslog = UNSET_INT; +static int serverStarted = 0; // The drivers and their driver parameters char *drivernames[MAX_DRIVERS]; @@ -130,7 +139,7 @@ int init_screens(); void do_mainloop(); void lcd_list_drivers(); -#define ESSENTIAL(f) {int r; if( ( r=f )!=0 ) return r;} +#define ESSENTIAL(f) {int r; if( ( r=(f) )<0 ) { report( RPT_CRIT,"Critical error, abort"); return r;}} int main (int argc, char **argv) @@ -168,12 +177,10 @@ main (int argc, char **argv) * in the variable declaration... */ - // Open syslog facility - openlog("LCDd", LOG_PID, LOG_DAEMON); - syslog(LOG_NOTICE, "server version %s starting up (protocol version %s)", - version, protocol_version); - syslog(LOG_NOTICE, "server built on %s", - build_date); + // Set the initial reporting parameters + report(RPT_NOTICE, "LCDd version %s starting", version ); + report(RPT_INFO, "Built on %s, protocol version %s, API version %s", + build_date, protocol_version, api_version ); clear_settings(); @@ -186,21 +193,26 @@ main (int argc, char **argv) // Set default values set_default_settings(); - if (debug_level > 0) - syslog(LOG_NOTICE, "debug level set to %d", debug_level); + // Set reporting values + ESSENTIAL( set_reporting( reportLevel, (reportToSyslog?RPT_DEST_SYSLOG:RPT_DEST_STDERR) ) ); + report( RPT_NOTICE, "Set report level to %d, output to %s", reportLevel, (reportToSyslog?"syslog":"stderr") ); + // Startup the server ESSENTIAL( init_sockets() ); ESSENTIAL( init_drivers() ); ESSENTIAL( init_screens() ); ESSENTIAL( drop_privs(user) ); + // Store it for exit_program() + serverStarted = 1; + #ifndef DEBUG // Now, go into daemon mode... if (daemon_mode) { - syslog(LOG_NOTICE, "server forking to background"); + report(RPT_NOTICE, "Server forking to background"); ESSENTIAL( daemonize() ); } else { - syslog(LOG_NOTICE, "server running in foreground"); + report(RPT_NOTICE, "Server running in foreground"); } #endif @@ -216,16 +228,19 @@ clear_settings () { int i; - debug_level = -1; - lcd_port = -1; - bind_addr[0] = 0; - configfile[0] = 0; - user[0] = 0; - daemon_mode = -1; - enable_server_screen = -1; - backlight = -1; + //report( RPT_INFO, "clear_settings()" ); - default_duration = -1; + lcd_port = UNSET_INT; + strcpy( bind_addr, UNSET_STR ); + strcpy( configfile, UNSET_STR ); + strcpy( user, UNSET_STR ); + daemon_mode = UNSET_INT; + enable_server_screen = UNSET_INT; + backlight = UNSET_INT; + + default_duration = UNSET_INT; + reportToSyslog = UNSET_INT; + reportLevel = UNSET_INT; for( i=0; i < num_drivers; i++ ) { free( drivernames[i] ); @@ -244,10 +259,11 @@ int process_command_line (int argc, char **argv) { char c; - char buf[64]; + + //report( RPT_INFO, "process_command_line()" ); // analyze options here.. - while ((c = getopt(argc, argv, "a:p:d:hfib:w:c:u:")) > 0) { + while ((c = getopt(argc, argv, "a:p:d:hfib:w:c:u:sr:")) > 0) { // FIXME: Setting of c in this loop clobbers s! // s is set equivalent to c. switch(c) { @@ -260,10 +276,10 @@ process_command_line (int argc, char **argv) strcpy( drivernames[num_drivers], optarg ); strcpy( driverfilenames[num_drivers], optarg ); - strcpy( driverargs[num_drivers], ""); + strcpy( driverargs[num_drivers], "" ); num_drivers ++; } else - fprintf(stderr, "too many drivers!"); + report( RPT_ERR, "Too many drivers!" ); break; case 'p': lcd_port = atoi(optarg); @@ -299,32 +315,36 @@ process_command_line (int argc, char **argv) backlight = BACKLIGHT_OPEN; } else if( strcmp( optarg, "" ) != 0 ) { - fprintf( stderr, "backlight state should be on, off or open\n" ); + report( RPT_ERR, "Backlight state should be on, off or open" ); HelpScreen(); } break; case 'w': - default_duration = atoi(optarg); - if ( default_duration < 16 || default_duration > 10000 ) { - snprintf(buf, sizeof(buf), - "wait time should be between 16 and 10000 (in 1/8ths of second), not %s\n", optarg); - fprintf(stderr, "%s", buf); + 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 (); }; break; + case 's': + reportToSyslog = 1; + break; + case 'r': + reportLevel = atoi(optarg); + break; case '?': - fprintf(stderr, "unknown option: '%c'\n", optopt); + report( RPT_ERR, "Unknown option: '%c'", optopt ); HelpScreen(); break; case ':': - fprintf(stderr, "missing option argument!"); + report( RPT_ERR, "Missing option argument!" ); HelpScreen(); break; } } if (optind < argc) - fprintf(stderr, "non-option arguments!! BAD..."); + report( RPT_ERR, "Non-option arguments on the command line !"); return 0; } @@ -338,44 +358,46 @@ process_configfile ( char *configfile ) char * s; //char buf[64]; + //report( RPT_INFO, "process_configfile()" ); + // Read server settings config_read_file( configfile ); - if( debug_level == -1 ) - debug_level = config_get_int( "server", "debug", 0, -1 ); +// if( debug_level == UNSET_INT ) +// debug_level = config_get_int( "server", "debug", 0, UNSET_INT ); - if( lcd_port == -1 ) - lcd_port = config_get_int( "server", "port", 0, -1 ); + if( lcd_port == UNSET_INT ) + lcd_port = config_get_int( "server", "port", 0, UNSET_INT ); - if( bind_addr[0] == 0 ) - strncpy( bind_addr, config_get_string( "server", "bind", 0, "" ), sizeof(bind_addr)); + if( strcmp( bind_addr, UNSET_STR ) == 0 ) + strncpy( bind_addr, config_get_string( "server", "bind", 0, UNSET_STR ), sizeof(bind_addr)); - if( user[0] == 0 ) - strncpy( user, config_get_string( "server", "user", 0, "" ), sizeof(user)); + if( strcmp( user, UNSET_STR ) == 0 ) + strncpy( user, config_get_string( "server", "user", 0, UNSET_STR ), sizeof(user)); - if( default_duration == -1 ) { - default_duration = (config_get_float( "server", "waittime", 0, 0 ) * 1000000 / TIME_UNIT ); + if( default_duration == UNSET_INT ) { + default_duration = (config_get_float( "server", "waittime", 0, 0 ) * 1e6 / TIME_UNIT ); if( default_duration == 0 ) - default_duration = -1; - else if( default_duration < 16 ) { - fprintf( stderr, "waittime should be at least 2 (seconds)\n" ); + default_duration = UNSET_INT; + else if( default_duration * TIME_UNIT < 2e6 ) { + report( RPT_ERR, "Waittime should be at least 2 (seconds)" ); return -1; } } - if( daemon_mode == -1 ) { + if( daemon_mode == UNSET_INT ) { int fg; - fg = config_get_bool( "server", "foreground", 0, -1 ); - if( fg != -1 ) + fg = config_get_bool( "server", "foreground", 0, UNSET_INT ); + if( fg != UNSET_INT ) daemon_mode = !fg; } - if( enable_server_screen == -1 ) - enable_server_screen = config_get_bool( "server", "serverscreen", 0, -1 ); + if( enable_server_screen == UNSET_INT ) + enable_server_screen = config_get_bool( "server", "serverscreen", 0, UNSET_INT ); - if( backlight == -1 ) { - s = config_get_string( "server", "backlight", 0, "" ); + if( backlight == UNSET_INT ) { + s = config_get_string( "server", "backlight", 0, UNSET_STR ); if( strcmp( s, "on" ) == 0 ) { backlight = BACKLIGHT_ON; backlight_state = backlight; @@ -387,11 +409,22 @@ process_configfile ( char *configfile ) else if( strcmp( s, "open" ) == 0 ) { backlight = BACKLIGHT_OPEN; } - else if( strcmp( s, "" ) != 0 ) { - fprintf( stderr, "backlight state should be on, off or open\n" ); + else if( strcmp( s, UNSET_STR ) != 0 ) { + report( RPT_ERR, "Backlight state should be on, off or open" ); } } + if( reportToSyslog == UNSET_INT ) { + // Is the value set in the config file anyway ? + if( strcmp( config_get_string( "server", "reportToSyslog", 0, "" ), "" ) != 0 ) { + reportToSyslog = config_get_bool( "server", "reportToSyslog", 0, 0 ); + } + } + if( reportLevel == UNSET_INT ) { + reportLevel = config_get_int( "server", "reportLevel", 0, UNSET_INT ); + } + + // Read drivers // If drivers have been specified on the command line, then do not @@ -435,29 +468,37 @@ process_configfile ( char *configfile ) void set_default_settings() { + //report( RPT_INFO, "set_default_settings()" ); + // Set defaults into unfilled variables.... - if (debug_level == -1) - debug_level = DEFAULT_DEBUG_LEVEL; - if (lcd_port == -1) +// if (debug_level == UNSET_INT) +// debug_level = DEFAULT_DEBUG_LEVEL; + if (lcd_port == UNSET_INT) lcd_port = DEFAULT_LCD_PORT; - if (bind_addr[0] == 0) + if (strcmp( bind_addr, UNSET_STR ) == 0) strncpy (bind_addr, DEFAULT_BIND_ADDR, sizeof(bind_addr)); - if (configfile[0] == 0) + if (strcmp( configfile, UNSET_STR ) == 0) strncpy (configfile, DEFAULT_CONFIGFILE, sizeof(configfile)); - if (user[0] == 0) + if (strcmp( user, UNSET_STR ) == 0) strncpy(user, DEFAULT_USER, sizeof(user)); - if (daemon_mode == -1) + if (daemon_mode == UNSET_INT) daemon_mode = DEFAULT_DAEMON_MODE; - if (enable_server_screen == -1) + if (enable_server_screen == UNSET_INT) enable_server_screen = DEFAULT_ENABLE_SERVER_SCREEN; - if (default_duration == -1) + if (default_duration == UNSET_INT) default_duration = DEFAULT_SCREEN_DURATION; - if (backlight == -1) + if (backlight == UNSET_INT) backlight = BACKLIGHT_OPEN; + if (reportToSyslog == UNSET_INT ) + reportToSyslog = DEFAULT_REPORTTOSYSLOG; + if( reportLevel == UNSET_INT ) + reportLevel = DEFAULT_REPORTLEVEL; + + // Use default driver if( num_drivers == 0 ) { drivernames[0] = malloc(strlen(DEFAULT_DRIVER)+1); @@ -477,10 +518,12 @@ daemonize() { int child; + report( RPT_INFO, "daemonize()" ); + switch ((child = fork ()) ) { case -1: - syslog(LOG_ERR, "could not fork"); - return 1; + report(RPT_ERR, "Could not fork"); + return -1; case 0: // We are the child break; default: // We are the parent @@ -502,17 +545,18 @@ daemonize() int init_sockets () { + report( RPT_INFO, "init_sockets()" ); if (sock_create_server (&bind_addr, lcd_port) <= 0) { - syslog(LOG_ERR, "error opening socket"); - return 1; + report(RPT_ERR, "Error opening socket"); + return -1; } // Now init a bunch of required stuff... if (client_init () < 0) { - syslog(LOG_ERR, "error initializing client list"); - return 1; + report(RPT_ERR, "Error initializing client list"); + return -1; } return 0; } @@ -522,10 +566,11 @@ int init_drivers() { int i, res; - char buf[64]; int output_loaded = 0; + report( RPT_INFO, "init_drivers()" ); + // FIXME: This sets s equal to a value related to i // (bitshifted left?) FIX FIX FIX ARGH.... // @@ -550,8 +595,7 @@ init_drivers() break; } } else { - snprintf(buf, sizeof(buf), "Could not load driver %s\n", drivernames[i]); - fprintf(stderr, buf); + report( RPT_ERR, "Could not load driver %.40s", drivernames[i] ); } } @@ -559,6 +603,7 @@ init_drivers() if ( output_loaded ) { return 0; } else { + report( RPT_ERR, "There is no output driver" ); return -1; } } @@ -568,20 +613,16 @@ int drop_privs(char *user) { struct passwd *pwent; + report( RPT_INFO, "drop_privs()" ); + if (getuid() == 0 || geteuid() == 0) { if ((pwent = getpwnam(user)) == NULL) { - if (errno) { - perror("LCDd: getpwnam"); - return 1; - } else { - fprintf(stderr, "user %s not a valid user!", user); - return 1; - } + report( RPT_ERR, "User %.40s not a valid user!", user ); + return -1; } else { if (setuid(pwent->pw_uid) < 0) { - fprintf(stderr, "unable to switch to user %s\n", user); - perror("LCDd: setuid"); - return 1; + report( RPT_ERR, "Unable to switch to user %.40s", user ); + return -1; } } } @@ -592,14 +633,16 @@ int drop_privs(char *user) int init_screens () { + report( RPT_INFO, "init_screens()" ); + if (screenlist_init () < 0) { - syslog(LOG_ERR, "error initializing screen list"); - return 1; + report(RPT_ERR, "Error initializing screen list"); + return -1; } // Make sure the server screen shows up every once in a while.. if (server_screen_init () < 0) { - syslog(LOG_ERR, "error initializing server screens"); - return 1; + report(RPT_ERR, "Error initializing server screens"); + return -1; } else if (!enable_server_screen) { server_screen->priority = 256; } @@ -612,7 +655,9 @@ do_mainloop () { screen *s = NULL; char *message=NULL; - + + report( RPT_INFO, "do_mainloop()" ); + //char buf[64]; // FIXME: s should still be null from initialization.... what's happening here?! @@ -632,7 +677,7 @@ do_mainloop () // this is here because s is getting overwritten... //if (s != screenlist_current()) { - // syslog(LOG_DEBUG, "internal error! s was found overwritten at main.c:637"); + // report(RPT_DEBUG, "internal error! s was found overwritten at main.c:637"); // s = screenlist_current(); //} // @@ -665,33 +710,33 @@ do_mainloop () usleep (TIME_UNIT); - //Check to see if the screen has a timeout value, if it does - //decrese it and then check to see if it has excpired. + //Check to see if the screen has a timeout value, if it does + //decrese it and then check to see if it has excpired. //Remove if expired. if((message = malloc(256)) == NULL) - syslog(LOG_NOTICE, "Error allocating message string"); + report(RPT_ERR, "Error allocating message string"); else { snprintf(message, 256, "Screen->%s has timeout->%d", s->name, s->timeout); - syslog(LOG_NOTICE, message); + report(RPT_DEBUG, message); free(message); } if (s && s->timeout != -1) { - + --(s->timeout); if((message = malloc(256)) == NULL) - syslog(LOG_NOTICE, "Error allocating message string"); + report(RPT_ERR, "Error allocating message string"); else { snprintf(message, 256, "Timeout matches check, screen %s has timeout->%d", s->name, s->timeout); - syslog(LOG_NOTICE, message); + report(RPT_DEBUG, message); free(message); } if (s->timeout <= 0) { screen_remove (s->parent, s->id); if((message = malloc(256)) == NULL) - syslog(LOG_NOTICE, "Error allocating message string"); + report(RPT_ERR, "Error allocating message string"); else { snprintf(message, 256, "Removing screen %s which has timeout->%d", s->name, s->timeout); - syslog(LOG_NOTICE, message); + report(RPT_DEBUG, message); free(message); } } @@ -707,28 +752,38 @@ exit_program (int val) { char buf[64]; + report( RPT_INFO, "exit_program()" ); + // TODO: These things shouldn't be so interdependent. The order // things are shut down in shouldn't matter... - strcpy(buf, "server shutting down on "); + strcpy(buf, "Server shutting down on "); switch(val) { case 1: strcat(buf, "SIGHUP"); break; case 2: strcat(buf, "SIGINT"); break; case 15: strcat(buf, "SIGTERM"); break; - default: snprintf(buf, sizeof(buf), "server shutting down on signal %d", val); break; + default: snprintf(buf, sizeof(buf), "Server shutting down on signal %d", val); break; // Other values should not be seen, but just in case.. } - syslog(LOG_NOTICE, buf); // send message to syslog + report(RPT_NOTICE, buf); // report it + // Set emergency reporting and flush all messages if not done already. + if( reportLevel == UNSET_INT ) + reportLevel = DEFAULT_REPORTLEVEL; + if( reportToSyslog == UNSET_INT ) + reportLevel = DEFAULT_REPORTLEVEL; + set_reporting( reportLevel, (reportToSyslog?RPT_DEST_SYSLOG:RPT_DEST_STDERR) ); - goodbye_screen (); // display goodbye screen on LCD display - unload_all_drivers (); // release driver memory and file descriptors - - 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) + // Shutdown things if server start was complete + if( serverStarted ) { + goodbye_screen (); // display goodbye screen on LCD display + unload_all_drivers (); // release driver memory and file descriptors + 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); } @@ -737,11 +792,14 @@ exit_program (int val) void HelpScreen () { + // Help screen is printed to stdout on purpose. No reason to have + // this in syslog... + report( RPT_INFO, "HelpScreen()" ); printf ("\nLCDd Server Daemon (part of lcdproc), %s\n", version); printf ("Copyright (c) 1999 Scott Scriven, William Ferrell, and misc contributors\n"); printf ("This program is freely redistributable under the terms of the GNU Public License\n\n"); - printf ("Usage: LCDd [ -hfiw ] [ -c ] [ -d ] [ -a ] \\\n\t[ -p ] [ -u ] [ -w