}
}
+ 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)) {
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)) {
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;
}
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;
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);