diff --git a/src/miraclectl.c b/src/miraclectl.c index c27b98a..84bcaeb 100644 --- a/src/miraclectl.c +++ b/src/miraclectl.c @@ -280,6 +280,101 @@ static int verb_list(sd_bus *bus, char **args, unsigned int n) return 0; } +static int verb_show_link(sd_bus *bus, char **args, unsigned int n) +{ + _cleanup_sd_bus_error_ sd_bus_error err = SD_BUS_ERROR_NULL; + _cleanup_sd_bus_message_ sd_bus_message *m = NULL; + _cleanup_free_ char *path = NULL, *name = NULL; + _cleanup_free_ char *type = NULL, *iface = NULL, *fname = NULL; + const char *t; + int r; + + name = sd_bus_label_escape(args[1]); + if (!name) + return log_ENOMEM(); + + path = shl_strcat("/org/freedesktop/miracle/link/", name); + if (!path) + return log_ENOMEM(); + + r = sd_bus_call_method(bus, + "org.freedesktop.miracle", + path, + "org.freedesktop.DBus.Properties", + "GetAll", + &err, + &m, + "s", "org.freedesktop.miracle.Link"); + if (r < 0) { + log_error("cannot retrieve link %s: %s", + args[1], bus_error_message(&err, r)); + return r; + } + + r = sd_bus_message_enter_container(m, 'a', "{sv}"); + if (r < 0) + return log_bus_parser(r); + + while ((r = sd_bus_message_enter_container(m, 'e', "sv")) > 0) { + r = sd_bus_message_read(m, "s", &t); + if (r < 0) + return log_bus_parser(r); + + if (!strcmp(t, "Type")) { + r = bus_message_read_basic_variant(m, "s", &t); + if (r < 0) + return log_bus_parser(r); + + free(type); + type = strdup(t); + if (!type) + return log_ENOMEM(); + } else if (!strcmp(t, "Interface")) { + r = bus_message_read_basic_variant(m, "s", &t); + if (r < 0) + return log_bus_parser(r); + + free(iface); + iface = strdup(t); + if (!iface) + return log_ENOMEM(); + } else if (!strcmp(t, "Name")) { + r = bus_message_read_basic_variant(m, "s", &t); + if (r < 0) + return log_bus_parser(r); + + free(fname); + fname = strdup(t); + if (!fname) + return log_ENOMEM(); + } else { + r = sd_bus_message_skip(m, "v"); + if (r < 0) + return log_bus_parser(r); + } + + r = sd_bus_message_exit_container(m); + if (r < 0) + return log_bus_parser(r); + } + if (r < 0) + return log_bus_parser(r); + + r = sd_bus_message_exit_container(m); + if (r < 0) + return log_bus_parser(r); + + printf("Link=%s\n", args[1]); + if (type) + printf("Type=%s\n", type); + if (iface) + printf("Interface=%s\n", iface); + if (fname) + printf("Name=%s\n", fname); + + return 0; +} + static int verb_add_link(sd_bus *bus, char **args, unsigned int n) { _cleanup_sd_bus_error_ sd_bus_error err = SD_BUS_ERROR_NULL; @@ -347,9 +442,10 @@ static int help(void) " --log-time Prefix log-messages with timestamp\n" "\n" "Commands:\n" - " list List managed links and their peers\n" - " add-link LINK... Start managing the given link\n" - " remove-link LINK... Stop managing the given link\n" + " list List managed links and their peers\n" + " show-link LINK... Show details of given link\n" + " add-link LINK... Start managing the given link\n" + " remove-link LINK... Stop managing the given link\n" , program_invocation_short_name); return 0; @@ -405,6 +501,7 @@ static int miraclectl_main(sd_bus *bus, int argc, char *argv[]) int (*dispatch) (sd_bus *bus, char **args, unsigned int n); } verbs[] = { { "list", LESS, 1, verb_list }, + { "show-link", EQUAL, 2, verb_show_link }, { "add-link", EQUAL, 3, verb_add_link }, { "remove-link", EQUAL, 2, verb_remove_link }, };