diff options
Diffstat (limited to 'src/pidfile.c')
-rw-r--r-- | src/pidfile.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/pidfile.c b/src/pidfile.c new file mode 100644 index 0000000..484cabd --- /dev/null +++ b/src/pidfile.c @@ -0,0 +1,90 @@ +/* wydawca - automatic release submission daemon + Copyright (C) 2007, 2009 Sergey Poznyakoff + + Wydawca 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 3 of the License, or (at your + option) any later version. + + Wydawca 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 wydawca. If not, see <http://www.gnu.org/licenses/>. */ + +#include "wydawca.h" + +char *pidfile = LOCALSTATEDIR "/run/wydawca.pid"; +int force_startup; + + +void +remove_pidfile (void) +{ + unlink (pidfile); +} + +void +check_pidfile () +{ + FILE *fp = fopen (pidfile, "r+"); + + if (fp) + { + unsigned long pid; + if (fscanf (fp, "%ul\n", &pid) != 1) + { + logmsg (LOG_ERR, _("malformed pidfile %s"), pidfile); + if (!force_startup) + exit (1); + } + else + { + if (kill (pid, 0)) + { + if (errno != ESRCH) + { + logmsg (LOG_ERR, + _("cannot verify if PID %lu is running: %s"), + pid, strerror (errno)); + if (!force_startup) + exit (1); + } + } + else if (!force_startup) + { + logmsg (LOG_ERR, + _("another wydawca instance may be running (PID %lu)"), + pid); + exit (1); + } + } + logmsg (LOG_NOTICE, _("replacing pidfile %s (PID %lu)"), + pidfile, pid); + fseek (fp, 0, SEEK_SET); + } + else if (errno != ENOENT) + { + logmsg (LOG_ERR, _("cannot open pidfile %s: %s"), pidfile, + strerror (errno)); + exit (1); + } + else + { + fp = fopen (pidfile, "w"); + if (!fp) + { + logmsg (LOG_ERR, + _("cannot open pidfile %s for writing: %s"), + pidfile, strerror (errno)); + exit (1); + } + } + fprintf (fp, "%lu\n", getpid ()); + fclose (fp); + atexit (remove_pidfile); +} + + |