diff options
Diffstat (limited to 'lcd4linux.c')
-rw-r--r-- | lcd4linux.c | 511 |
1 files changed, 258 insertions, 253 deletions
diff --git a/lcd4linux.c b/lcd4linux.c index 65e4a66..a532b49 100644 --- a/lcd4linux.c +++ b/lcd4linux.c @@ -1,4 +1,4 @@ -/* $Id: lcd4linux.c,v 1.77 2005/03/30 04:57:50 reinelt Exp $ +/* $Id: lcd4linux.c,v 1.78 2005/05/08 04:32:44 reinelt Exp $ * * LCD4Linux * @@ -23,6 +23,9 @@ * * * $Log: lcd4linux.c,v $ + * Revision 1.78 2005/05/08 04:32:44 reinelt + * CodingStyle added and applied + * * Revision 1.77 2005/03/30 04:57:50 reinelt * Evaluator speedup: use bsearch for finding functions and variables * @@ -390,289 +393,291 @@ #define PIDFILE "/var/run/lcd4linux.pid" -static char *release = "LCD4Linux " VERSION; +static char *release = "LCD4Linux " VERSION; static char *copyright = "Copyright (C) 2005 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>"; static char **my_argv; -extern char* output; +extern char *output; -int got_signal=0; +int got_signal = 0; static void usage(void) { - printf ("%s\n", release); - printf ("%s\n", copyright); - printf ("usage: lcd4linux [-h]\n"); - printf (" lcd4linux [-l]\n"); - printf (" lcd4linux [-c key=value] [-i] [-f config-file] [-v]\n"); - printf (" lcd4linux [-c key=value] [-F] [-f config-file] [-o output-file] [-q] [-v]\n"); + printf("%s\n", release); + printf("%s\n", copyright); + printf("usage: lcd4linux [-h]\n"); + printf(" lcd4linux [-l]\n"); + printf(" lcd4linux [-c key=value] [-i] [-f config-file] [-v]\n"); + printf(" lcd4linux [-c key=value] [-F] [-f config-file] [-o output-file] [-q] [-v]\n"); } -static void interactive_mode (void) +static void interactive_mode(void) { - char line[1024]; - void *tree; - RESULT result = {0, 0, 0, NULL}; - - printf("\neval> "); - for(fgets(line, 1024, stdin); !feof(stdin); fgets(line, 1024, stdin)) { - if (line[strlen(line)-1]=='\n') line[strlen(line)-1]='\0'; - if (strlen(line)>0) { - if (Compile(line, &tree)!=-1) { - Eval (tree, &result); - if (result.type == R_NUMBER) { - printf ("%g\n", R2N(&result)); - } else if (result.type == R_STRING) { - printf ("'%s'\n", R2S(&result)); - } else if (result.type == (R_NUMBER|R_STRING)) { - printf ("'%s' (%g)\n", R2S(&result), R2N(&result)); - } else { - printf ("internal error: unknown result type %d\n", result.type); + char line[1024]; + void *tree; + RESULT result = { 0, 0, 0, NULL }; + + printf("\neval> "); + for (fgets(line, 1024, stdin); !feof(stdin); fgets(line, 1024, stdin)) { + if (line[strlen(line) - 1] == '\n') + line[strlen(line) - 1] = '\0'; + if (strlen(line) > 0) { + if (Compile(line, &tree) != -1) { + Eval(tree, &result); + if (result.type == R_NUMBER) { + printf("%g\n", R2N(&result)); + } else if (result.type == R_STRING) { + printf("'%s'\n", R2S(&result)); + } else if (result.type == (R_NUMBER | R_STRING)) { + printf("'%s' (%g)\n", R2S(&result), R2N(&result)); + } else { + printf("internal error: unknown result type %d\n", result.type); + } + DelResult(&result); + } + DelTree(tree); } - DelResult (&result); - } - DelTree(tree); + printf("eval> "); } - printf("eval> "); - } - printf ("\n"); + printf("\n"); } -void handler (int signal) +void handler(int signal) { - debug ("got signal %d", signal); - got_signal=signal; + debug("got signal %d", signal); + got_signal = signal; } -int main (int argc, char *argv[]) +int main(int argc, char *argv[]) { - char *cfg = "/etc/lcd4linux.conf"; - char *display, *driver, *layout; - char section[32]; - int c; - int quiet = 0; - int interactive = 0; - int pid; - - /* save arguments for restart */ - my_argv = malloc(sizeof(char*)*(argc+1)); - for (c = 0; c < argc; c++) { - my_argv[c] = strdup(argv[c]); - } - my_argv[c] = NULL; - - running_foreground = 0; - running_background = 0; - - while ((c=getopt (argc, argv, "c:Ff:hilo:qv"))!=EOF) { - - switch (c) { - case 'c': - if (cfg_cmd (optarg)<0) { - fprintf (stderr, "%s: illegal argument -c '%s'\n", argv[0], optarg); + char *cfg = "/etc/lcd4linux.conf"; + char *display, *driver, *layout; + char section[32]; + int c; + int quiet = 0; + int interactive = 0; + int pid; + + /* save arguments for restart */ + my_argv = malloc(sizeof(char *) * (argc + 1)); + for (c = 0; c < argc; c++) { + my_argv[c] = strdup(argv[c]); + } + my_argv[c] = NULL; + + running_foreground = 0; + running_background = 0; + + while ((c = getopt(argc, argv, "c:Ff:hilo:qv")) != EOF) { + + switch (c) { + case 'c': + if (cfg_cmd(optarg) < 0) { + fprintf(stderr, "%s: illegal argument -c '%s'\n", argv[0], optarg); + exit(2); + } + break; + case 'F': + running_foreground++; + break; + case 'f': + cfg = optarg; + break; + case 'h': + usage(); + exit(0); + case 'i': + interactive++; + break; + case 'l': + printf("%s\n", release); + printf("%s\n", copyright); + drv_list(); + exit(0); + case 'o': + output = optarg; + break; + case 'q': + quiet++; + break; + case 'v': + verbose_level++; + break; + default: + exit(2); + } + } + + if (optind < argc) { + fprintf(stderr, "%s: illegal option %s\n", argv[0], argv[optind]); exit(2); - } - break; - case 'F': - running_foreground++; - break; - case 'f': - cfg=optarg; - break; - case 'h': - usage(); - exit(0); - case 'i': - interactive++; - break; - case 'l': - printf ("%s\n", release); - printf ("%s\n", copyright); - drv_list(); - exit(0); - case 'o': - output=optarg; - break; - case 'q': - quiet++; - break; - case 'v': - verbose_level++; - break; - default: - exit(2); } - } - - if (optind < argc) { - fprintf (stderr, "%s: illegal option %s\n", argv[0], argv[optind]); - exit(2); - } - - /* do not fork in interactive mode */ - if (interactive) { - running_foreground=1; - } - - info ("Version " VERSION " starting"); - if (!running_foreground && (my_argv[0]==NULL || my_argv[0][0]!='/')) { - info ("invoked without full path; restart may not work!"); - } - - if (cfg_init(cfg)==-1) - exit (1); - - if (plugin_init()==-1) - exit (1); - - display=cfg_get(NULL, "Display", NULL); - if (display==NULL || *display=='\0') { - error ("missing 'Display' entry in %s!", cfg_source()); - exit (1); - } - - qprintf(section, sizeof(section), "Display:%s", display); - free(display); - driver=cfg_get(section, "Driver", NULL); - if (driver==NULL || *driver=='\0') { - error ("missing '%s.Driver' entry in %s!", section, cfg_source()); - exit (1); - } - - if (!running_foreground) { - pid_t i; - int fd; - debug ("going background..."); - i=fork(); - if (i<0) { - error ("fork() failed: %s", strerror(errno)); - exit (1); + + /* do not fork in interactive mode */ + if (interactive) { + running_foreground = 1; + } + + info("Version " VERSION " starting"); + if (!running_foreground && (my_argv[0] == NULL || my_argv[0][0] != '/')) { + info("invoked without full path; restart may not work!"); + } + + if (cfg_init(cfg) == -1) + exit(1); + + if (plugin_init() == -1) + exit(1); + + display = cfg_get(NULL, "Display", NULL); + if (display == NULL || *display == '\0') { + error("missing 'Display' entry in %s!", cfg_source()); + exit(1); + } + + qprintf(section, sizeof(section), "Display:%s", display); + free(display); + driver = cfg_get(section, "Driver", NULL); + if (driver == NULL || *driver == '\0') { + error("missing '%s.Driver' entry in %s!", section, cfg_source()); + exit(1); + } + + if (!running_foreground) { + pid_t i; + int fd; + debug("going background..."); + i = fork(); + if (i < 0) { + error("fork() failed: %s", strerror(errno)); + exit(1); + } + if (i != 0) + exit(0); + + /* ignore nasty signals */ + signal(SIGINT, SIG_IGN); + signal(SIGQUIT, SIG_IGN); + + /* chdir("/") */ + if (chdir("/") != 0) { + error("chdir(\"/\") failed: %s", strerror(errno)); + exit(1); + } + + /* we want full control over permissions */ + umask(0); + + /* detach stdin */ + if (freopen("/dev/null", "r", stdin) == NULL) { + error("freopen (/dev/null) failed: %s", strerror(errno)); + exit(1); + } + + /* detach stdout and stderr */ + fd = open("/dev/null", O_WRONLY, 0666); + if (fd == -1) { + error("open (/dev/null) failed: %s", strerror(errno)); + exit(1); + } + fflush(stdout); + fflush(stderr); + dup2(fd, STDOUT_FILENO); + dup2(fd, STDERR_FILENO); + close(fd); + + /* create PID file */ + if ((pid = pid_init(PIDFILE)) != 0) { + error("lcd4linux already running as process %d", pid); + exit(1); + } + + /* now we are a daemon */ + running_background = 1; + } + + /* go into interactive mode before display initialization */ + if (interactive >= 2) { + interactive_mode(); + pid_exit(PIDFILE); + cfg_exit(); + exit(0); } - if (i!=0) exit (0); - - /* ignore nasty signals */ - signal(SIGINT, SIG_IGN); - signal(SIGQUIT, SIG_IGN); - - /* chdir("/") */ - if (chdir("/")!=0) { - error ("chdir(\"/\") failed: %s", strerror(errno)); - exit (1); + + /* check the conf to see if quiet startup is wanted */ + if (!quiet) { + cfg_number(NULL, "Quiet", 0, 0, 1, &quiet); } - - /* we want full control over permissions */ - umask (0); - - /* detach stdin */ - if (freopen("/dev/null", "r", stdin)==NULL) { - error ("freopen (/dev/null) failed: %s", strerror(errno)); - exit (1); + + debug("initializing driver %s", driver); + if (drv_init(section, driver, quiet) == -1) { + pid_exit(PIDFILE); + exit(1); } + free(driver); - /* detach stdout and stderr */ - fd=open("/dev/null", O_WRONLY, 0666); - if (fd==-1) { - error ("open (/dev/null) failed: %s", strerror(errno)); - exit (1); + /* go into interactive mode (display has been initialized) */ + if (interactive >= 1) { + interactive_mode(); + drv_quit(quiet); + pid_exit(PIDFILE); + cfg_exit(); + exit(0); } - fflush(stdout); - fflush(stderr); - dup2(fd, STDOUT_FILENO); - dup2(fd, STDERR_FILENO); - close(fd); - - /* create PID file */ - if ((pid = pid_init(PIDFILE)) != 0) { - error ("lcd4linux already running as process %d", pid); - exit (1); + + /* check for new-style layout */ + layout = cfg_get(NULL, "Layout", NULL); + if (layout == NULL || *layout == '\0') { + error("missing 'Layout' entry in %s!", cfg_source()); + exit(1); } - /* now we are a daemon */ - running_background=1; - } - - /* go into interactive mode before display initialization */ - if (interactive >= 2) { - interactive_mode(); - pid_exit(PIDFILE); - cfg_exit(); - exit (0); - } - - /* check the conf to see if quiet startup is wanted */ - if (!quiet) { - cfg_number(NULL, "Quiet", 0, 0, 1, &quiet); - } - - debug ("initializing driver %s", driver); - if (drv_init(section, driver, quiet)==-1) { - pid_exit(PIDFILE); - exit (1); - } - free(driver); - - /* go into interactive mode (display has been initialized) */ - if (interactive >= 1) { - interactive_mode(); + layout_init(layout); + free(layout); + + debug("starting main loop"); + + /* now install our own signal handler */ + signal(SIGHUP, handler); + signal(SIGINT, handler); + signal(SIGQUIT, handler); + signal(SIGTERM, handler); + + while (got_signal == 0) { + struct timespec delay; + if (timer_process(&delay) < 0) + break; + nanosleep(&delay, NULL); + } + + debug("leaving main loop"); + drv_quit(quiet); pid_exit(PIDFILE); cfg_exit(); - exit (0); - } - - /* check for new-style layout */ - layout=cfg_get(NULL, "Layout", NULL); - if (layout==NULL || *layout=='\0') { - error ("missing 'Layout' entry in %s!", cfg_source()); - exit (1); - } - - layout_init(layout); - free(layout); - - debug ("starting main loop"); - - /* now install our own signal handler */ - signal(SIGHUP, handler); - signal(SIGINT, handler); - signal(SIGQUIT, handler); - signal(SIGTERM, handler); - - while (got_signal==0) { - struct timespec delay; - if (timer_process(&delay)<0) break; - nanosleep(&delay, NULL); - } - - debug ("leaving main loop"); - - drv_quit(quiet); - pid_exit(PIDFILE); - cfg_exit(); - plugin_exit(); - timer_exit(); - - if (got_signal==SIGHUP) { - long fd; - debug ("restarting..."); - /* close all files on exec */ - for (fd=sysconf(_SC_OPEN_MAX); fd>2; fd--) { - int flag; - if ((flag=fcntl(fd,F_GETFD,0))!=-1) - fcntl(fd,F_SETFD,flag|FD_CLOEXEC); + plugin_exit(); + timer_exit(); + + if (got_signal == SIGHUP) { + long fd; + debug("restarting..."); + /* close all files on exec */ + for (fd = sysconf(_SC_OPEN_MAX); fd > 2; fd--) { + int flag; + if ((flag = fcntl(fd, F_GETFD, 0)) != -1) + fcntl(fd, F_SETFD, flag | FD_CLOEXEC); + } + execv(my_argv[0], my_argv); + error("execv() failed: %s", strerror(errno)); + exit(1); } - execv (my_argv[0], my_argv); - error ("execv() failed: %s", strerror(errno)); - exit(1); - } - - for(c=0;my_argv[c]!=NULL;c++) { - free(my_argv[c]); - } - free(my_argv); - - exit (0); + + for (c = 0; my_argv[c] != NULL; c++) { + free(my_argv[c]); + } + free(my_argv); + + exit(0); } - |