From 34203db00a4e68e7149275c9a8620afda7130a34 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 3 Apr 2024 09:39:44 +0200 Subject: [PATCH] patches/finit: backport upstream fixes to initctl Patches in queue for upcoming v4.8 release of Finit fixes: - initctl touch does not respect -n flag, returning error - initctl touch does not support template services Related to issue #375 Signed-off-by: Joachim Wiberg --- ...tctl-touch-does-not-respect-n-switch.patch | 41 ++++++++++ ...h-does-not-support-template-services.patch | 76 +++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 patches/finit/4.7/0008-initctl-touch-does-not-respect-n-switch.patch create mode 100644 patches/finit/4.7/0009-initctl-touch-does-not-support-template-services.patch diff --git a/patches/finit/4.7/0008-initctl-touch-does-not-respect-n-switch.patch b/patches/finit/4.7/0008-initctl-touch-does-not-respect-n-switch.patch new file mode 100644 index 00000000..970d95eb --- /dev/null +++ b/patches/finit/4.7/0008-initctl-touch-does-not-respect-n-switch.patch @@ -0,0 +1,41 @@ +From 052136cb9927379e75bc346d46c86d728f1e33ef Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Tue, 2 Apr 2024 16:03:31 +0200 +Subject: [PATCH 08/12] initctl: touch does not respect -n switch +Organization: Addiva Elektronik + +Fixes #402 + +Signed-off-by: Joachim Wiberg +--- + src/serv.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/serv.c b/src/serv.c +index e14d5ec..1cace46 100644 +--- a/src/serv.c ++++ b/src/serv.c +@@ -377,9 +377,9 @@ int serv_touch(char *arg) + fn = conf(path, sizeof(path), arg, 0); + if (!fexist(fn)) { + if (!strstr(arg, "finit.conf")) +- ERRX(72, "%s not available.", arg); ++ ERRX(noerr ? 0 : 72, "%s not available.", arg); + if (is_builtin(arg)) +- ERRX(4, "%s is a built-in service.", arg); ++ ERRX(noerr ? 0 : 4, "%s is a built-in service.", arg); + + strlcpy(path, finit_conf, sizeof(path)); + fn = path; +@@ -387,7 +387,7 @@ int serv_touch(char *arg) + + /* libite:touch() follows symlinks */ + if (utimensat(AT_FDCWD, fn, NULL, AT_SYMLINK_NOFOLLOW)) +- ERR(71, "failed marking %s for reload", fn); ++ ERR(noerr ? 0 : 71, "failed marking %s for reload", fn); + + return 0; + } +-- +2.34.1 + diff --git a/patches/finit/4.7/0009-initctl-touch-does-not-support-template-services.patch b/patches/finit/4.7/0009-initctl-touch-does-not-support-template-services.patch new file mode 100644 index 00000000..dec23730 --- /dev/null +++ b/patches/finit/4.7/0009-initctl-touch-does-not-support-template-services.patch @@ -0,0 +1,76 @@ +From 7b501f255b5730ce9da5c72aa6abd87bbf20ba11 Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Wed, 3 Apr 2024 06:46:18 +0200 +Subject: [PATCH 09/12] initctl: touch does not support template services +Organization: Addiva Elektronik + +Fixes #403 + +Signed-off-by: Joachim Wiberg +--- + src/serv.c | 10 ++++++++++ + src/util.h | 20 ++++++++++++++++++++ + 2 files changed, 30 insertions(+) + +diff --git a/src/serv.c b/src/serv.c +index 1cace46..6344ce3 100644 +--- a/src/serv.c ++++ b/src/serv.c +@@ -374,6 +374,15 @@ int serv_touch(char *arg) + return serv_list("enabled"); + } + ++ /* 1. Try /etc/finit.d/enabled/$arg.conf to handle template@.conf */ ++ paste(path, sizeof(path), finit_rcsd, "enabled/"); ++ strlcat(path, arg, sizeof(path)); ++ if (!suffix(path, sizeof(path), ".conf") && fexist(path)) { ++ fn = path; ++ goto touchit; ++ } ++ ++ /* 2. Try /etc/finit.d/available/$arg.conf and other combos (legacy) */ + fn = conf(path, sizeof(path), arg, 0); + if (!fexist(fn)) { + if (!strstr(arg, "finit.conf")) +@@ -385,6 +394,7 @@ int serv_touch(char *arg) + fn = path; + } + ++touchit: + /* libite:touch() follows symlinks */ + if (utimensat(AT_FDCWD, fn, NULL, AT_SYMLINK_NOFOLLOW)) + ERR(noerr ? 0 : 71, "failed marking %s for reload", fn); +diff --git a/src/util.h b/src/util.h +index 9f0cbf0..80e1c51 100644 +--- a/src/util.h ++++ b/src/util.h +@@ -109,6 +109,26 @@ static inline int paste(char *buf, size_t len, const char *dir, const char *file + fisslashdir(dir) ? "" : file[0] == '/' ? "" : "/", file); + } + ++/* ensure path has suffix */ ++static inline int suffix(char *path, size_t len, const char *sfx) ++{ ++ size_t slen = strlen(sfx); ++ size_t plen = strlen(path); ++ ++ if (plen < slen) ++ slen = strlcat(path, sfx, len); ++ else { ++ plen -= slen; ++ if (strcmp(&path[plen], sfx)) ++ slen = strlcat(path, sfx, len); ++ } ++ ++ if (slen >= len) ++ return -1; ++ ++ return 0; ++} ++ + #endif /* FINIT_UTIL_H_ */ + + /** +-- +2.34.1 +