manager: canonicalize search paths and filter out non-existing paths and those pointing to the same fs directory
This commit is contained in:
parent
9a34ec5fbb
commit
c3f6d6757a
|
@ -283,15 +283,33 @@ static int manager_find_paths(Manager *m) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m->unit_path)
|
||||||
|
if (!strv_path_canonicalize(m->unit_path))
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
if (m->sysvinit_path)
|
||||||
|
if (!strv_path_canonicalize(m->sysvinit_path))
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
if (m->sysvrcnd_path)
|
||||||
|
if (!strv_path_canonicalize(m->sysvrcnd_path))
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
strv_uniq(m->unit_path);
|
strv_uniq(m->unit_path);
|
||||||
strv_uniq(m->sysvinit_path);
|
strv_uniq(m->sysvinit_path);
|
||||||
strv_uniq(m->sysvrcnd_path);
|
strv_uniq(m->sysvrcnd_path);
|
||||||
|
|
||||||
assert(!strv_isempty(m->unit_path));
|
if (!strv_isempty(m->unit_path)) {
|
||||||
if (!(t = strv_join(m->unit_path, "\n\t")))
|
|
||||||
return -ENOMEM;
|
if (!(t = strv_join(m->unit_path, "\n\t")))
|
||||||
log_debug("Looking for unit files in:\n\t%s", t);
|
return -ENOMEM;
|
||||||
free(t);
|
log_debug("Looking for unit files in:\n\t%s", t);
|
||||||
|
free(t);
|
||||||
|
} else {
|
||||||
|
log_debug("Ignoring unit files.");
|
||||||
|
strv_free(m->unit_path);
|
||||||
|
m->unit_path = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!strv_isempty(m->sysvinit_path)) {
|
if (!strv_isempty(m->sysvinit_path)) {
|
||||||
|
|
||||||
|
@ -300,8 +318,11 @@ static int manager_find_paths(Manager *m) {
|
||||||
|
|
||||||
log_debug("Looking for SysV init scripts in:\n\t%s", t);
|
log_debug("Looking for SysV init scripts in:\n\t%s", t);
|
||||||
free(t);
|
free(t);
|
||||||
} else
|
} else {
|
||||||
log_debug("Ignoring SysV init scripts.");
|
log_debug("Ignoring SysV init scripts.");
|
||||||
|
strv_free(m->sysvinit_path);
|
||||||
|
m->sysvinit_path = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (!strv_isempty(m->sysvrcnd_path)) {
|
if (!strv_isempty(m->sysvrcnd_path)) {
|
||||||
|
|
||||||
|
@ -310,8 +331,11 @@ static int manager_find_paths(Manager *m) {
|
||||||
|
|
||||||
log_debug("Looking for SysV rcN.d links in:\n\t%s", t);
|
log_debug("Looking for SysV rcN.d links in:\n\t%s", t);
|
||||||
free(t);
|
free(t);
|
||||||
} else
|
} else {
|
||||||
log_debug("Ignoring SysV rcN.d links.");
|
log_debug("Ignoring SysV rcN.d links.");
|
||||||
|
strv_free(m->sysvrcnd_path);
|
||||||
|
m->sysvrcnd_path = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
45
src/util.c
45
src/util.c
|
@ -652,6 +652,51 @@ char **strv_path_make_absolute_cwd(char **l) {
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char **strv_path_canonicalize(char **l) {
|
||||||
|
char **s;
|
||||||
|
unsigned k = 0;
|
||||||
|
bool enomem = false;
|
||||||
|
|
||||||
|
if (strv_isempty(l))
|
||||||
|
return l;
|
||||||
|
|
||||||
|
/* Goes through every item in the string list and canonicalize
|
||||||
|
* the path. This works in place and won't rollback any
|
||||||
|
* changes on failure. */
|
||||||
|
|
||||||
|
STRV_FOREACH(s, l) {
|
||||||
|
char *t, *u;
|
||||||
|
|
||||||
|
t = path_make_absolute_cwd(*s);
|
||||||
|
free(*s);
|
||||||
|
|
||||||
|
if (!t) {
|
||||||
|
enomem = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
u = canonicalize_file_name(t);
|
||||||
|
free(t);
|
||||||
|
|
||||||
|
if (!u) {
|
||||||
|
if (errno == ENOMEM || !errno)
|
||||||
|
enomem = true;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
l[k++] = u;
|
||||||
|
}
|
||||||
|
|
||||||
|
l[k] = NULL;
|
||||||
|
|
||||||
|
if (enomem)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
int reset_all_signal_handlers(void) {
|
int reset_all_signal_handlers(void) {
|
||||||
int sig;
|
int sig;
|
||||||
|
|
||||||
|
|
|
@ -138,7 +138,9 @@ bool is_path(const char *p);
|
||||||
bool path_is_absolute(const char *p);
|
bool path_is_absolute(const char *p);
|
||||||
char *path_make_absolute(const char *p, const char *prefix);
|
char *path_make_absolute(const char *p, const char *prefix);
|
||||||
char *path_make_absolute_cwd(const char *p);
|
char *path_make_absolute_cwd(const char *p);
|
||||||
|
|
||||||
char **strv_path_make_absolute_cwd(char **l);
|
char **strv_path_make_absolute_cwd(char **l);
|
||||||
|
char **strv_path_canonicalize(char **l);
|
||||||
|
|
||||||
int reset_all_signal_handlers(void);
|
int reset_all_signal_handlers(void);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue