aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.am1
-rw-r--r--Makefile.in6
-rw-r--r--lcd4linux.c18
-rw-r--r--pid.c143
-rw-r--r--pid.h34
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...");
diff --git a/pid.c b/pid.c
new file mode 100644
index 0000000..b7bfe3c
--- /dev/null
+++ b/pid.c
@@ -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);
+}
diff --git a/pid.h b/pid.h
new file mode 100644
index 0000000..84d253e
--- /dev/null
+++ b/pid.h
@@ -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