ssh-generator: follow symlink when searching for sshd@.service

unit_file_exists() currently does not follow symlinks, as it is
mainly used to test whether the unit (of any install state)
has been seen under search dirs. However, in ssh-generator
we should search for and honor whatever the distro ships,
which might be an alias or linked externally.
This commit is contained in:
Mike Yuan
2026-02-03 08:17:34 +09:00
committed by Yu Watanabe
parent ce41216e49
commit c27d1b3eec
3 changed files with 20 additions and 5 deletions
+8 -2
View File
@@ -3239,7 +3239,13 @@ int unit_file_get_state(
return unit_file_lookup_state(scope, &lp, name, ret);
}
int unit_file_exists_full(RuntimeScope scope, const LookupPaths *lp, const char *name, char **ret_path) {
int unit_file_exists_full(
RuntimeScope scope,
const LookupPaths *lp,
bool follow,
const char *name,
char **ret_path) {
_cleanup_(install_context_done) InstallContext c = {
.scope = scope,
};
@@ -3256,7 +3262,7 @@ int unit_file_exists_full(RuntimeScope scope, const LookupPaths *lp, const char
&c,
lp,
name,
/* flags= */ 0,
follow ? SEARCH_FOLLOW_CONFIG_SYMLINKS : 0,
ret_path ? &info : NULL,
/* changes= */ NULL,
/* n_changes= */ NULL);
+8 -2
View File
@@ -181,9 +181,15 @@ int unit_file_lookup_state(
int unit_file_get_state(RuntimeScope scope, const char *root_dir, const char *filename, UnitFileState *ret);
int unit_file_exists_full(RuntimeScope scope, const LookupPaths *lp, const char *name, char **ret_path);
int unit_file_exists_full(
RuntimeScope scope,
const LookupPaths *lp,
bool follow,
const char *name,
char **ret_path);
static inline int unit_file_exists(RuntimeScope scope, const LookupPaths *lp, const char *name) {
return unit_file_exists_full(scope, lp, name, NULL);
return unit_file_exists_full(scope, lp, false, name, NULL);
}
int unit_file_get_list(RuntimeScope scope, const char *root_dir, char * const *states, char * const *patterns, Hashmap **ret);
+4 -1
View File
@@ -475,7 +475,10 @@ static int run(const char *dest, const char *dest_early, const char *dest_late)
return r;
_cleanup_free_ char *found_sshd_template_unit = NULL;
r = unit_file_exists_full(RUNTIME_SCOPE_SYSTEM, &lp, "sshd@.service", &found_sshd_template_unit);
r = unit_file_exists_full(RUNTIME_SCOPE_SYSTEM, &lp,
/* follow = */ true,
"sshd@.service",
&found_sshd_template_unit);
if (r < 0)
return log_error_errno(r, "Unable to detect if sshd@.service exists: %m");