From 10a94420172b33a7472a16b2e829689dbc570cad Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 13 Apr 2010 20:59:01 +0200 Subject: [PATCH] systemctl: show sub state along active state --- automount.c | 9 ++++++++- dbus-manager.c | 8 +++++--- dbus-unit.c | 19 +++++++++++++++++++ device.c | 7 +++++++ mount.c | 7 +++++++ service.c | 7 +++++++ socket.c | 7 +++++++ systemctl.vala | 4 ++-- systemd-interfaces.vala | 1 + target.c | 9 ++++++++- unit.c | 6 ++++++ unit.h | 8 ++++++++ 12 files changed, 85 insertions(+), 7 deletions(-) diff --git a/automount.c b/automount.c index c6ce25d8..1192949d 100644 --- a/automount.c +++ b/automount.c @@ -93,6 +93,12 @@ static UnitActiveState automount_active_state(Unit *u) { return state_translation_table[AUTOMOUNT(u)->state]; } +static const char *automount_sub_state_to_string(Unit *u) { + assert(u); + + return state_string_table[AUTOMOUNT(u)->state]; +} + const UnitVTable automount_vtable = { .suffix = ".mount", @@ -104,5 +110,6 @@ const UnitVTable automount_vtable = { .dump = automount_dump, - .active_state = automount_active_state + .active_state = automount_active_state, + .sub_state_to_string = automount_sub_state_to_string }; diff --git a/dbus-manager.c b/dbus-manager.c index a8661bac..5f3d9647 100644 --- a/dbus-manager.c +++ b/dbus-manager.c @@ -42,7 +42,7 @@ " " \ " " \ " " \ - " " \ + " " \ " " \ " " \ " " \ @@ -234,12 +234,12 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection dbus_message_iter_init_append(reply, &iter); - if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(ssssouso)", &sub)) + if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(sssssouso)", &sub)) goto oom; HASHMAP_FOREACH_KEY(u, k, m->units, i) { char *u_path, *j_path; - const char *id, *description, *load_state, *active_state, *job_type; + const char *id, *description, *load_state, *active_state, *sub_state, *job_type; DBusMessageIter sub2; uint32_t job_id; @@ -253,6 +253,7 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection description = unit_description(u); load_state = unit_load_state_to_string(u->meta.load_state); active_state = unit_active_state_to_string(unit_active_state(u)); + sub_state = unit_sub_state_to_string(u); if (!(u_path = unit_dbus_path(u))) goto oom; @@ -276,6 +277,7 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &description) || !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &load_state) || !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &active_state) || + !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &sub_state) || !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_OBJECT_PATH, &u_path) || !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_UINT32, &job_id) || !dbus_message_iter_append_basic(&sub2, DBUS_TYPE_STRING, &job_type) || diff --git a/dbus-unit.c b/dbus-unit.c index de5236a6..7897b857 100644 --- a/dbus-unit.c +++ b/dbus-unit.c @@ -49,6 +49,7 @@ static const char introspection[] = " " " " " " + " " " " " " " " @@ -113,6 +114,23 @@ static int bus_unit_append_active_state(Manager *m, DBusMessageIter *i, const ch return 0; } +static int bus_unit_append_sub_state(Manager *m, DBusMessageIter *i, const char *property, void *data) { + Unit *u = data; + const char *state; + + assert(m); + assert(i); + assert(property); + assert(u); + + state = unit_sub_state_to_string(u); + + if (!dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &state)) + return -ENOMEM; + + return 0; +} + static int bus_unit_append_can_reload(Manager *m, DBusMessageIter *i, const char *property, void *data) { Unit *u = data; dbus_bool_t b; @@ -202,6 +220,7 @@ static DBusHandlerResult bus_unit_message_dispatch(Unit *u, DBusMessage *message { "org.freedesktop.systemd1.Unit", "Description", bus_unit_append_description, "s", u }, { "org.freedesktop.systemd1.Unit", "LoadState", bus_unit_append_load_state, "s", &u->meta.load_state }, { "org.freedesktop.systemd1.Unit", "ActiveState", bus_unit_append_active_state, "s", u }, + { "org.freedesktop.systemd1.Unit", "SubState", bus_unit_append_sub_state, "s", u }, { "org.freedesktop.systemd1.Unit", "FragmentPath", bus_property_append_string, "s", u->meta.fragment_path }, { "org.freedesktop.systemd1.Unit", "ActiveEnterTimestamp", bus_property_append_uint64, "t", &u->meta.active_enter_timestamp }, { "org.freedesktop.systemd1.Unit", "ActiveExitTimestamp", bus_property_append_uint64, "t", &u->meta.active_exit_timestamp }, diff --git a/device.c b/device.c index 0a7c967f..b00a0f98 100644 --- a/device.c +++ b/device.c @@ -99,6 +99,12 @@ static UnitActiveState device_active_state(Unit *u) { return state_translation_table[DEVICE(u)->state]; } +static const char *device_sub_state_to_string(Unit *u) { + assert(u); + + return state_string_table[DEVICE(u)->state]; +} + static int device_add_escaped_name(Unit *u, const char *dn, bool make_id) { char *e; int r; @@ -478,6 +484,7 @@ const UnitVTable device_vtable = { .dump = device_dump, .active_state = device_active_state, + .sub_state_to_string = device_sub_state_to_string, .enumerate = device_enumerate, .shutdown = device_shutdown diff --git a/mount.c b/mount.c index 04edc6e1..d70aaa82 100644 --- a/mount.c +++ b/mount.c @@ -720,6 +720,12 @@ static UnitActiveState mount_active_state(Unit *u) { return state_translation_table[MOUNT(u)->state]; } +static const char *mount_sub_state_to_string(Unit *u) { + assert(u); + + return state_string_table[MOUNT(u)->state]; +} + static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) { Mount *m = MOUNT(u); bool success; @@ -1286,6 +1292,7 @@ const UnitVTable mount_vtable = { .reload = mount_reload, .active_state = mount_active_state, + .sub_state_to_string = mount_sub_state_to_string, .sigchld_event = mount_sigchld_event, .timer_event = mount_timer_event, diff --git a/service.c b/service.c index 0a70bb0a..74e8019b 100644 --- a/service.c +++ b/service.c @@ -1638,6 +1638,12 @@ static UnitActiveState service_active_state(Unit *u) { return state_translation_table[SERVICE(u)->state]; } +static const char *service_sub_state_to_string(Unit *u) { + assert(u); + + return service_state_to_string(SERVICE(u)->state); +} + static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) { Service *s = SERVICE(u); bool success; @@ -2065,6 +2071,7 @@ const UnitVTable service_vtable = { .can_reload = service_can_reload, .active_state = service_active_state, + .sub_state_to_string = service_sub_state_to_string, .sigchld_event = service_sigchld_event, .timer_event = service_timer_event, diff --git a/socket.c b/socket.c index 3b74b5e9..4fdd8802 100644 --- a/socket.c +++ b/socket.c @@ -711,6 +711,12 @@ static UnitActiveState socket_active_state(Unit *u) { return state_translation_table[SOCKET(u)->state]; } +static const char *socket_sub_state_to_string(Unit *u) { + assert(u); + + return state_string_table[SOCKET(u)->state]; +} + static void socket_fd_event(Unit *u, int fd, uint32_t events, Watch *w) { Socket *s = SOCKET(u); @@ -894,6 +900,7 @@ const UnitVTable socket_vtable = { .stop = socket_stop, .active_state = socket_active_state, + .sub_state_to_string = socket_sub_state_to_string, .fd_event = socket_fd_event, .sigchld_event = socket_sigchld_event, diff --git a/systemctl.vala b/systemctl.vala index 6c01ad12..8f16b904 100644 --- a/systemctl.vala +++ b/systemctl.vala @@ -104,7 +104,7 @@ int main (string[] args) { uint n = 0; Posix.qsort(list, list.length, sizeof(Manager.UnitInfo), unit_info_compare); - stdout.printf("%-45s %-6s %-12s %-17s\n", "UNIT", "LOAD", "ACTIVE", "JOB"); + stdout.printf("%-45s %-6s %-12s %-12s %-17s\n", "UNIT", "LOAD", "ACTIVE", "SUB", "JOB"); foreach (var i in list) { @@ -114,7 +114,7 @@ int main (string[] args) { if (!all && i.active_state == "inactive") continue; - stdout.printf("%-45s %-6s %-12s", i.id, i.load_state, i.active_state); + stdout.printf("%-45s %-6s %-12s %-12s", i.id, i.load_state, i.active_state, i.sub_state); if (i.job_id != 0) stdout.printf(" → %-15s", i.job_type); diff --git a/systemd-interfaces.vala b/systemd-interfaces.vala index 0323c0db..069c5a1a 100644 --- a/systemd-interfaces.vala +++ b/systemd-interfaces.vala @@ -27,6 +27,7 @@ public interface Manager : DBus.Object { string description; string load_state; string active_state; + string sub_state; ObjectPath unit_path; uint32 job_id; string job_type; diff --git a/target.c b/target.c index 5c83dbaa..5b897c0b 100644 --- a/target.c +++ b/target.c @@ -96,6 +96,12 @@ static UnitActiveState target_active_state(Unit *u) { return state_translation_table[TARGET(u)->state]; } +static const char *target_sub_state_to_string(Unit *u) { + assert(u); + + return state_string_table[TARGET(u)->state]; +} + int target_get_runlevel(Target *t) { static const struct { @@ -136,5 +142,6 @@ const UnitVTable target_vtable = { .start = target_start, .stop = target_stop, - .active_state = target_active_state + .active_state = target_active_state, + .sub_state_to_string = target_sub_state_to_string }; diff --git a/unit.c b/unit.c index 30ffd963..3b30c826 100644 --- a/unit.c +++ b/unit.c @@ -334,6 +334,12 @@ UnitActiveState unit_active_state(Unit *u) { return UNIT_VTABLE(u)->active_state(u); } +const char* unit_sub_state_to_string(Unit *u) { + assert(u); + + return UNIT_VTABLE(u)->sub_state_to_string(u); +} + static void complete_move(Set **s, Set **other) { assert(s); assert(other); diff --git a/unit.h b/unit.h index ae6e4458..052cee01 100644 --- a/unit.h +++ b/unit.h @@ -236,6 +236,12 @@ struct UnitVTable { * a simpler one that the engine can understand */ UnitActiveState (*active_state)(Unit *u); + /* Returns the substate specific to this unit type as + * string. This is purely information so that we can give the + * user a more finegrained explanation in which actual state a + * unit is in. */ + const char* (*sub_state_to_string)(Unit *u); + void (*fd_event)(Unit *u, int fd, uint32_t events, Watch *w); void (*sigchld_event)(Unit *u, pid_t pid, int code, int status); void (*timer_event)(Unit *u, uint64_t n_elapsed, Watch *w); @@ -320,6 +326,8 @@ bool unit_has_name(Unit *u, const char *name); UnitActiveState unit_active_state(Unit *u); +const char* unit_sub_state_to_string(Unit *u); + void unit_dump(Unit *u, FILE *f, const char *prefix); bool unit_can_reload(Unit *u); -- 2.39.5