From dd6ebc3b65e5839d796a8f24a9b3ce79e8affc00 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 23 Feb 2021 20:26:57 +0100 Subject: [PATCH] Drop svc pidfile matching, only match against PID in pidfile With the redesign from to in d1fac6f we moved to matching svc_t only against their PID, which could pop up in any *.pid or */pid in /var/run. This patch drops the (hopefully) last remnants of the old legacy. To ensure we don't try reading the PID value from socket files, like /var/run/initctl, we add simple fnmatch() of the inotified file. Two calls to fnmatch(), for portability reasons, not every system has GNU libc extensions like FNM_EXTMATCH. Signed-off-by: Joachim Wiberg --- plugins/pidfile.c | 4 ++++ src/svc.c | 27 ++++----------------------- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/plugins/pidfile.c b/plugins/pidfile.c index 753ba07a..88bfce66 100644 --- a/plugins/pidfile.c +++ b/plugins/pidfile.c @@ -22,6 +22,7 @@ * THE SOFTWARE. */ +#include #include #include #include @@ -69,6 +70,9 @@ static void pidfile_update_conds(char *dir, char *name, uint32_t mask) _d("Got dir: %s, name: %s, mask: %08x", dir, name, mask); snprintf(fn, sizeof(fn), "%s/%s", dir, name); + if (fnmatch("*\\.pid", fn, 0) && fnmatch("*/pid", fn, 0)) + return; + svc = svc_find_by_pidfile(fn); if (!svc) { _d("No matching svc for %s", fn); diff --git a/src/svc.c b/src/svc.c index 61b0efa7..b3eb29a0 100644 --- a/src/svc.c +++ b/src/svc.c @@ -395,7 +395,7 @@ svc_t *svc_find_by_nameid(char *name, char *id) } /** - * svc_find_by_plidfile - Find an service object by its PID file + * svc_find_by_plidfile - Find a service by its PID file * @fn: PID file, can be absolute path or relative to /run * * This function is primarily used by the pidfile plugin to track the @@ -412,32 +412,13 @@ svc_t *svc_find_by_nameid(char *name, char *id) svc_t *svc_find_by_pidfile(char *fn) { svc_t *svc, *iter = NULL; - char adjpath[strlen(fn) + 10]; /* + sizeof("/var/run/") */ - char fnpath[PATH_MAX]; + pid_t pid; - pid_runpath(fn, adjpath, sizeof(adjpath)); - if (!realpath(adjpath, fnpath)) { - if (errno != ENOENT) - _pe("adjpath: %s, errno %d", adjpath, errno); + pid = pid_file_read(fn); + if (pid == -1) return NULL; - } for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) { - char path[PATH_MAX]; - char *pidfn; - pid_t pid; - - pidfn = pid_file(svc); - if (!pidfn || !realpath(pidfn, path)) { - if (errno != ENOENT) - _pe("pidfn: %s, errno %d", pidfn ?: "", errno); - continue; - } - - if (!string_compare(fnpath, path)) - continue; - - pid = pid_file_read(path); if (svc->pid != pid) continue;