From: Eric Leblond <eric@regit.org>
To: netfilter-devel@vger.kernel.org
Cc: Eric Leblond <eric@regit.org>
Subject: [Ulogd PATCH] Improve pid file handling.
Date: Sun, 19 May 2013 21:22:14 +0200 [thread overview]
Message-ID: <1368991334-952-1-git-send-email-eric@regit.org> (raw)
In-Reply-To: <1368991178.14976.4.camel@ice-age.regit.org>
This patch improves latest patch by splitting in two part the pid
file creation. This allows to display a message to stdout when
ulogd can not be started. Another linked improvement is that the
plugin initialization is not done if the pid file existence will
result in a ulogd exit.
Signed-off-by: Eric Leblond <eric@regit.org>
---
src/ulogd.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 54 insertions(+), 12 deletions(-)
diff --git a/src/ulogd.c b/src/ulogd.c
index 4309201..c1aba77 100644
--- a/src/ulogd.c
+++ b/src/ulogd.c
@@ -82,6 +82,7 @@ static FILE *logfile = NULL; /* logfile pointer */
static char *ulogd_logfile = NULL;
static const char *ulogd_configfile = ULOGD_CONFIGFILE;
static const char *ulogd_pidfile = NULL;
+static int ulogd_pidfile_fd = -1;
static FILE syslog_dummy;
static int info_mode = 0;
@@ -1017,7 +1018,7 @@ static int parse_conffile(const char *section, struct config_keyset *ce)
* the GPL2+ license with the following copyright statement:
* Copyright (C) 1996 Thomas Koenig
*/
-static int lock_fd(int fd)
+static int lock_fd(int fd, int wait)
{
struct flock lock;
@@ -1026,7 +1027,10 @@ static int lock_fd(int fd)
lock.l_start = 0;
lock.l_len = 0;
- return fcntl(fd, F_SETLK, &lock);
+ if (wait)
+ return fcntl(fd, F_SETLKW, &lock);
+ else
+ return fcntl(fd, F_SETLK, &lock);
}
/*
@@ -1036,12 +1040,15 @@ static int lock_fd(int fd)
* under the GPL2+ license with the following copyright statement:
* Copyright (C) 1996 Thomas Koenig
*/
-static int write_pidfile()
+static int create_pidfile()
{
int fd;
FILE *fp;
pid_t pid = -1;
+ if (!ulogd_pidfile)
+ return 0;
+
fd = open(ulogd_pidfile, O_RDWR | O_CREAT | O_EXCL, 0644);
if (fd < 0) {
if (errno != EEXIST) {
@@ -1061,13 +1068,14 @@ static int write_pidfile()
if (fp == NULL) {
ulogd_log(ULOGD_ERROR, "cannot fdopen %s: %d\n",
ulogd_pidfile, errno);
+ close(fd);
return -1;
}
if ((fscanf(fp, "%d", &pid) != 1) || (pid == getpid())
- || (lock_fd(fd) == 0)) {
+ || (lock_fd(fd, 0) == 0)) {
ulogd_log(ULOGD_NOTICE,
- "removing stale pidfile for pid %d\n", pid);
+ "removing stale pidfile for pid %d\n", pid);
if (unlink(ulogd_pidfile) < 0) {
ulogd_log(ULOGD_ERROR, "cannot unlink %s: %d\n",
@@ -1078,9 +1086,12 @@ static int write_pidfile()
ulogd_log(ULOGD_FATAL,
"another ulogd already running with pid %d\n",
pid);
+ fclose(fp);
+ close(fd);
return -1;
}
+ close(fd);
fclose(fp);
unlink(ulogd_pidfile);
@@ -1094,16 +1105,42 @@ static int write_pidfile()
}
}
- if (lock_fd(fd) < 0) {
- ulogd_log(ULOGD_ERROR, "cannot lock %s: %d\n", ulogd_pidfile,
- errno);
+ if (lock_fd(fd, 0) < 0) {
+ ulogd_log(ULOGD_ERROR, "cannot lock %s: %s\n", ulogd_pidfile,
+ strerror(errno));
+ close(fd);
+ return -1;
+ }
+ ulogd_pidfile_fd = fd;
+ return 0;
+}
+
+static int write_pidfile(int daemonize)
+{
+ FILE *fp;
+ if (!ulogd_pidfile)
+ return 0;
+
+ if (ulogd_pidfile_fd == -1) {
+ ulogd_log(ULOGD_ERROR, "unset pid file fd\n");
return -1;
}
- fp = fdopen(fd, "w");
+ if (daemonize) {
+ /* relocking as lock is not inherited */
+ if (lock_fd(ulogd_pidfile_fd, 1) < 0) {
+ ulogd_log(ULOGD_ERROR, "cannot lock %s: %d\n", ulogd_pidfile,
+ errno);
+ close(ulogd_pidfile_fd);
+ return -1;
+ }
+ }
+
+ fp = fdopen(ulogd_pidfile_fd, "w");
if (fp == NULL) {
ulogd_log(ULOGD_ERROR, "cannot fdopen %s: %d\n", ulogd_pidfile,
errno);
+ close(ulogd_pidfile_fd);
return -1;
}
@@ -1118,7 +1155,7 @@ static int write_pidfile()
* We do NOT close fd, since we want to keep the lock. However, we don't
* want to keep the file descriptor in case of an exec().
*/
- fcntl(fd, F_SETFD, FD_CLOEXEC);
+ fcntl(ulogd_pidfile_fd, F_SETFD, FD_CLOEXEC);
created_pidfile = 1;
@@ -1350,6 +1387,11 @@ int main(int argc, char* argv[])
loglevel_ce.u.value = loglevel;
loglevel_ce.flag |= CONFIG_FLAG_VAL_PROTECTED;
+ if (ulogd_pidfile) {
+ if (create_pidfile() < 0)
+ warn_and_exit(0);
+ }
+
if (daemonize && verbose) {
verbose = 0;
ulogd_log(ULOGD_ERROR,
@@ -1421,8 +1463,8 @@ int main(int argc, char* argv[])
}
if (ulogd_pidfile) {
- if (write_pidfile() < 0)
- warn_and_exit(daemonize);
+ if (write_pidfile(daemonize) < 0)
+ warn_and_exit(0);
}
signal(SIGTERM, &sigterm_handler);
--
1.7.10.4
next prev parent reply other threads:[~2013-05-19 19:22 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-11 17:01 [PATCH 0/2] Introductions, some tweaks to ulogd Chris Boot
2013-05-11 17:01 ` [PATCH 1/2] ulogd: Perform nice() before giving up root Chris Boot
2013-05-17 7:34 ` Chris Boot
2013-05-17 8:28 ` Eric Leblond
2013-05-11 17:01 ` [PATCH 2/2] ulogd: Implement PID file writing Chris Boot
2013-05-11 19:21 ` Pablo Neira Ayuso
2013-05-11 20:27 ` Chris Boot
2013-05-12 0:48 ` Pablo Neira Ayuso
2013-05-12 8:11 ` Chris Boot
2013-05-12 9:34 ` Pablo Neira Ayuso
2013-05-12 9:38 ` Chris Boot
2013-05-12 10:50 ` Pablo Neira Ayuso
2013-05-12 19:34 ` Eric Leblond
2013-05-12 9:47 ` Eric Leblond
2013-05-12 10:08 ` Chris Boot
2013-05-12 10:49 ` Pablo Neira Ayuso
2013-05-12 9:53 ` Eric Leblond
2013-05-12 10:59 ` Chris Boot
2013-05-12 12:47 ` [PATCH v2] " Chris Boot
2013-05-17 7:33 ` Chris Boot
2013-05-19 19:19 ` Eric Leblond
2013-05-19 19:22 ` Eric Leblond [this message]
2013-05-22 9:22 ` [Ulogd PATCH] Improve pid file handling Chris Boot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1368991334-952-1-git-send-email-eric@regit.org \
--to=eric@regit.org \
--cc=netfilter-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.