X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Finstall.c;h=d2da0d8a2c6375035e12261aeb3b9d9bba79a6ac;hb=ea55addcb7cd31ab46f7be610cd3dc60c3abb52a;hp=ef1c3f584d3a4d28c9c76eb4326d37070a31cdc8;hpb=29283ea4cf5df20aa0ea9e24e3cb7035bf4c4a04;p=elogind.git diff --git a/src/shared/install.c b/src/shared/install.c index ef1c3f584..d2da0d8a2 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -59,7 +59,7 @@ static int lookup_paths_init_from_scope(LookupPaths *paths, UnitFileScope scope) zero(*paths); return lookup_paths_init(paths, - scope == UNIT_FILE_SYSTEM ? MANAGER_SYSTEM : MANAGER_USER, + scope == UNIT_FILE_SYSTEM ? SYSTEMD_SYSTEM : SYSTEMD_USER, scope == UNIT_FILE_USER, NULL, NULL, NULL); } @@ -201,7 +201,6 @@ static int remove_marked_symlinks_fd( int r = 0; DIR *d; - struct dirent buffer, *de; assert(remove_symlinks_to); assert(fd >= 0); @@ -218,9 +217,11 @@ static int remove_marked_symlinks_fd( rewinddir(d); for (;;) { + struct dirent *de; + union dirent_storage buf; int k; - k = readdir_r(d, &buffer, &de); + k = readdir_r(d, &buf.de, &de); if (k != 0) { r = -errno; break; @@ -374,8 +375,7 @@ static int find_symlinks_fd( bool *same_name_link) { int r = 0; - DIR *d; - struct dirent buffer, *de; + DIR _cleanup_closedir_ *d = NULL; assert(name); assert(fd >= 0); @@ -391,15 +391,15 @@ static int find_symlinks_fd( for (;;) { int k; + struct dirent *de; + union dirent_storage buf; - k = readdir_r(d, &buffer, &de); - if (k != 0) { - r = -errno; - break; - } + k = readdir_r(d, &buf.de, &de); + if (k != 0) + return -errno; if (!de) - break; + return r; if (ignore_file(de->d_name)) continue; @@ -408,7 +408,7 @@ static int find_symlinks_fd( if (de->d_type == DT_DIR) { int nfd, q; - char *p; + char _cleanup_free_ *p = NULL; nfd = openat(fd, de->d_name, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW); if (nfd < 0) { @@ -423,39 +423,31 @@ static int find_symlinks_fd( p = path_make_absolute(de->d_name, path); if (!p) { close_nointr_nofail(nfd); - r = -ENOMEM; - break; + return -ENOMEM; } /* This will close nfd, regardless whether it succeeds or not */ q = find_symlinks_fd(name, nfd, p, config_path, same_name_link); - free(p); - if (q > 0) { - r = 1; - break; - } + if (q > 0) + return 1; if (r == 0) r = q; } else if (de->d_type == DT_LNK) { - char *p, *dest; + char _cleanup_free_ *p = NULL, *dest = NULL; bool found_path, found_dest, b = false; int q; /* Acquire symlink name */ p = path_make_absolute(de->d_name, path); - if (!p) { - r = -ENOMEM; - break; - } + if (!p) + return -ENOMEM; /* Acquire symlink destination */ q = readlink_and_canonicalize(p, &dest); if (q < 0) { - free(p); - if (q == -ENOENT) continue; @@ -478,37 +470,25 @@ static int find_symlinks_fd( else found_dest = streq(path_get_file_name(dest), name); - free(dest); - if (found_path && found_dest) { - char *t; + char _cleanup_free_ *t = NULL; /* Filter out same name links in the main * config path */ t = path_make_absolute(name, config_path); - if (!t) { - free(p); - r = -ENOMEM; - break; - } + if (!t) + return -ENOMEM; b = path_equal(t, p); - free(t); } - free(p); - if (b) *same_name_link = true; - else if (found_path || found_dest) { - r = 1; - break; - } + else if (found_path || found_dest) + return 1; } } - closedir(d); - return r; } @@ -524,8 +504,11 @@ static int find_symlinks( assert(same_name_link); fd = open(config_path, O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC|O_NOFOLLOW); - if (fd < 0) + if (fd < 0) { + if (errno == ENOENT) + return 0; return -errno; + } /* This takes possession of fd and closes it */ return find_symlinks_fd(name, fd, config_path, config_path, same_name_link); @@ -538,7 +521,7 @@ static int find_symlinks_in_scope( UnitFileState *state) { int r; - char *path; + char _cleanup_free_ *path = NULL; bool same_name_link_runtime = false, same_name_link = false; assert(scope >= 0); @@ -553,8 +536,6 @@ static int find_symlinks_in_scope( return r; r = find_symlinks(name, path, &same_name_link_runtime); - free(path); - if (r < 0) return r; else if (r > 0) { @@ -569,8 +550,6 @@ static int find_symlinks_in_scope( return r; r = find_symlinks(name, path, &same_name_link); - free(path); - if (r < 0) return r; else if (r > 0) { @@ -600,7 +579,8 @@ int unit_file_mask( UnitFileChange **changes, unsigned *n_changes) { - char **i, *prefix; + char **i; + char _cleanup_free_ *prefix; int r; assert(scope >= 0); @@ -611,7 +591,7 @@ int unit_file_mask( return r; STRV_FOREACH(i, files) { - char *path; + char _cleanup_free_ *path = NULL; if (!unit_name_is_valid(*i, true)) { if (r == 0) @@ -628,16 +608,13 @@ int unit_file_mask( if (symlink("/dev/null", path) >= 0) { add_file_change(changes, n_changes, UNIT_FILE_SYMLINK, path, "/dev/null"); - free(path); continue; } if (errno == EEXIST) { - if (null_or_empty_path(path) > 0) { - free(path); + if (null_or_empty_path(path) > 0) continue; - } if (force) { unlink(path); @@ -647,7 +624,6 @@ int unit_file_mask( add_file_change(changes, n_changes, UNIT_FILE_UNLINK, path, NULL); add_file_change(changes, n_changes, UNIT_FILE_SYMLINK, path, "/dev/null"); - free(path); continue; } } @@ -658,12 +634,8 @@ int unit_file_mask( if (r == 0) r = -errno; } - - free(path); } - free(prefix); - return r; } @@ -1521,7 +1493,7 @@ 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 hat any + useful to determine whether the passed files had any installation data at all. */ r = install_context_apply(&c, &paths, config_path, root_dir, force, changes, n_changes); @@ -1914,7 +1886,6 @@ int unit_file_get_list( return r; STRV_FOREACH(i, paths.unit_path) { - struct dirent buffer, *de; const char *units_dir; free(buf); @@ -1942,9 +1913,11 @@ int unit_file_get_list( } for (;;) { + struct dirent *de; + union dirent_storage buffer; UnitFileList *f; - r = readdir_r(d, &buffer, &de); + r = readdir_r(d, &buffer.de, &de); if (r != 0) { r = -r; goto finish; @@ -2003,25 +1976,24 @@ int unit_file_get_list( free(f->path); free(f); goto finish; - } else if (r > 0) + } else if (r > 0) { + f->state = UNIT_FILE_ENABLED; goto found; + } r = unit_file_can_install(&paths, root_dir, f->path, true); - if (r < 0) { + if (r == -EINVAL || /* Invalid setting? */ + r == -EBADMSG || /* Invalid format? */ + r == -ENOENT /* Included file not found? */) + f->state = UNIT_FILE_INVALID; + else if (r < 0) { free(f->path); free(f); goto finish; - } else if (r > 0) { + } else if (r > 0) f->state = UNIT_FILE_DISABLED; - goto found; - } else { + else f->state = UNIT_FILE_STATIC; - goto found; - } - - free(f->path); - free(f); - continue; found: r = hashmap_put(h, path_get_file_name(f->path), f); @@ -2051,7 +2023,8 @@ static const char* const unit_file_state_table[_UNIT_FILE_STATE_MAX] = { [UNIT_FILE_MASKED] = "masked", [UNIT_FILE_MASKED_RUNTIME] = "masked-runtime", [UNIT_FILE_STATIC] = "static", - [UNIT_FILE_DISABLED] = "disabled" + [UNIT_FILE_DISABLED] = "disabled", + [UNIT_FILE_INVALID] = "invalid", }; DEFINE_STRING_TABLE_LOOKUP(unit_file_state, UnitFileState);