diff options
-rw-r--r-- | lcd4linux.c | 65 |
1 files changed, 55 insertions, 10 deletions
diff --git a/lcd4linux.c b/lcd4linux.c index d50c09d..de971eb 100644 --- a/lcd4linux.c +++ b/lcd4linux.c @@ -1,4 +1,4 @@ -/* $Id: lcd4linux.c,v 1.27 2000/08/10 18:42:20 reinelt Exp $ +/* $Id: lcd4linux.c,v 1.28 2000/10/25 08:10:48 reinelt Exp $ * * LCD4Linux * @@ -20,6 +20,11 @@ * * * $Log: lcd4linux.c,v $ + * Revision 1.28 2000/10/25 08:10:48 reinelt + * + * added restart funnctionality + * (lots of this code was stolen from sendmail.c) + * * Revision 1.27 2000/08/10 18:42:20 reinelt * * fixed some bugs with the new syslog code @@ -158,6 +163,8 @@ #include <stdio.h> #include <string.h> #include <unistd.h> +#include <fcntl.h> +#include <limits.h> #include <errno.h> #include <signal.h> @@ -168,6 +175,7 @@ #include "processor.h" char *release="LCD4Linux " VERSION " (c) 2000 Michael Reinelt <reinelt@eunet.at>"; +char **my_argv; char *output=NULL; int got_signal=0; int debugging=1; @@ -248,6 +256,13 @@ int main (int argc, char *argv[]) int c, smooth; int quiet=0; + // 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; + while ((c=getopt (argc, argv, "c:dFf:hlo:qv"))!=EOF) { switch (c) { case 'c': @@ -293,26 +308,46 @@ int main (int argc, char *argv[]) if (!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); + if (i!=0) exit (0); - // close stdin/out/err ??? - // open (dev/null) ??? + // ignore nasty signals + signal(SIGINT, SIG_IGN); + signal(SIGQUIT, SIG_IGN); + // 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); } - if (foreground) + if (foreground) { debug ("LCD4Linux " VERSION); - else + } else { info ("Version " VERSION " starting"); - + if (my_argv[0]==NULL || my_argv[0][0]!='/') { + info ("invoked without full path; restart may not work!"); + } + } + // set default values - cfg_set ("row1", "*** %o %v ***"); cfg_set ("row2", "%p CPU %r MB RAM"); cfg_set ("row3", "Busy %cu%% $r10cu"); @@ -332,6 +367,7 @@ int main (int argc, char *argv[]) exit (1); } + // now install our own signal handler signal(SIGHUP, handler); signal(SIGINT, handler); signal(SIGQUIT, handler); @@ -365,7 +401,16 @@ int main (int argc, char *argv[]) lcd_quit(); if (got_signal==SIGHUP) { - debug ("restarting"); + int i, j; + debug ("restarting..."); + // close all files on exec + for (i=3; i<OPEN_MAX; i++) { + if ((j=fcntl(i,F_GETFD,0))!=-1) + fcntl(i,F_SETFD,j|FD_CLOEXEC); + } + execv (my_argv[0], my_argv); + error ("execv() failed: %s", strerror(errno)); + exit(1); } exit (0); } |