Warn if a new service asserts the same condition as an existing one

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg committed 2021-02-13 12:07:20 +01:00
1 parent b175b4a2ae
commit 5fbcf6814c
3 files changed
+37 -3

No files matched your search

+5 -3
View File
@@ -403,7 +403,7 @@ static int service_start(svc_t *svc)
if (strlen(arg) < (sizeof(buf) - strlen(buf))) if (strlen(arg) < (sizeof(buf) - strlen(buf)))
strlcat(buf, arg, sizeof(buf)); strlcat(buf, arg, sizeof(buf));
} }
_d("Starting %s: %s", svc->cmd, buf); _d("Starting %s %s", svc->cmd, buf);
} }
logit(LOG_CONSOLE | LOG_NOTICE, "Starting %s[%d]", svc_ident(svc, NULL, 0), pid); logit(LOG_CONSOLE | LOG_NOTICE, "Starting %s[%d]", svc_ident(svc, NULL, 0), pid);
@@ -704,6 +704,9 @@ static void parse_name(svc_t *svc, char *arg)
} }
strlcpy(svc->name, name, sizeof(svc->name)); strlcpy(svc->name, name, sizeof(svc->name));
/* Warn if svc generates same condition as an existing service */
svc_validate(svc);
} }
/** /**
@@ -888,9 +891,8 @@ int service_register(int type, char *cfg, struct rlimit rlimit[], char *file)
return errno = ENOMEM; return errno = ENOMEM;
} }
if (type == SVC_TYPE_SERVICE && manual) { if (type == SVC_TYPE_SERVICE && manual)
svc_stop(svc); svc_stop(svc);
}
} }
/* Always clear svc PID file, for now. See TODO */ /* Always clear svc PID file, for now. See TODO */
+31
View File
@@ -141,6 +141,37 @@ int svc_del(svc_t *svc)
return 0; return 0;
} }
/**
* svc_validate - Check if service asserts same condition as another service
* @svc: Pointer to an &svc_t object
*
* Logs to syslog if there is a name clash with existing services.
*/
void svc_validate(svc_t *svc)
{
char ident[MAX_IDENT_LEN];
char cond[MAX_COND_LEN];
svc_t *iter = NULL;
svc_t *s;
mkcond(svc, cond, sizeof(cond));
svc_ident(svc, ident, sizeof(ident));
for (s = svc_iterator(&iter, 1); s; s = svc_iterator(&iter, 0)) {
char c[MAX_COND_LEN];
if (s == svc)
continue;
mkcond(s, c, sizeof(c));
if (!string_compare(cond, c))
continue;
logit(LOG_WARNING, "%s (%s) asserts the same condition as %s (%s) => %s",
svc->cmd, ident, s->cmd, svc_ident(s, NULL, 0), c);
}
}
/** /**
* svc_iterator - Naive iterator over all registered services. * svc_iterator - Naive iterator over all registered services.
* @iter: Iterator, must be a valid pointer * @iter: Iterator, must be a valid pointer
+1
View File
@@ -148,6 +148,7 @@ typedef struct svc {
svc_t *svc_new (char *cmd, char *id, int type); svc_t *svc_new (char *cmd, char *id, int type);
int svc_del (svc_t *svc); int svc_del (svc_t *svc);
void svc_validate (svc_t *svc);
svc_t *svc_find (char *cmd, char *id); svc_t *svc_find (char *cmd, char *id);
svc_t *svc_find_by_pid (pid_t pid); svc_t *svc_find_by_pid (pid_t pid);