Add support for multiple if:!foo,!bar to skip loading of service

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg
2023-10-30 19:25:10 +01:00
parent 304a096877
commit c886ecb5cc
2 changed files with 33 additions and 25 deletions
+30 -22
View File
@@ -710,6 +710,7 @@ int svc_conflicts(svc_t *svc)
*/
int svc_ifthen(int is_conf, const char *ident, char *stmt)
{
char stmts[MAX_IDENT_LEN];
int not = 0;
svc_t *svc;
@@ -724,39 +725,46 @@ int svc_ifthen(int is_conf, const char *ident, char *stmt)
if (is_conf)
return 1;
if (stmt[0] == '!') {
stmt++;
not++;
}
while (ptr[i] != '>' && ptr[i] != 0)
i++;
ptr[i] = 0;
cond = cond_get(stmt);
if (not && cond == COND_ON)
return 0;
if (!not && cond == COND_OFF)
return 0;
strlcpy(stmts, stmt, sizeof(stmts));
for (stmt = strtok(stmts, ","); stmt; stmt = strtok(NULL, ","), not = 0) {
if (stmt[0] == '!') {
stmt++;
not++;
}
cond = cond_get(stmt);
if (not && cond == COND_ON)
return 0;
if (!not && cond == COND_OFF)
return 0;
}
return 1;
}
if (!is_conf)
return 1;
if (stmt[0] == '!') {
stmt++;
not++;
}
strlcpy(stmts, stmt, sizeof(stmts));
for (stmt = strtok(stmts, ","); stmt; stmt = strtok(NULL, ","), not = 0) {
if (stmt[0] == '!') {
stmt++;
not++;
}
svc = svc_find_by_str(stmt);
if (not && svc) {
logit(LOG_NOTICE, "skipping %s, %s already loaded.", ident, svc_ident(svc, NULL, 0));
return 0;
}
if (!not && !svc) {
logit(LOG_NOTICE, "skipping %s, %s not available.", ident, stmt);
return 0;
svc = svc_find_by_str(stmt);
if (not && svc) {
logit(LOG_NOTICE, "skipping %s, %s already loaded.", ident, svc_ident(svc, NULL, 0));
return 0;
}
if (!not && !svc) {
logit(LOG_NOTICE, "skipping %s, %s not available.", ident, stmt);
return 0;
}
}
return 1;
+3 -3
View File
@@ -34,7 +34,7 @@ run nowarn if:udevd cgroup.init :5 [S] <pid/udevd> log udevadm settle -t 30
# <run/coldplug/success> (same as for plain mdev below) can be relied on as a
# barrier for services that, e.g., need to probe for switchcore ports or PHYs
# that require firmware loading before they show up.
service nowarn conflict:udevd,mdev cgroup.init \
service nowarn conflict:udevd,mdev cgroup.init if:!udevd \
[S12345789] notify:s6 mdevd -O 4 -D %n -- Device event daemon (mdevd)
run nowarn conflict:udevd,mdev cgroup.init name:coldplug <service/mdevd/ready> \
[S] mdevd-coldplug -- Cold plugging system
@@ -42,12 +42,12 @@ run nowarn conflict:udevd,mdev cgroup.init name:coldplug <service/mdevd/read
# If neither udevd or mdevd are available, fall back to mdev. The new daemon
# mode calls `mdev -s` internally but does not create a PID file when that is
# done, so synchronization with coldplug is fragile.
service nowarn conflict:udevd,mdevd cgroup.init if:!mdevd \
service nowarn conflict:udevd,mdevd cgroup.init if:!udevd,!mdevd \
[S12345789] mdev -df -S -- Device event daemon (mdev)
# Trigger a replay of all uevents from boot, before userspace was up and the
# filesystem mounted. Compared to udevd, we don't know when 'mdev -df' has
# finished processing all events, i.e., depending on <run/coldplug/success> is
# not an indicator of all devices having been (re)discovered and fully set up.
run nowarn conflict:udevd,mdevd cgroup.init name:coldplug if:!mdevd <service/mdev/running> \
run nowarn conflict:udevd,mdevd cgroup.init name:coldplug if:mdev <service/mdev/running> \
[S] @pkglibexecdir@/coldplug -- Cold plugging system