manager: canonicalize search paths and filter out non-existing paths and those pointing to the same fs directory

This commit is contained in:
Lennart Poettering 2010-05-22 03:30:46 +02:00
parent 9a34ec5fbb
commit c3f6d6757a
3 changed files with 78 additions and 7 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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);