From e1b87d707f0d16b6c6d4d808a49f7f69de09f169 Mon Sep 17 00:00:00 2001 From: Joachim Nilsson Date: Sat, 13 Jan 2018 22:00:04 +0100 Subject: [PATCH] Support touching custom PID files Signed-off-by: Joachim Nilsson --- src/service.c | 16 +++++++++++++++- src/svc.h | 11 ++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/service.c b/src/service.c index 79f1f7ac..8efd9673 100644 --- a/src/service.c +++ b/src/service.c @@ -25,6 +25,7 @@ #include "config.h" /* Generated by configure script */ #include /* isblank() */ +#include /* sched_yield() */ #include #include #include @@ -430,6 +431,8 @@ static int service_stop(svc_t *svc) */ static int service_restart(svc_t *svc) { + int rc; + /* Ignore if finit is SIGSTOP'ed */ if (is_norespawn()) return 1; @@ -449,7 +452,15 @@ static int service_restart(svc_t *svc) svc_starting(svc); _d("Sending SIGHUP to PID %d", svc->pid); - return print_result(kill(svc->pid, SIGHUP)); + rc = kill(svc->pid, SIGHUP); + + /* Service does not maintain a PID file on its own */ + if (svc_has_pidfile(svc)) { + sched_yield(); + touch(pid_file(svc)); + } + + return print_result(rc); } /** @@ -686,6 +697,9 @@ recreate: if (desc) strlcpy(svc->desc, desc, sizeof(svc->desc)); + /* Always clear svc PID file, for now. See TODO */ + svc->pidfile[0] = 0; + /* Decode any optional pid:/optional/path/to/file.pid */ if (pid && svc_is_daemon(svc) && pid_file_parse(svc, pid)) _e("Invalid 'pid' argument to service: %s", pid); diff --git a/src/svc.h b/src/svc.h index 086381c4..a91b7d4d 100644 --- a/src/svc.h +++ b/src/svc.h @@ -162,8 +162,14 @@ int svc_is_unique (svc_t *svc); int svc_parse_jobstr (char *str, size_t len, int (*found)(svc_t *), int (not_found)(char *, int)); +static inline int svc_is_inetd (svc_t *svc) { return svc && SVC_TYPE_INETD == svc->type; } +static inline int svc_is_inetd_conn(svc_t *svc) { return svc && SVC_TYPE_INETD_CONN == svc->type; } +static inline int svc_is_daemon (svc_t *svc) { return svc && SVC_TYPE_SERVICE == svc->type; } +static inline int svc_is_runtask (svc_t *svc) { return svc && (SVC_TYPE_RUNTASK & svc->type); } + static inline int svc_in_runlevel (svc_t *svc, int runlevel) { return svc && ISSET(svc->runlevels, runlevel); } static inline int svc_has_sighup (svc_t *svc) { return svc && 0 != svc->sighup; } +static inline int svc_has_pidfile (svc_t *svc) { return svc_is_daemon(svc) && svc->pidfile[0] != 0 && svc->pidfile[0] != '!'; } static inline void svc_starting (svc_t *svc) { svc->starting = 1; } static inline void svc_started (svc_t *svc) { svc->starting = 0; } @@ -173,11 +179,6 @@ static inline int svc_is_removed (svc_t *svc) { return svc && -1 == svc->dirty static inline int svc_is_changed (svc_t *svc) { return svc && 0 != svc->dirty; } static inline int svc_is_updated (svc_t *svc) { return svc && 1 == svc->dirty; } -static inline int svc_is_inetd (svc_t *svc) { return svc && SVC_TYPE_INETD == svc->type; } -static inline int svc_is_inetd_conn(svc_t *svc) { return svc && SVC_TYPE_INETD_CONN == svc->type; } -static inline int svc_is_daemon (svc_t *svc) { return svc && SVC_TYPE_SERVICE == svc->type; } -static inline int svc_is_runtask (svc_t *svc) { return svc && (SVC_TYPE_RUNTASK & svc->type); } - static inline int svc_is_blocked (svc_t *svc) { return svc->block != SVC_BLOCK_NONE; } static inline int svc_is_busy (svc_t *svc) { return svc->block == SVC_BLOCK_BUSY; } static inline void svc_unblock (svc_t *svc) { svc->block = SVC_BLOCK_NONE; }