From 2cce4542730411c90986f180bb0dc43af87278be Mon Sep 17 00:00:00 2001 From: reinelt <> Date: Fri, 8 Aug 2003 08:05:23 +0000 Subject: [lcd4linux @ 2003-08-08 08:05:23 by reinelt] added PID file handling --- Makefile.am | 1 + Makefile.in | 6 +-- lcd4linux.c | 18 +++++++- pid.c | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pid.h | 34 +++++++++++++++ 5 files changed, 198 insertions(+), 4 deletions(-) create mode 100644 pid.c create mode 100644 pid.h 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 "; 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#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 -- cgit v1.2.3 ions'>+18230 2016-01-18Update get-vcs-snapshot.sh to reflect gbp changesJonathan McCrohan2-1/+2 2016-01-18Imported Upstream version 0+git20151202.3864e0aupstream/0+git20151202.3864e0aJonathan McCrohan840-4057/+18230 2015-05-05d/control: various fixes found by libconfig-model-dpkg-perlJonathan McCrohan2-5/+13 2015-04-01Release 0+git20150208.f2053b3-1Jonathan McCrohan1-2/+2 2015-04-01Describe changes made in snapshotJonathan McCrohan1-0/+3 2015-04-01New Upstream Snapshot (commit f2053b3)Jonathan McCrohan1-0/+6 2015-04-01Imported Upstream version 0+git20150208.f2053b3upstream/0+git20150208.f2053b3Jonathan McCrohan32-333/+483 2014-12-28Release 0+git20141218.b46a22c-1debian/0+git20141218.b46a22c-1Jonathan McCrohan1-2/+2 2014-12-28Updated AU DVB-T files; Thanks Brian Burch! (Closes LP: #1393280)Jonathan McCrohan1-0/+1 2014-12-28New Upstream Snapshot (commit b46a22c)Jonathan McCrohan1-0/+6 2014-12-28Imported Upstream version 0+git20141218.b46a22cupstream/0+git20141218.b46a22cJonathan McCrohan535-639/+317 2014-10-20Release 0+git20141009.d26b627-1debian/0+git20141009.d26b627-1Jonathan McCrohan1-2/+2 2014-10-20Fix up packaging to account for move to DVBv5Jonathan McCrohan2-2/+6 2014-10-20delete d/dtv-scan-files.install; Upstream now supplies a MakefileJonathan McCrohan2-4/+1 2014-10-15d/control: update Standards Version to 3.9.6Jonathan McCrohan2-1/+3 2014-10-15d/control: add Build-Depends on dvb-toolsJonathan McCrohan2-1/+2 2014-10-15New Upstream Snapshot (commit d26b627)Jonathan McCrohan1-0/+10 2014-10-15Imported Upstream version 0+git20141009.d26b627upstream/0+git20141009.d26b627Jonathan McCrohan2010-11120/+159271 2014-07-23Release 0+git20140611.14bd6c7-1debian/0+git20140611.14bd6c7-1Jonathan McCrohan1-2/+2 2014-07-23New Upstream Snapshot (commit 14bd6c7)Jonathan McCrohan1-2/+3 2014-07-23Imported Upstream version 0+git20140611.14bd6c7upstream/0+git20140611.14bd6c7Jonathan McCrohan7-11/+60 2014-05-13New Upstream Snapshot (commit 1246b27)Jonathan McCrohan1-0/+6 2014-05-13Imported Upstream version 0+git20140512.1246b27upstream/0+git20140512.1246b27Jonathan McCrohan391-301/+3983 2014-04-05Release 0+git20140326.cfc2975-1debian/0+git20140326.cfc2975-1Jonathan McCrohan1-2/+2 2014-04-05d/control: update Homepage (upstream has moved from Gitweb to cgit)Jonathan McCrohan2-1/+2 2014-04-05New Upstream Snapshot (commit cfc2975)Jonathan McCrohan1-0/+6 2014-04-05Imported Upstream version 0+git20140326.cfc2975upstream/0+git20140326.cfc2975Jonathan McCrohan118-656/+877 2014-01-16Release 0+git20140107.1850cf8-1debian/0+git20140107.1850cf8-1Jonathan McCrohan1-2/+2 2014-01-16Update Standards Version to 3.9.5Jonathan McCrohan2-1/+9