* reached by a symlink. The old string will be freed. */
for (;;) {
- char *target, *k, *name;
+ char *target, *name;
if (c++ >= FOLLOW_MAX)
return -ELOOP;
return -errno;
/* Hmm, so this is a symlink. Let's read the name, and follow it manually */
- if ((r = readlink_malloc(*filename, &target)) < 0)
+ if ((r = readlink_and_make_absolute(*filename, &target)) < 0)
return r;
- k = file_in_same_dir(*filename, target);
- free(target);
-
- if (!k)
- return -ENOMEM;
-
free(*filename);
- *filename = k;
+ *filename = target;
}
if (!(f = fdopen(fd, "r"))) {
{ "DirectoryNotEmpty", config_parse_path_spec, &u->path, "Path" },
{ "Unit", config_parse_path_unit, &u->path, "Path" },
+ /* The [Install] section is ignored here. */
+ { "Alias", NULL, NULL, "Install" },
+ { "WantedBy", NULL, NULL, "Install" },
+ { "Also", NULL, NULL, "Install" },
+
{ NULL, NULL, NULL, NULL }
};
#undef EXEC_CONTEXT_CONFIG_ITEMS
- const char *sections[3];
- char *k;
+ const char *sections[4];
int r;
Set *symlink_names;
FILE *f = NULL;
sections[0] = "Unit";
sections[1] = section_table[u->meta.type];
- sections[2] = NULL;
+ sections[2] = "Install";
+ sections[3] = NULL;
if (!(symlink_names = set_new(string_hash_func, string_compare_func)))
return -ENOMEM;
} else {
char **p;
- STRV_FOREACH(p, u->meta.manager->unit_path) {
+ STRV_FOREACH(p, u->meta.manager->lookup_paths.unit_path) {
/* Instead of opening the path right away, we manually
* follow all symlinks and add their name to our unit
}
/* Now, parse the file contents */
- if ((r = config_parse(filename, f, sections, items, u)) < 0)
+ if ((r = config_parse(filename, f, sections, items, false, u)) < 0)
goto finish;
free(u->meta.fragment_path);
r = 0;
finish:
- while ((k = set_steal_first(symlink_names)))
- free(k);
-
- set_free(symlink_names);
+ set_free_free(symlink_names);
free(filename);
if (f)