> dctl status null.target null.target - NYAN Loaded: loaded (/home/alxchk/.config/systemd/user/null.target; disabled) DropIn: /home/alxchk/.config/systemd/user/null.target.d ├─descr.conf ├─install-1.conf └─install.conf /etc/systemd/user/null.target.d └─test.conf Active: inactive (dead) --- src/systemctl/systemctl.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+)
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index a7c2eef..45688d0 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -2225,6 +2225,8 @@ typedef struct UnitStatusInfo { const char *source_path; const char *default_control_group; + char **dropin_paths; + const char *load_error; const char *result; @@ -2285,6 +2287,7 @@ static void print_status_info(UnitStatusInfo *i) { arg_full * OUTPUT_FULL_WIDTH; int maxlen = 8; /* a value that'll suffice most of the time */ char **t, **t2; + unsigned dropins_count = 0; assert(i); @@ -2331,6 +2334,50 @@ static void print_status_info(UnitStatusInfo *i) { printf(" %*s: %s%s%s\n", maxlen, "Loaded", on, strna(i->load_state), off); + dropins_count = strv_length(i->dropin_paths); + if (dropins_count > 0) { + char ** dropin; + char * last_dir = NULL; + bool last = false; + + STRV_FOREACH(dropin, i->dropin_paths) { + const char *dp; + + if (! last_dir || last) { + char *dd; + + printf(" %*s ", maxlen, last_dir ? "" : "DropIn:"); + + free(last_dir); + last_dir = strdup(*dropin); + + if (! last_dir) { + log_oom(); + return; + } + + dd = strrchr(last_dir, '/'); + + assert(dd); + + *dd = '\0'; + + printf("%s\n", last_dir); + } + + last = ! (*(dropin+1) && startswith(*(dropin+1), last_dir)); + + dp = strrchr(*dropin, '/'); + assert(dp); + + printf(" %*s\t%s%s\n", maxlen, "", + draw_special_char(last ? DRAW_TREE_RIGHT : DRAW_TREE_BRANCH), + dp + 1); + } + + free(last_dir); + } + ss = streq_ptr(i->active_state, i->sub_state) ? NULL : i->sub_state; if (streq_ptr(i->active_state, "failed")) { @@ -2771,6 +2818,24 @@ static int status_property(const char *name, DBusMessageIter *iter, UnitStatusIn return 0; + } else if (dbus_message_iter_get_element_type(iter) == DBUS_TYPE_STRING && streq(name, "DropInPaths")) { + + DBusMessageIter sub; + + dbus_message_iter_recurse(iter, &sub); + while (dbus_message_iter_get_arg_type(&sub) == DBUS_TYPE_STRING) { + const char *s; + int r; + + dbus_message_iter_get_basic(&sub, &s); + + r = strv_extend(&i->dropin_paths, s); + if (r < 0) + return r; + + dbus_message_iter_next(&sub); + } + } else if (dbus_message_iter_get_element_type(iter) == DBUS_TYPE_STRING && streq(name, "Documentation")) { @@ -3106,6 +3171,7 @@ static int show_one(const char *verb, DBusConnection *bus, const char *path, boo } strv_free(info.documentation); + strv_free(info.dropin_paths); strv_free(info.listen); if (!streq_ptr(info.active_state, "active") && -- 1.8.1.2 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel