If a unit contains only Also=, with no Alias= or WantedBy=, it shouldn't
be reported as static. New 'indirect' status shall be introduced.
https://bugzilla.redhat.com/show_bug.cgi?id=864298
---
Changes in version 2
- don't pass the whole strv to the higher level calls, use bool instead
man/systemctl.xml | 5 +
src/shared/install.c | 45 +++--
src/shared/install.h | 2 ++
src/systemctl/systemctl.c | 7 +++
4 files changed, 41 insertions(+), 18 deletions(-)
diff --git a/man/systemctl.xml b/man/systemctl.xml
index 7cbaa6c..fa85d0b 100644
--- a/man/systemctl.xml
+++ b/man/systemctl.xml
@@ -1013,6 +1013,11 @@ kobject-uevent 1 systemd-udevd-kernel.socket
systemd-udevd.service
entry0/entry
/row
row
+entryliteralindirect/literal/entry
+entryUnit's status is determined indirectly by another
unit(s) specified in literalAlso=/literal in [Install] section/entry
+entry0/entry
+ /row
+ row
entryliteraldisabled/literal/entry
entryUnit is not enabled/entry
entry1/entry
diff --git a/src/shared/install.c b/src/shared/install.c
index cab93e8..8a7f7e2 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -840,6 +840,7 @@ static void install_info_free(InstallInfo *i) {
strv_free(i-aliases);
strv_free(i-wanted_by);
strv_free(i-required_by);
+strv_free(i-also);
free(i-default_instance);
free(i);
}
@@ -948,6 +949,7 @@ static int config_parse_also(
size_t l;
const char *word, *state;
InstallContext *c = data;
+InstallInfo *i = userdata;
assert(filename);
assert(lvalue);
@@ -964,6 +966,10 @@ static int config_parse_also(
r = install_info_add(c, n, NULL);
if (r 0)
return r;
+
+r = strv_extend(i-also, n);
+if (r 0)
+return r;
}
if (!isempty(state))
log_syntax(unit, LOG_ERR, filename, line, EINVAL,
@@ -1043,7 +1049,8 @@ static int unit_file_load(
const char *path,
const char *root_dir,
bool allow_symlink,
-bool load) {
+bool load,
+bool *also) {
const ConfigTableItem items[] = {
{ Install, Alias, config_parse_strv,
0, info-aliases },
@@ -1087,6 +1094,9 @@ static int unit_file_load(
if (r 0)
return r;
+if (also)
+*also = !strv_isempty(info-also);
+
return
(int) strv_length(info-aliases) +
(int) strv_length(info-wanted_by) +
@@ -1099,7 +1109,8 @@ static int unit_file_search(
LookupPaths *paths,
const char *root_dir,
bool allow_symlink,
-bool load) {
+bool load,
+bool *also) {
char **p;
int r;
@@ -1109,7 +1120,7 @@ static int unit_file_search(
assert(paths);
if (info-path)
-return unit_file_load(c, info, info-path, root_dir,
allow_symlink, load);
+return unit_file_load(c, info, info-path, root_dir,
allow_symlink, load, also);
assert(info-name);
@@ -1120,7 +1131,7 @@ static int unit_file_search(
if (!path)
return -ENOMEM;
-r = unit_file_load(c, info, path, root_dir, allow_symlink,
load);
+r = unit_file_load(c, info, path, root_dir, allow_symlink,
load, also);
if (r = 0) {
info-path = path;
path = NULL;
@@ -1149,7 +1160,7 @@ static int unit_file_search(
if (!path)
return -ENOMEM;
-r = unit_file_load(c, info, path, root_dir,
allow_symlink, load);
+r = unit_file_load(c, info, path, root_dir,
allow_symlink, load, also);
if (r = 0) {
info-path = path;
path = NULL;
@@ -1167,7 +1178,8 @@ static int unit_file_can_install(
LookupPaths *paths,
const char *root_dir,
const char *name,
-bool allow_symlink) {
+bool allow_symlink,
+bool *also) {
_cleanup_(install_context_done) InstallContext c = {};
InstallInfo *i;
@@ -1182,7 +1194,7 @@ static int unit_file_can_install(
assert_se(i = ordered_hashmap_first(c.will_install));
-r = unit_file_search(c, i, paths, root_dir, allow_symlink, true);
+