shared/install: when unit contains only Also=, report 'indirect'

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
This commit is contained in:
Jan Synacek
2014-11-10 19:58:21 +01:00
committed by Lennart Poettering
parent f81e67f79f
commit aedd4012f4
4 changed files with 41 additions and 18 deletions
+5
View File
@@ -1018,6 +1018,11 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
<entry>Unit is not enabled, but has no provisions for enabling in [Install] section</entry> <entry>Unit is not enabled, but has no provisions for enabling in [Install] section</entry>
<entry>0</entry> <entry>0</entry>
</row> </row>
<row>
<entry><literal>indirect</literal></entry>
<entry>Unit's status is determined indirectly by another unit(s) specified in <literal>Also=</literal> in [Install] section</entry>
<entry>0</entry>
</row>
<row> <row>
<entry><literal>disabled</literal></entry> <entry><literal>disabled</literal></entry>
<entry>Unit is not enabled</entry> <entry>Unit is not enabled</entry>
+31 -14
View File
@@ -840,6 +840,7 @@ static void install_info_free(InstallInfo *i) {
strv_free(i->aliases); strv_free(i->aliases);
strv_free(i->wanted_by); strv_free(i->wanted_by);
strv_free(i->required_by); strv_free(i->required_by);
strv_free(i->also);
free(i->default_instance); free(i->default_instance);
free(i); free(i);
} }
@@ -948,6 +949,7 @@ static int config_parse_also(
size_t l; size_t l;
const char *word, *state; const char *word, *state;
InstallContext *c = data; InstallContext *c = data;
InstallInfo *i = userdata;
assert(filename); assert(filename);
assert(lvalue); assert(lvalue);
@@ -964,6 +966,10 @@ static int config_parse_also(
r = install_info_add(c, n, NULL); r = install_info_add(c, n, NULL);
if (r < 0) if (r < 0)
return r; return r;
r = strv_extend(&i->also, n);
if (r < 0)
return r;
} }
if (!isempty(state)) if (!isempty(state))
log_syntax(unit, LOG_ERR, filename, line, EINVAL, log_syntax(unit, LOG_ERR, filename, line, EINVAL,
@@ -1043,7 +1049,8 @@ static int unit_file_load(
const char *path, const char *path,
const char *root_dir, const char *root_dir,
bool allow_symlink, bool allow_symlink,
bool load) { bool load,
bool *also) {
const ConfigTableItem items[] = { const ConfigTableItem items[] = {
{ "Install", "Alias", config_parse_strv, 0, &info->aliases }, { "Install", "Alias", config_parse_strv, 0, &info->aliases },
@@ -1087,6 +1094,9 @@ static int unit_file_load(
if (r < 0) if (r < 0)
return r; return r;
if (also)
*also = !strv_isempty(info->also);
return return
(int) strv_length(info->aliases) + (int) strv_length(info->aliases) +
(int) strv_length(info->wanted_by) + (int) strv_length(info->wanted_by) +
@@ -1099,7 +1109,8 @@ static int unit_file_search(
LookupPaths *paths, LookupPaths *paths,
const char *root_dir, const char *root_dir,
bool allow_symlink, bool allow_symlink,
bool load) { bool load,
bool *also) {
char **p; char **p;
int r; int r;
@@ -1109,7 +1120,7 @@ static int unit_file_search(
assert(paths); assert(paths);
if (info->path) 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); assert(info->name);
@@ -1120,7 +1131,7 @@ static int unit_file_search(
if (!path) if (!path)
return -ENOMEM; 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) { if (r >= 0) {
info->path = path; info->path = path;
path = NULL; path = NULL;
@@ -1149,7 +1160,7 @@ static int unit_file_search(
if (!path) if (!path)
return -ENOMEM; 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) { if (r >= 0) {
info->path = path; info->path = path;
path = NULL; path = NULL;
@@ -1167,7 +1178,8 @@ static int unit_file_can_install(
LookupPaths *paths, LookupPaths *paths,
const char *root_dir, const char *root_dir,
const char *name, const char *name,
bool allow_symlink) { bool allow_symlink,
bool *also) {
_cleanup_(install_context_done) InstallContext c = {}; _cleanup_(install_context_done) InstallContext c = {};
InstallInfo *i; InstallInfo *i;
@@ -1182,7 +1194,7 @@ static int unit_file_can_install(
assert_se(i = ordered_hashmap_first(c.will_install)); assert_se(i = ordered_hashmap_first(c.will_install));
r = unit_file_search(&c, i, paths, root_dir, allow_symlink, true); r = unit_file_search(&c, i, paths, root_dir, allow_symlink, true, also);
if (r >= 0) if (r >= 0)
r = r =
@@ -1415,7 +1427,7 @@ static int install_context_apply(
while ((i = ordered_hashmap_first(c->will_install))) { while ((i = ordered_hashmap_first(c->will_install))) {
assert_se(ordered_hashmap_move_one(c->have_installed, c->will_install, i->name) == 0); assert_se(ordered_hashmap_move_one(c->have_installed, c->will_install, i->name) == 0);
q = unit_file_search(c, i, paths, root_dir, false, true); q = unit_file_search(c, i, paths, root_dir, false, true, NULL);
if (q < 0) { if (q < 0) {
if (r >= 0) if (r >= 0)
r = q; r = q;
@@ -1462,7 +1474,7 @@ static int install_context_mark_for_removal(
while ((i = ordered_hashmap_first(c->will_install))) { while ((i = ordered_hashmap_first(c->will_install))) {
assert_se(ordered_hashmap_move_one(c->have_installed, c->will_install, i->name) == 0); assert_se(ordered_hashmap_move_one(c->have_installed, c->will_install, i->name) == 0);
q = unit_file_search(c, i, paths, root_dir, false, true); q = unit_file_search(c, i, paths, root_dir, false, true, NULL);
if (q == -ENOENT) { if (q == -ENOENT) {
/* do nothing */ /* do nothing */
} else if (q < 0) { } else if (q < 0) {
@@ -1569,7 +1581,7 @@ int unit_file_add_dependency(
while ((info = ordered_hashmap_first(c.will_install))) { while ((info = ordered_hashmap_first(c.will_install))) {
assert_se(ordered_hashmap_move_one(c.have_installed, c.will_install, info->name) == 0); assert_se(ordered_hashmap_move_one(c.have_installed, c.will_install, info->name) == 0);
r = unit_file_search(&c, info, &paths, root_dir, false, false); r = unit_file_search(&c, info, &paths, root_dir, false, false, NULL);
if (r < 0) if (r < 0)
return r; return r;
@@ -1738,7 +1750,7 @@ int unit_file_set_default(
assert_se(i = ordered_hashmap_first(c.will_install)); assert_se(i = ordered_hashmap_first(c.will_install));
r = unit_file_search(&c, i, &paths, root_dir, false, true); r = unit_file_search(&c, i, &paths, root_dir, false, true, NULL);
if (r < 0) if (r < 0)
return r; return r;
@@ -1825,6 +1837,7 @@ UnitFileState unit_file_get_state(
STRV_FOREACH(i, paths.unit_path) { STRV_FOREACH(i, paths.unit_path) {
struct stat st; struct stat st;
char *partial; char *partial;
bool also = false;
free(path); free(path);
path = NULL; path = NULL;
@@ -1869,13 +1882,16 @@ UnitFileState unit_file_get_state(
else if (r > 0) else if (r > 0)
return state; return state;
r = unit_file_can_install(&paths, root_dir, partial, true); r = unit_file_can_install(&paths, root_dir, partial, true, &also);
if (r < 0 && errno != ENOENT) if (r < 0 && errno != ENOENT)
return r; return r;
else if (r > 0) else if (r > 0)
return UNIT_FILE_DISABLED; return UNIT_FILE_DISABLED;
else if (r == 0) else if (r == 0) {
if (also)
return UNIT_FILE_INDIRECT;
return UNIT_FILE_STATIC; return UNIT_FILE_STATIC;
}
} }
return r < 0 ? r : state; return r < 0 ? r : state;
@@ -2242,7 +2258,7 @@ int unit_file_get_list(
if (!path) if (!path)
return -ENOMEM; return -ENOMEM;
r = unit_file_can_install(&paths, root_dir, path, true); r = unit_file_can_install(&paths, root_dir, path, true, NULL);
if (r == -EINVAL || /* Invalid setting? */ if (r == -EINVAL || /* Invalid setting? */
r == -EBADMSG || /* Invalid format? */ r == -EBADMSG || /* Invalid format? */
r == -ENOENT /* Included file not found? */) r == -ENOENT /* Included file not found? */)
@@ -2274,6 +2290,7 @@ static const char* const unit_file_state_table[_UNIT_FILE_STATE_MAX] = {
[UNIT_FILE_MASKED_RUNTIME] = "masked-runtime", [UNIT_FILE_MASKED_RUNTIME] = "masked-runtime",
[UNIT_FILE_STATIC] = "static", [UNIT_FILE_STATIC] = "static",
[UNIT_FILE_DISABLED] = "disabled", [UNIT_FILE_DISABLED] = "disabled",
[UNIT_FILE_INDIRECT] = "indirect",
[UNIT_FILE_INVALID] = "invalid", [UNIT_FILE_INVALID] = "invalid",
}; };
+2
View File
@@ -41,6 +41,7 @@ typedef enum UnitFileState {
UNIT_FILE_MASKED_RUNTIME, UNIT_FILE_MASKED_RUNTIME,
UNIT_FILE_STATIC, UNIT_FILE_STATIC,
UNIT_FILE_DISABLED, UNIT_FILE_DISABLED,
UNIT_FILE_INDIRECT,
UNIT_FILE_INVALID, UNIT_FILE_INVALID,
_UNIT_FILE_STATE_MAX, _UNIT_FILE_STATE_MAX,
_UNIT_FILE_STATE_INVALID = -1 _UNIT_FILE_STATE_INVALID = -1
@@ -80,6 +81,7 @@ typedef struct {
char **aliases; char **aliases;
char **wanted_by; char **wanted_by;
char **required_by; char **required_by;
char **also;
char *default_instance; char *default_instance;
} InstallInfo; } InstallInfo;
+3 -4
View File
@@ -5660,7 +5660,8 @@ static int unit_is_enabled(sd_bus *bus, char **args) {
if (state == UNIT_FILE_ENABLED || if (state == UNIT_FILE_ENABLED ||
state == UNIT_FILE_ENABLED_RUNTIME || state == UNIT_FILE_ENABLED_RUNTIME ||
state == UNIT_FILE_STATIC) state == UNIT_FILE_STATIC ||
state == UNIT_FILE_INDIRECT)
enabled = true; enabled = true;
if (!arg_quiet) if (!arg_quiet)
@@ -5690,9 +5691,7 @@ static int unit_is_enabled(sd_bus *bus, char **args) {
if (r < 0) if (r < 0)
return bus_log_parse_error(r); return bus_log_parse_error(r);
if (streq(s, "enabled") || if (STR_IN_SET(s, "enabled", "enabled-runtime", "static", "indirect"))
streq(s, "enabled-runtime") ||
streq(s, "static"))
enabled = true; enabled = true;
if (!arg_quiet) if (!arg_quiet)