diff options
Diffstat (limited to 'src/shared/install.c')
-rw-r--r-- | src/shared/install.c | 197 |
1 files changed, 67 insertions, 130 deletions
diff --git a/src/shared/install.c b/src/shared/install.c index b7d1d22505..e1e7c39f6e 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -101,9 +101,10 @@ static int get_config_path(UnitFileScope scope, bool runtime, const char *root_d r = user_runtime_dir(&p); else r = user_config_home(&p); - - if (r <= 0) - return r < 0 ? r : -ENOENT; + if (r < 0) + return r; + if (r == 0) + return -ENOENT; break; @@ -138,8 +139,10 @@ static int mark_symlink_for_removal( path_kill_slashes(n); r = set_consume(*remove_symlinks_to, n); + if (r == -EEXIST) + return 0; if (r < 0) - return r == -EEXIST ? 0 : r; + return r; return 0; } @@ -155,6 +158,7 @@ static int remove_marked_symlinks_fd( char** instance_whitelist) { _cleanup_closedir_ DIR *d = NULL; + struct dirent *de; int r = 0; assert(remove_symlinks_to); @@ -171,27 +175,13 @@ static int remove_marked_symlinks_fd( rewinddir(d); - for (;;) { - struct dirent *de; - - errno = 0; - de = readdir(d); - if (!de && errno != 0) { - r = -errno; - break; - } - - if (!de) - break; - - if (hidden_file(de->d_name)) - continue; + FOREACH_DIRENT(de, d, return -errno) { dirent_ensure_type(d, de); if (de->d_type == DT_DIR) { - int nfd, q; _cleanup_free_ char *p = NULL; + int nfd, q; nfd = openat(fd, de->d_name, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW); if (nfd < 0) { @@ -295,8 +285,8 @@ static int remove_marked_symlinks( char** instance_whitelist) { _cleanup_close_ int fd = -1; - int r = 0; bool deleted; + int r = 0; assert(config_path); @@ -312,10 +302,8 @@ static int remove_marked_symlinks( deleted = false; cfd = fcntl(fd, F_DUPFD_CLOEXEC, 3); - if (cfd < 0) { - r = -errno; - break; - } + if (cfd < 0) + return -errno; /* This takes possession of cfd and closes it */ q = remove_marked_symlinks_fd(remove_symlinks_to, cfd, config_path, config_path, &deleted, changes, n_changes, instance_whitelist); @@ -333,8 +321,9 @@ static int find_symlinks_fd( const char *config_path, bool *same_name_link) { - int r = 0; _cleanup_closedir_ DIR *d = NULL; + struct dirent *de; + int r = 0; assert(name); assert(fd >= 0); @@ -348,25 +337,13 @@ static int find_symlinks_fd( return -errno; } - for (;;) { - struct dirent *de; - - errno = 0; - de = readdir(d); - if (!de && errno != 0) - return -errno; - - if (!de) - return r; - - if (hidden_file(de->d_name)) - continue; + FOREACH_DIRENT(de, d, return -errno) { dirent_ensure_type(d, de); if (de->d_type == DT_DIR) { - int nfd, q; _cleanup_free_ char *p = NULL; + int nfd, q; nfd = openat(fd, de->d_name, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW); if (nfd < 0) { @@ -403,10 +380,9 @@ static int find_symlinks_fd( /* Acquire symlink destination */ q = readlink_and_canonicalize(p, &dest); + if (q == -ENOENT) + continue; if (q < 0) { - if (q == -ENOENT) - continue; - if (r == 0) r = q; continue; @@ -444,6 +420,8 @@ static int find_symlinks_fd( return 1; } } + + return r; } static int find_symlinks( @@ -530,8 +508,8 @@ int unit_file_mask( UnitFileChange **changes, unsigned *n_changes) { - char **i; _cleanup_free_ char *prefix = NULL; + char **i; int r; assert(scope >= 0); @@ -551,10 +529,8 @@ int unit_file_mask( } path = path_make_absolute(*i, prefix); - if (!path) { - r = -ENOMEM; - break; - } + if (!path) + return -ENOMEM; if (symlink("/dev/null", path) >= 0) { unit_file_changes_add(changes, n_changes, UNIT_FILE_SYMLINK, path, "/dev/null"); @@ -593,16 +569,17 @@ int unit_file_unmask( UnitFileChange **changes, unsigned *n_changes) { - char **i, *config_path = NULL; + _cleanup_set_free_free_ Set *remove_symlinks_to = NULL; + _cleanup_free_ char *config_path = NULL; + char **i; int r, q; - Set *remove_symlinks_to = NULL; assert(scope >= 0); assert(scope < _UNIT_FILE_SCOPE_MAX); r = get_config_path(scope, runtime, root_dir, &config_path); if (r < 0) - goto finish; + return r; STRV_FOREACH(i, files) { _cleanup_free_ char *path = NULL; @@ -614,10 +591,8 @@ int unit_file_unmask( } path = path_make_absolute(*i, config_path); - if (!path) { - r = -ENOMEM; - break; - } + if (!path) + return -ENOMEM; q = null_or_empty_path(path); if (q > 0) { @@ -633,15 +608,10 @@ int unit_file_unmask( r = q; } - -finish: q = remove_marked_symlinks(remove_symlinks_to, config_path, changes, n_changes, files); if (r == 0) r = q; - set_free_free(remove_symlinks_to); - free(config_path); - return r; } @@ -655,8 +625,8 @@ int unit_file_link( unsigned *n_changes) { _cleanup_lookup_paths_free_ LookupPaths paths = {}; - char **i; _cleanup_free_ char *config_path = NULL; + char **i; int r, q; assert(scope >= 0); @@ -698,7 +668,6 @@ int unit_file_link( q = in_search_path(*i, paths.unit_path); if (q < 0) return q; - if (q > 0) continue; @@ -816,7 +785,9 @@ void unit_file_changes_free(UnitFileChange *changes, unsigned n_changes) { } static void install_info_free(UnitFileInstallInfo *i) { - assert(i); + + if (!i) + return; free(i->name); free(i->path); @@ -898,9 +869,7 @@ static int install_info_add( return 0; fail: - if (i) - install_info_free(i); - + install_info_free(i); return r; } @@ -1052,12 +1021,13 @@ static int unit_file_load( assert(info); assert(path); - if (!isempty(root_dir)) - path = strjoina(root_dir, "/", path); + path = prefix_roota(root_dir, path); if (!load) { - r = access(path, F_OK) ? -errno : 0; - return r; + if (access(path, F_OK) < 0) + return -errno; + + return 0; } fd = open(path, O_RDONLY|O_CLOEXEC|O_NOCTTY|(allow_symlink ? 0 : O_NOFOLLOW)); @@ -1396,15 +1366,12 @@ static int install_context_apply( assert(paths); assert(config_path); - if (!ordered_hashmap_isempty(c->will_install)) { - r = ordered_hashmap_ensure_allocated(&c->have_installed, &string_hash_ops); - if (r < 0) - return r; + if (ordered_hashmap_isempty(c->will_install)) + return 0; - r = ordered_hashmap_reserve(c->have_installed, ordered_hashmap_size(c->will_install)); - if (r < 0) - return r; - } + r = ordered_hashmap_ensure_allocated(&c->have_installed, &string_hash_ops); + if (r < 0) + return r; r = 0; while ((i = ordered_hashmap_first(c->will_install))) { @@ -1443,15 +1410,12 @@ static int install_context_mark_for_removal( /* Marks all items for removal */ - if (!ordered_hashmap_isempty(c->will_install)) { - r = ordered_hashmap_ensure_allocated(&c->have_installed, &string_hash_ops); - if (r < 0) - return r; + if (ordered_hashmap_isempty(c->will_install)) + return 0; - r = ordered_hashmap_reserve(c->have_installed, ordered_hashmap_size(c->will_install)); - if (r < 0) - return r; - } + r = ordered_hashmap_ensure_allocated(&c->have_installed, &string_hash_ops); + if (r < 0) + return r; r = 0; while ((i = ordered_hashmap_first(c->will_install))) { @@ -1628,9 +1592,9 @@ int unit_file_enable( } /* This will return the number of symlink rules that were - supposed to be created, not the ones actually created. This is - useful to determine whether the passed files had any - installation data at all. */ + supposed to be created, not the ones actually created. This + is useful to determine whether the passed files had any + installation data at all. */ return install_context_apply(&c, &paths, config_path, root_dir, force, changes, n_changes); } @@ -1686,13 +1650,11 @@ int unit_file_reenable( unsigned *n_changes) { int r; - r = unit_file_disable(scope, runtime, root_dir, files, - changes, n_changes); + r = unit_file_disable(scope, runtime, root_dir, files, changes, n_changes); if (r < 0) return r; - return unit_file_enable(scope, runtime, root_dir, files, force, - changes, n_changes); + return unit_file_enable(scope, runtime, root_dir, files, force, changes, n_changes); } int unit_file_set_default( @@ -1856,11 +1818,8 @@ UnitFileState unit_file_lookup_state( return r; else if (r > 0) return UNIT_FILE_DISABLED; - else if (r == 0) { - if (also) - return UNIT_FILE_INDIRECT; - return UNIT_FILE_STATIC; - } + else if (r == 0) + return also ? UNIT_FILE_INDIRECT : UNIT_FILE_STATIC; } return r < 0 ? r : state; @@ -2025,14 +1984,14 @@ int unit_file_preset( r = install_context_mark_for_removal(&minus, &paths, &remove_symlinks_to, config_path, root_dir); q = remove_marked_symlinks(remove_symlinks_to, config_path, changes, n_changes, files); - if (r == 0) + if (r >= 0) r = q; } if (mode != UNIT_FILE_PRESET_DISABLE_ONLY) { /* Returns number of symlinks that where supposed to be installed. */ q = install_context_apply(&plus, &paths, config_path, root_dir, force, changes, n_changes); - if (r == 0) + if (r >= 0) r = q; } @@ -2069,6 +2028,7 @@ int unit_file_preset_all( STRV_FOREACH(i, paths.unit_path) { _cleanup_closedir_ DIR *d = NULL; _cleanup_free_ char *units_dir; + struct dirent *de; units_dir = path_join(root_dir, *i, NULL); if (!units_dir) @@ -2082,19 +2042,7 @@ int unit_file_preset_all( return -errno; } - for (;;) { - struct dirent *de; - - errno = 0; - de = readdir(d); - if (!de && errno != 0) - return -errno; - - if (!de) - break; - - if (hidden_file(de->d_name)) - continue; + FOREACH_DIRENT(de, d, return -errno) { if (!unit_name_is_valid(de->d_name, UNIT_NAME_ANY)) continue; @@ -2127,13 +2075,13 @@ int unit_file_preset_all( r = install_context_mark_for_removal(&minus, &paths, &remove_symlinks_to, config_path, root_dir); q = remove_marked_symlinks(remove_symlinks_to, config_path, changes, n_changes, NULL); - if (r == 0) + if (r >= 0) r = q; } if (mode != UNIT_FILE_PRESET_DISABLE_ONLY) { q = install_context_apply(&plus, &paths, config_path, root_dir, force, changes, n_changes); - if (r == 0) + if (r >= 0) r = q; } @@ -2179,6 +2127,7 @@ int unit_file_get_list( STRV_FOREACH(i, paths.unit_path) { _cleanup_closedir_ DIR *d = NULL; _cleanup_free_ char *units_dir; + struct dirent *de; units_dir = path_join(root_dir, *i, NULL); if (!units_dir) @@ -2192,23 +2141,11 @@ int unit_file_get_list( return -errno; } - for (;;) { + FOREACH_DIRENT(de, d, return -errno) { _cleanup_(unit_file_list_free_onep) UnitFileList *f = NULL; - struct dirent *de; _cleanup_free_ char *path = NULL; bool also = false; - errno = 0; - de = readdir(d); - if (!de && errno != 0) - return -errno; - - if (!de) - break; - - if (hidden_file(de->d_name)) - continue; - if (!unit_name_is_valid(de->d_name, UNIT_NAME_ANY)) continue; @@ -2231,7 +2168,7 @@ int unit_file_get_list( r = null_or_empty_path(f->path); if (r < 0 && r != -ENOENT) return r; - else if (r > 0) { + if (r > 0) { f->state = path_startswith(*i, "/run") ? UNIT_FILE_MASKED_RUNTIME : UNIT_FILE_MASKED; @@ -2241,7 +2178,7 @@ int unit_file_get_list( r = find_symlinks_in_scope(scope, root_dir, de->d_name, &f->state); if (r < 0) return r; - else if (r > 0) { + if (r > 0) { f->state = UNIT_FILE_ENABLED; goto found; } |