X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Finstall.c;h=190c554347ac200f3d9462e82d94552e002fb5e5;hp=39f5dd2d2d999b72b99697c90a9710b1082f7db9;hb=cba2ef02722114da2b730d57f1e3bb43013d8921;hpb=0a327d753f992ffdcff5f38c861c90bfa1f5a4af diff --git a/src/shared/install.c b/src/shared/install.c index 39f5dd2d2..190c55434 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -47,9 +47,8 @@ typedef struct { #define _cleanup_install_context_done_ _cleanup_(install_context_done) -static int in_search_path(const char *path, char **search, const char *root_dir) { +static int in_search_path(const char *path, char **search) { _cleanup_free_ char *parent = NULL; - char **i; int r; assert(path); @@ -58,24 +57,7 @@ static int in_search_path(const char *path, char **search, const char *root_dir) if (r < 0) return r; - STRV_FOREACH(i, search) { - _cleanup_free_ char *buf = NULL; - const char *p; - - if (root_dir) { - buf = strjoin(root_dir, "/", *i, NULL); - if (!buf) - return -ENOMEM; - - p = buf; - } else - p = *i; - - if (path_equal(parent, p)) - return 1; - } - - return 0; + return strv_contains(search, parent); } static int lookup_paths_init_from_scope(LookupPaths *paths, @@ -178,12 +160,16 @@ static int add_file_change( if (!c[i].path) return -ENOMEM; + path_kill_slashes(c[i].path); + if (source) { c[i].source = strdup(source); if (!c[i].source) { free(c[i].path); return -ENOMEM; } + + path_kill_slashes(c[i].path); } else c[i].source = NULL; @@ -777,7 +763,7 @@ int unit_file_link( continue; } - q = in_search_path(*i, paths.unit_path, root_dir); + q = in_search_path(*i, paths.unit_path); if (q < 0) return q; @@ -1057,6 +1043,7 @@ static int unit_file_load( InstallContext *c, InstallInfo *info, const char *path, + const char *root_dir, bool allow_symlink) { const ConfigTableItem items[] = { @@ -1069,14 +1056,16 @@ static int unit_file_load( {} }; - int fd; _cleanup_fclose_ FILE *f = NULL; - int r; + int fd, r; assert(c); assert(info); assert(path); + if (!isempty(root_dir)) + path = strappenda3(root_dir, "/", path); + fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY|(allow_symlink ? 0 : O_NOFOLLOW)); if (fd < 0) return -errno; @@ -1111,30 +1100,19 @@ static int unit_file_search( assert(info); assert(paths); - if (info->path) { - const char *path; - - if (isempty(root_dir)) - path = info->path; - else - path = strappenda(root_dir, info->path); - - return unit_file_load(c, info, path, allow_symlink); - } + if (info->path) + return unit_file_load(c, info, info->path, root_dir, allow_symlink); assert(info->name); STRV_FOREACH(p, paths->unit_path) { _cleanup_free_ char *path = NULL; - if (isempty(root_dir)) - path = strjoin(*p, "/", info->name, NULL); - else - path = strjoin(root_dir, "/", *p, "/", info->name, NULL); + path = strjoin(*p, "/", info->name, NULL); if (!path) return -ENOMEM; - r = unit_file_load(c, info, path, allow_symlink); + r = unit_file_load(c, info, path, root_dir, allow_symlink); if (r >= 0) { info->path = path; path = NULL; @@ -1150,7 +1128,7 @@ static int unit_file_search( * enablement was requested. We will check if it is * possible to load template unit file. */ - _cleanup_free_ char *template = NULL, *template_dir = NULL; + _cleanup_free_ char *template = NULL; template = unit_name_template(info->name); if (!template) @@ -1159,14 +1137,11 @@ static int unit_file_search( STRV_FOREACH(p, paths->unit_path) { _cleanup_free_ char *path = NULL; - if (isempty(root_dir)) - path = strjoin(*p, "/", template, NULL); - else - path = strjoin(root_dir, "/", *p, "/", template, NULL); + path = strjoin(*p, "/", template, NULL); if (!path) return -ENOMEM; - r = unit_file_load(c, info, path, allow_symlink); + r = unit_file_load(c, info, path, root_dir, allow_symlink); if (r >= 0) { info->path = path; path = NULL; @@ -1359,7 +1334,7 @@ static int install_info_symlink_link( assert(config_path); assert(i->path); - r = in_search_path(i->path, paths->unit_path, root_dir); + r = in_search_path(i->path, paths->unit_path); if (r != 0) return r; @@ -1801,7 +1776,7 @@ UnitFileState unit_file_get_state( int unit_file_query_preset(UnitFileScope scope, const char *root_dir, const char *name) { _cleanup_strv_free_ char **files = NULL; - char **i; + char **p; int r; assert(scope >= 0); @@ -1829,17 +1804,10 @@ int unit_file_query_preset(UnitFileScope scope, const char *root_dir, const char if (r < 0) return r; - STRV_FOREACH(i, files) { - _cleanup_free_ char *buf = NULL; + STRV_FOREACH(p, files) { _cleanup_fclose_ FILE *f; - const char *p; - - if (root_dir) - p = buf = strjoin(root_dir, "/", *i, NULL); - else - p = *i; - f = fopen(p, "re"); + f = fopen(*p, "re"); if (!f) { if (errno == ENOENT) continue;