From: Chris Boot <bootc@bootc.net>
To: Eric Leblond <eric@regit.org>
Cc: netfilter-devel@vger.kernel.org
Subject: Re: [Ulogd PATCH] Improve pid file handling.
Date: Wed, 22 May 2013 10:22:18 +0100 [thread overview]
Message-ID: <519C8E4A.60405@bootc.net> (raw)
In-Reply-To: <1368991334-952-1-git-send-email-eric@regit.org>
On 19/05/13 20:22, Eric Leblond wrote:
> 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);
>
Hi Eric,
I have been testing ulogd with your patch on top for some time now, and
it looks good. Thanks for the comments, review and your follow-up patch
- they are much appreciated.
Best regards,
Chris
--
Chris Boot
bootc@bootc.net
prev parent reply other threads:[~2013-05-22 9: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 ` [Ulogd PATCH] Improve pid file handling Eric Leblond
2013-05-22 9:22 ` Chris Boot [this message]
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=519C8E4A.60405@bootc.net \
--to=bootc@bootc.net \
--cc=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.