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->sysvinit_path);
|
||||
strv_uniq(m->sysvrcnd_path);
|
||||
|
||||
assert(!strv_isempty(m->unit_path));
|
||||
if (!(t = strv_join(m->unit_path, "\n\t")))
|
||||
return -ENOMEM;
|
||||
log_debug("Looking for unit files in:\n\t%s", t);
|
||||
free(t);
|
||||
if (!strv_isempty(m->unit_path)) {
|
||||
|
||||
if (!(t = strv_join(m->unit_path, "\n\t")))
|
||||
return -ENOMEM;
|
||||
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)) {
|
||||
|
||||
|
@ -300,8 +318,11 @@ static int manager_find_paths(Manager *m) {
|
|||
|
||||
log_debug("Looking for SysV init scripts in:\n\t%s", t);
|
||||
free(t);
|
||||
} else
|
||||
} else {
|
||||
log_debug("Ignoring SysV init scripts.");
|
||||
strv_free(m->sysvinit_path);
|
||||
m->sysvinit_path = NULL;
|
||||
}
|
||||
|
||||
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);
|
||||
free(t);
|
||||
} else
|
||||
} else {
|
||||
log_debug("Ignoring SysV rcN.d links.");
|
||||
strv_free(m->sysvrcnd_path);
|
||||
m->sysvrcnd_path = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
45
src/util.c
45
src/util.c
|
@ -652,6 +652,51 @@ char **strv_path_make_absolute_cwd(char **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 sig;
|
||||
|
||||
|
|
|
@ -138,7 +138,9 @@ bool is_path(const char *p);
|
|||
bool path_is_absolute(const char *p);
|
||||
char *path_make_absolute(const char *p, const char *prefix);
|
||||
char *path_make_absolute_cwd(const char *p);
|
||||
|
||||
char **strv_path_make_absolute_cwd(char **l);
|
||||
char **strv_path_canonicalize(char **l);
|
||||
|
||||
int reset_all_signal_handlers(void);
|
||||
|
||||
|
|
Loading…
Reference in New Issue