diff --git a/client/ap.c b/client/ap.c index a6a2681b..81baa3fc 100644 --- a/client/ap.c +++ b/client/ap.c @@ -30,6 +30,7 @@ #include "client/dbus-proxy.h" #include "client/device.h" #include "client/display.h" +#include "client/diagnostic.h" struct ap { bool started; @@ -189,6 +190,51 @@ static enum cmd_status cmd_stop(const char *device_name, char **argv, int argc) return CMD_STATUS_TRIGGERED; } +static struct proxy_interface_type ap_diagnostic_interface_type = { + .interface = IWD_AP_DIAGNOSTIC_INTERFACE, +}; + +static void ap_get_diagnostics_callback(struct l_dbus_message *message, + void *user_data) +{ + struct l_dbus_message_iter array; + struct l_dbus_message_iter iter; + uint16_t idx = 0; + char client_num[15]; + + if (dbus_message_has_error(message)) + return; + + if (!l_dbus_message_get_arguments(message, "aa{sv}", &array)) { + display("Failed to parse GetDiagnostics message"); + return; + } + + while (l_dbus_message_iter_next_entry(&array, &iter)) { + sprintf(client_num, "Client %u", idx++); + display_table_header(client_num, "%-*s%-*s", + 20, "Property", 20, "Value"); + diagnostic_display(&iter, "", 20, 20); + display_table_footer(); + } +} + +static enum cmd_status cmd_show(const char *device_name, char **argv, int argc) +{ + const struct proxy_interface *ap_diagnostic = + device_proxy_find(device_name, IWD_AP_DIAGNOSTIC_INTERFACE); + + if (!ap_diagnostic) { + display("No ap on device: '%s'\n", device_name); + return CMD_STATUS_INVALID_VALUE; + } + + proxy_interface_method_call(ap_diagnostic, "GetDiagnostics", "", + ap_get_diagnostics_callback); + + return CMD_STATUS_TRIGGERED; +} + static const struct command ap_commands[] = { { NULL, "list", NULL, cmd_list, "List devices in AP mode", true }, { "", "start", "<\"network name\"> ", cmd_start, @@ -196,6 +242,7 @@ static const struct command ap_commands[] = { "name\" with\n\t\t\t\t\t\t a passphrase" }, { "", "stop", NULL, cmd_stop, "Stop a started access\n" "\t\t\t\t\t\t point" }, + { "