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