X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Finstall.c;h=b121018e9722a4d49296ae6602cff405eb691917;hp=37191a7c71ae3d181096829f384179fe137ede14;hb=129b49d8f33ea6efa018392f3d608f2fd9dee60a;hpb=60d27f1916c90871c063819a6e7d586c7a663789 diff --git a/src/shared/install.c b/src/shared/install.c index 37191a7c7..b121018e9 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" @@ -515,7 +514,7 @@ static int find_symlinks_in_scope( UnitFileState *state) { int r; - _cleanup_free_ char *path = NULL; + _cleanup_free_ char *normal_path = NULL, *runtime_path = NULL; bool same_name_link_runtime = false, same_name_link = false; assert(scope >= 0); @@ -523,11 +522,11 @@ static int find_symlinks_in_scope( assert(name); /* First look in runtime config path */ - r = get_config_path(scope, true, root_dir, &path); + r = get_config_path(scope, true, root_dir, &normal_path); if (r < 0) return r; - r = find_symlinks(name, path, &same_name_link_runtime); + r = find_symlinks(name, normal_path, &same_name_link_runtime); if (r < 0) return r; else if (r > 0) { @@ -536,11 +535,11 @@ static int find_symlinks_in_scope( } /* Then look in the normal config path */ - r = get_config_path(scope, false, root_dir, &path); + r = get_config_path(scope, false, root_dir, &runtime_path); if (r < 0) return r; - r = find_symlinks(name, path, &same_name_link); + r = find_symlinks(name, runtime_path, &same_name_link); if (r < 0) return r; else if (r > 0) { @@ -1048,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; @@ -1084,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, @@ -1153,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, @@ -1317,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, @@ -1345,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, @@ -1377,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, @@ -1424,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) { @@ -1536,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); @@ -1614,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); @@ -1730,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) @@ -1785,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; @@ -1858,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) @@ -1873,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;