diff options
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | Makefile.in | 6 | ||||
-rw-r--r-- | lcd4linux.c | 18 | ||||
-rw-r--r-- | pid.c | 143 | ||||
-rw-r--r-- | pid.h | 34 |
5 files changed, 198 insertions, 4 deletions
diff --git a/Makefile.am b/Makefile.am index fd5301b..984760f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -15,6 +15,7 @@ lcd4linux.c \ debug.c debug.h \ cfg.c cfg.h \ lock.c lock.h \ +pid.c pid.h \ parser.c parser.h \ processor.c processor.h \ system.c system.h \ diff --git a/Makefile.in b/Makefile.in index 626eb7a..bd42c04 100644 --- a/Makefile.in +++ b/Makefile.in @@ -81,7 +81,7 @@ lcd4linux_LDFLAGS = $(X_LIBS) lcd4linux_LDADD = @DRIVERS@ @DRVLIBS@ lcd4linux_DEPENDENCIES = @DRIVERS@ -lcd4linux_SOURCES = lcd4linux.c debug.c debug.h cfg.c cfg.h lock.c lock.h parser.c parser.h processor.c processor.h system.c system.h isdn.c isdn.h mail.c mail.h seti.c seti.h battery.c battery.h dvb.c dvb.h filter.c filter.h udelay.c udelay.h display.c display.h pixmap.c pixmap.h bar.c bar.h fontmap.c fontmap.h exec.c exec.h mail2.c socket.c socket.h +lcd4linux_SOURCES = lcd4linux.c debug.c debug.h cfg.c cfg.h lock.c lock.h pid.c pid.h parser.c parser.h processor.c processor.h system.c system.h isdn.c isdn.h mail.c mail.h seti.c seti.h battery.c battery.h dvb.c dvb.h filter.c filter.h udelay.c udelay.h display.c display.h pixmap.c pixmap.h bar.c bar.h fontmap.c fontmap.h exec.c exec.h mail2.c socket.c socket.h EXTRA_lcd4linux_SOURCES = parport.c parport.h BeckmannEgle.c Crystalfontz.c Crystalfontz.h Cwlinux.c HD44780.c M50530.c T6963.c USBLCD.c MatrixOrbital.c PalmPilot.c Raster.c SIN.c Skeleton.c XWindow.c Text.c @@ -104,7 +104,7 @@ X_CFLAGS = @X_CFLAGS@ X_LIBS = @X_LIBS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ -lcd4linux_OBJECTS = lcd4linux.o debug.o cfg.o lock.o parser.o \ +lcd4linux_OBJECTS = lcd4linux.o debug.o cfg.o lock.o pid.o parser.o \ processor.o system.o isdn.o mail.o seti.o battery.o dvb.o filter.o \ udelay.o display.o pixmap.o bar.o fontmap.o exec.o mail2.o socket.o CFLAGS = @CFLAGS@ @@ -126,7 +126,7 @@ DEP_FILES = .deps/BeckmannEgle.P .deps/Crystalfontz.P .deps/Cwlinux.P \ .deps/USBLCD.P .deps/XWindow.P .deps/bar.P .deps/battery.P .deps/cfg.P \ .deps/debug.P .deps/display.P .deps/dvb.P .deps/exec.P .deps/filter.P \ .deps/fontmap.P .deps/isdn.P .deps/lcd4linux.P .deps/lock.P \ -.deps/mail.P .deps/mail2.P .deps/parport.P .deps/parser.P \ +.deps/mail.P .deps/mail2.P .deps/parport.P .deps/parser.P .deps/pid.P \ .deps/pixmap.P .deps/processor.P .deps/seti.P .deps/socket.P \ .deps/system.P .deps/udelay.P SOURCES = $(lcd4linux_SOURCES) $(EXTRA_lcd4linux_SOURCES) diff --git a/lcd4linux.c b/lcd4linux.c index 9a1e64b..6a357f7 100644 --- a/lcd4linux.c +++ b/lcd4linux.c @@ -1,4 +1,4 @@ -/* $Id: lcd4linux.c,v 1.40 2003/08/08 06:58:06 reinelt Exp $ +/* $Id: lcd4linux.c,v 1.41 2003/08/08 08:05:23 reinelt Exp $ * * LCD4Linux * @@ -20,6 +20,9 @@ * * * $Log: lcd4linux.c,v $ + * Revision 1.41 2003/08/08 08:05:23 reinelt + * added PID file handling + * * Revision 1.40 2003/08/08 06:58:06 reinelt * improved forking * @@ -217,10 +220,13 @@ #include "cfg.h" #include "debug.h" +#include "pid.h" #include "udelay.h" #include "display.h" #include "processor.h" +#define PIDFILE "/var/run/lcd4linux.pid" + char *release="LCD4Linux " VERSION " (c) 2003 Michael Reinelt <reinelt@eunet.at>"; char **my_argv; char *output=NULL; @@ -428,6 +434,14 @@ int main (int argc, char *argv[]) dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); close(fd); + + // create PID file + if (pid_init(PIDFILE)!=0) { + error ("PID file creation failed!"); + exit (1); + } + + // now we are a daemon background=1; } @@ -469,6 +483,8 @@ int main (int argc, char *argv[]) if (!quiet) hello(); lcd_quit(); + pid_exit(PIDFILE); + if (got_signal==SIGHUP) { long fd; debug ("restarting..."); @@ -0,0 +1,143 @@ +/* $Id: pid.c,v 1.1 2003/08/08 08:05:23 reinelt Exp $ + * + * PID file handling + * + * Copyright 1999, 2000 by Michael Reinelt (reinelt@eunet.at) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * + * $Log: pid.c,v $ + * Revision 1.1 2003/08/08 08:05:23 reinelt + * added PID file handling + * + */ + +/* + * exported functions: + * + * int pid_init (const char *pidfile) + * returns 0 if PID file could be successfully created + * returns PID of an already running process + * returns -1 in case of an error + + * int pid_exit (const char *pidfile) + * returns 0 if PID file could be successfully deleted + * otherwise returns error from unlink() call + * + */ + + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <signal.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include "debug.h" +#include "pid.h" + + +int pid_init (const char *pidfile) +{ + char tmpfile[256]; + char buffer[16]; + int fd, len, pid; + + snprintf(tmpfile, sizeof(tmpfile), "%s.%s", pidfile, "XXXXXX"); + + if ((fd=mkstemp(tmpfile))==-1) { + error ("mkstemp(%s) failed: %s", tmpfile, strerror(errno)); + return -1; + } + + if (fchmod(fd,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)==-1) { + error ("fchmod(%s) failed: %s", tmpfile, strerror(errno)); + close(fd); + unlink(tmpfile); + return -1; + } + + snprintf (buffer, sizeof(buffer), "%d\n", (int)getpid()); + if (write(fd, buffer, strlen(buffer))!=strlen(buffer)) { + error ("write(%s) failed: %s", tmpfile, strerror(errno)); + close(fd); + unlink(tmpfile); + return -1; + } + close (fd); + + + while (link(tmpfile, pidfile)==-1) { + + if (errno!=EEXIST) { + error ("link(%s, %s) failed: %s", tmpfile, pidfile, strerror(errno)); + unlink(tmpfile); + return -1; + } + + if ((fd=open(pidfile, O_RDONLY))==-1) { + if (errno==ENOENT) continue; // pidfile disappared + error ("open(%s) failed: %s", pidfile, strerror(errno)); + unlink (tmpfile); + return -1; + } + + len=read(fd, buffer, sizeof(buffer)-1); + if (len<0) { + error ("read(%s) failed: %s", pidfile, strerror(errno)); + unlink (tmpfile); + return -1; + } + + buffer[len]='\0'; + if (sscanf(buffer, "%d", &pid)!=1 || pid==0) { + error ("scan(%s) failed.", pidfile); + unlink (tmpfile); + return -1; + } + + if (pid==getpid()) { + error ("%s already locked by us. uh-oh...", pidfile); + unlink(tmpfile); + return 0; + } + + if ((kill(pid, 0)==-1) && errno==ESRCH) { + error ("removing stale PID file %s", pidfile); + if (unlink(pidfile)==-1 && errno!=ENOENT) { + error ("unlink(%s) failed: %s", pidfile, strerror(errno)); + unlink(tmpfile); + return pid; + } + continue; + } + unlink (tmpfile); + return pid; + } + + unlink (tmpfile); + return 0; +} + + +int pid_exit (const char *pidfile) +{ + return unlink(pidfile); +} @@ -0,0 +1,34 @@ +/* $Id: pid.h,v 1.1 2003/08/08 08:05:23 reinelt Exp $ + * + * PID file handling + * + * Copyright 2003 by Michael Reinelt (reinelt@eunet.at) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * + * $Log: pid.h,v $ + * Revision 1.1 2003/08/08 08:05:23 reinelt + * added PID file handling + * + */ + +#ifndef _PID_H_ +#define _PID_H_ + +int pid_init (const char *pidfile); +int pid_exit (const char *pidfile); + +#endif |