]> git.webhop.me Git - lcd4linux.git/commitdiff
[lcd4linux @ 2003-08-08 08:05:23 by reinelt]
authorreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Fri, 8 Aug 2003 08:05:23 +0000 (08:05 +0000)
committerreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Fri, 8 Aug 2003 08:05:23 +0000 (08:05 +0000)
added PID file handling

git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@208 3ae390bd-cb1e-0410-b409-cd5a39f66f1f

Makefile.am
Makefile.in
lcd4linux.c
pid.c [new file with mode: 0644]
pid.h [new file with mode: 0644]

index fd5301b765e75a4f581e28ce67d387c6903f2df4..984760f7973f1c754e1c65e443947a03f310b65b 100644 (file)
@@ -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 \
index 626eb7ab3f304729059c4e297b2b8443c8b02902..bd42c04d2800d47b3c1bed97b96ed390dc4685bf 100644 (file)
@@ -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)
index 9a1e64b632cdec1c1f3486595c99768a182ff532..6a357f79af2aaaf5a76e42e86b5a621c5365981c 100644 (file)
@@ -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
  *
 
 #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 (file)
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 (file)
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