From d6ea1c0cabfcac34f347004c3539458a2757cca4 Mon Sep 17 00:00:00 2001 From: Joachim Nilsson Date: Sat, 23 Dec 2017 21:57:28 +0100 Subject: [PATCH] Protect internal services like dbus-daemon and udevd In f3669c7 the difference between static and dynamic services was removed. This led to a regression in handling internally created services for, e.g., dbus-daemon and udevd, mentioned in issue #90. This patch introduces a "protected" flag for svc_t to prevent the mark-and-sweep handling of regularly loaded services. Signed-off-by: Joachim Nilsson --- src/service.c | 3 +++ src/svc.c | 6 +++++- src/svc.h | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/service.c b/src/service.c index 74fb9410..920dd0de 100644 --- a/src/service.c +++ b/src/service.c @@ -732,6 +732,9 @@ recreate: else svc_mark_clean(svc); + if (!file) + svc->protected = 1; + /* Free duped line, from above */ free(line); return 0; diff --git a/src/svc.c b/src/svc.c index d5c1a01d..668754c4 100644 --- a/src/svc.c +++ b/src/svc.c @@ -356,8 +356,12 @@ void svc_mark_dynamic(void) { svc_t *svc, *iter = NULL; - for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) + for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) { + if (svc->protected) + continue; + *((int *)&svc->dirty) = -1; + } } void svc_mark_dirty(svc_t *svc) diff --git a/src/svc.h b/src/svc.h index 6242b770..63790a95 100644 --- a/src/svc.h +++ b/src/svc.h @@ -92,6 +92,7 @@ typedef struct svc { pid_t pid; const svc_state_t state; /* Paused, Reloading, Restart, Running, ... */ svc_type_t type; /* Service, run, task, inetd, ... */ + int protected; /* Services like dbus-daemon & udev by Finit */ const int dirty; /* -1: removal, 0: unmodified, 1: modified */ int starting; /* ... waiting for pidfile to be re-asserted */ int runlevels;