X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Finstall.c;h=a2f84f893e43255f7ce674d2f6e09fc1a193eb9a;hb=28622e8f5b28412d97bf2f3a5df49c419be1e2c5;hp=39f5dd2d2d999b72b99697c90a9710b1082f7db9;hpb=0a327d753f992ffdcff5f38c861c90bfa1f5a4af;p=elogind.git diff --git a/src/shared/install.c b/src/shared/install.c index 39f5dd2d2..a2f84f893 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; @@ -1087,7 +1076,10 @@ static int unit_file_load( return -ENOMEM; } - r = config_parse(NULL, path, f, NULL, config_item_table_lookup, (void*) items, true, true, info); + r = config_parse(NULL, path, f, + NULL, + config_item_table_lookup, items, + true, true, false, info); if (r < 0) return r; @@ -1111,30 +1103,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 +1131,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 +1140,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 +1337,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 +1779,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 +1807,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; @@ -1906,7 +1877,7 @@ int unit_file_preset( assert(scope >= 0); assert(scope < _UNIT_FILE_SCOPE_MAX); - assert(mode < _UNIT_FILE_PRESET_MODE_MAX); + assert(mode < _UNIT_FILE_PRESET_MAX); r = lookup_paths_init_from_scope(&paths, scope, root_dir); if (r < 0) @@ -1974,7 +1945,7 @@ int unit_file_preset_all( assert(scope >= 0); assert(scope < _UNIT_FILE_SCOPE_MAX); - assert(mode < _UNIT_FILE_PRESET_MODE_MAX); + assert(mode < _UNIT_FILE_PRESET_MAX); r = lookup_paths_init_from_scope(&paths, scope, root_dir); if (r < 0) @@ -2211,7 +2182,7 @@ static const char* const unit_file_change_type_table[_UNIT_FILE_CHANGE_TYPE_MAX] DEFINE_STRING_TABLE_LOOKUP(unit_file_change_type, UnitFileChangeType); -static const char* const unit_file_preset_mode_table[_UNIT_FILE_PRESET_MODE_MAX] = { +static const char* const unit_file_preset_mode_table[_UNIT_FILE_PRESET_MAX] = { [UNIT_FILE_PRESET_FULL] = "full", [UNIT_FILE_PRESET_ENABLE_ONLY] = "enable-only", [UNIT_FILE_PRESET_DISABLE_ONLY] = "disable-only",