X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Finstall.c;h=1cc999b4d3979c2aad12591850a091b29804d2a8;hb=17384d7f95169dad5f769431374fc2c08101206d;hp=3b065445b071c6c42017ae863ca462246b3f0458;hpb=a34bf9db5da0fdd6bdb14459e203dbe41ee99614;p=elogind.git diff --git a/src/shared/install.c b/src/shared/install.c index 3b065445b..1cc999b4d 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -36,7 +36,6 @@ #include "install.h" #include "conf-parser.h" #include "conf-files.h" -#include "specifier.h" #include "install-printf.h" #include "special.h" @@ -58,22 +57,6 @@ static int in_search_path(const char *path, char **search) { return strv_contains(search, parent); } -static int lookup_paths_init_from_scope(LookupPaths *paths, - UnitFileScope scope, - const char *root_dir) { - assert(paths); - assert(scope >= 0); - assert(scope < _UNIT_FILE_SCOPE_MAX); - - zero(*paths); - - return lookup_paths_init(paths, - scope == UNIT_FILE_SYSTEM ? SYSTEMD_SYSTEM : SYSTEMD_USER, - scope == UNIT_FILE_USER, - root_dir, - NULL, NULL, NULL); -} - static int get_config_path(UnitFileScope scope, bool runtime, const char *root_dir, char **ret) { char *p = NULL; int r; @@ -1064,7 +1047,7 @@ static int unit_file_load( assert(path); if (!isempty(root_dir)) - path = strappenda(root_dir, "/", path); + path = strjoina(root_dir, "/", path); if (!load) { r = access(path, F_OK) ? -errno : 0; @@ -1100,7 +1083,7 @@ static int unit_file_load( static int unit_file_search( InstallContext *c, InstallInfo *info, - LookupPaths *paths, + const LookupPaths *paths, const char *root_dir, bool allow_symlink, bool load, @@ -1169,7 +1152,7 @@ static int unit_file_search( } static int unit_file_can_install( - LookupPaths *paths, + const LookupPaths *paths, const char *root_dir, const char *name, bool allow_symlink, @@ -1333,7 +1316,7 @@ static int install_info_symlink_wants( static int install_info_symlink_link( InstallInfo *i, - LookupPaths *paths, + const LookupPaths *paths, const char *config_path, const char *root_dir, bool force, @@ -1361,7 +1344,7 @@ static int install_info_symlink_link( static int install_info_apply( InstallInfo *i, - LookupPaths *paths, + const LookupPaths *paths, const char *config_path, const char *root_dir, bool force, @@ -1393,7 +1376,7 @@ static int install_info_apply( static int install_context_apply( InstallContext *c, - LookupPaths *paths, + const LookupPaths *paths, const char *config_path, const char *root_dir, bool force, @@ -1440,7 +1423,7 @@ static int install_context_apply( static int install_context_mark_for_removal( InstallContext *c, - LookupPaths *paths, + const LookupPaths *paths, Set **remove_symlinks_to, const char *config_path, const char *root_dir) { @@ -1552,7 +1535,7 @@ int unit_file_add_dependency( if (state == UNIT_FILE_MASKED || state == UNIT_FILE_MASKED_RUNTIME) { log_error("Failed to enable unit: Unit %s is masked", *i); - return -ENOTSUP; + return -EOPNOTSUPP; } r = install_info_add_auto(&c, *i); @@ -1630,7 +1613,7 @@ int unit_file_enable( state = unit_file_get_state(scope, root_dir, *i); if (state == UNIT_FILE_MASKED || state == UNIT_FILE_MASKED_RUNTIME) { log_error("Failed to enable unit: Unit %s is masked", *i); - return -ENOTSUP; + return -EOPNOTSUPP; } r = install_info_add_auto(&c, *i); @@ -1746,7 +1729,7 @@ int unit_file_set_default( if (r < 0) return r; - path = strappenda(config_path, "/" SPECIAL_DEFAULT_TARGET); + path = strjoina(config_path, "/" SPECIAL_DEFAULT_TARGET); r = create_symlink(i->path, path, force, changes, n_changes); if (r < 0) @@ -1801,39 +1784,28 @@ int unit_file_get_default( return -ENOENT; } -UnitFileState unit_file_get_state( +UnitFileState unit_file_lookup_state( UnitFileScope scope, const char *root_dir, + const LookupPaths *paths, const char *name) { - _cleanup_lookup_paths_free_ LookupPaths paths = {}; UnitFileState state = _UNIT_FILE_STATE_INVALID; char **i; _cleanup_free_ char *path = NULL; - int r; - - assert(scope >= 0); - assert(scope < _UNIT_FILE_SCOPE_MAX); - assert(name); + int r = 0; - if (root_dir && scope != UNIT_FILE_SYSTEM) - return -EINVAL; + assert(paths); if (!unit_name_is_valid(name, TEMPLATE_VALID)) return -EINVAL; - r = lookup_paths_init_from_scope(&paths, scope, root_dir); - if (r < 0) - return r; - - STRV_FOREACH(i, paths.unit_path) { + STRV_FOREACH(i, paths->unit_path) { struct stat st; char *partial; bool also = false; free(path); - path = NULL; - path = path_join(root_dir, *i, name); if (!path) return -ENOMEM; @@ -1874,7 +1846,7 @@ UnitFileState unit_file_get_state( else if (r > 0) return state; - r = unit_file_can_install(&paths, root_dir, partial, true, &also); + r = unit_file_can_install(paths, root_dir, partial, true, &also); if (r < 0 && errno != ENOENT) return r; else if (r > 0) @@ -1889,6 +1861,28 @@ UnitFileState unit_file_get_state( return r < 0 ? r : state; } +UnitFileState unit_file_get_state( + UnitFileScope scope, + const char *root_dir, + const char *name) { + + _cleanup_lookup_paths_free_ LookupPaths paths = {}; + int r; + + assert(scope >= 0); + assert(scope < _UNIT_FILE_SCOPE_MAX); + assert(name); + + if (root_dir && scope != UNIT_FILE_SYSTEM) + return -EINVAL; + + r = lookup_paths_init_from_scope(&paths, scope, root_dir); + if (r < 0) + return r; + + return unit_file_lookup_state(scope, root_dir, &paths, name); +} + int unit_file_query_preset(UnitFileScope scope, const char *root_dir, const char *name) { _cleanup_strv_free_ char **files = NULL; char **p;