From 48b0a95528ff82d2afc10bfbb803048d12f60d5a Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Mon, 25 Oct 2021 16:04:41 -0500 Subject: [PATCH] client: Print daemon information at startup --- Makefile.am | 4 +- client/daemon.c | 129 ++++++++++++++++++++++++++++++++++++++++++++ client/daemon.h | 23 ++++++++ client/dbus-proxy.h | 1 + 4 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 client/daemon.c create mode 100644 client/daemon.h diff --git a/Makefile.am b/Makefile.am index 0165b44b..a6dafe63 100644 --- a/Makefile.am +++ b/Makefile.am @@ -293,7 +293,9 @@ client_iwctl_SOURCES = client/main.c \ client/network.h client/network.c \ client/properties.h client/properties.c \ client/wsc.c client/station.c \ - client/diagnostic.c client/diagnostic.h + client/diagnostic.c client/diagnostic.h \ + client/daemon.c client/daemon.h + client_iwctl_LDADD = $(ell_ldadd) $(READLINE_LIBS) if MANUAL_PAGES diff --git a/client/daemon.c b/client/daemon.c new file mode 100644 index 00000000..3f773db4 --- /dev/null +++ b/client/daemon.c @@ -0,0 +1,129 @@ +/* + * + * Wireless daemon for Linux + * + * Copyright (C) 2021 Intel Corporation. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "client/dbus-proxy.h" +#include "client/display.h" +#include "client/daemon.h" + +static bool netconfig_enabled; + +#define IWD_DAEMON_PATH "/net/connman/iwd" + +int daemon_netconfig_enabled() +{ + const struct proxy_interface *proxy = + proxy_interface_find(IWD_DAEMON_INTERFACE, IWD_DAEMON_PATH); + + if (!proxy) + return -ENOENT; + + return netconfig_enabled; +} + +static void get_info_callback(struct l_dbus_message *message, void *user_data) +{ + struct l_dbus_message_iter iter; + struct l_dbus_message_iter variant; + const char *key; + + if (dbus_message_has_error(message)) + return; + + if (!l_dbus_message_get_arguments(message, "a{sv}", &iter)) { + l_error("Failed to parse GetInfo message"); + return; + } + + while (l_dbus_message_iter_next_entry(&iter, &key, &variant)) { + if (!strcmp(key, "NetworkConfigurationEnabled") && + l_dbus_message_iter_get_variant(&variant, "b", + &netconfig_enabled)) + display("%s: %s\n", key, + netconfig_enabled ? "enabled" : "disabled"); + else if (!strcmp(key, "Version") || + !strcmp(key, "StateDirectory")) { + const char *sval; + + if (!l_dbus_message_iter_get_variant(&variant, "s", + &sval)) + continue; + + display("%s: %s\n", key, sval); + } + } +} + +static bool daemon_get_info(void) +{ + const struct proxy_interface *proxy = + proxy_interface_find(IWD_DAEMON_INTERFACE, IWD_DAEMON_PATH); + + if (!proxy) + return false; + + proxy_interface_method_call(proxy, "GetInfo", "", get_info_callback); + + return true; +} + +static void *daemon_create(void) +{ + daemon_get_info(); + return NULL; +} + +static void daemon_destroy(void *data) +{ +} + +static const struct proxy_interface_type_ops daemon_ops = { + .create = daemon_create, + .destroy = daemon_destroy, +}; + +static struct proxy_interface_type daemon_interface_type = { + .interface = IWD_DAEMON_INTERFACE, + .ops = &daemon_ops, +}; + +static int daemon_interface_init(void) +{ + proxy_interface_type_register(&daemon_interface_type); + + return 0; +} + +static void daemon_interface_exit(void) +{ + proxy_interface_type_unregister(&daemon_interface_type); +} + +INTERFACE_TYPE(daemon_interface_type, daemon_interface_init, + daemon_interface_exit) diff --git a/client/daemon.h b/client/daemon.h new file mode 100644 index 00000000..ae52ee69 --- /dev/null +++ b/client/daemon.h @@ -0,0 +1,23 @@ +/* + * + * Wireless daemon for Linux + * + * Copyright (C) 2021 Intel Corporation. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +int daemon_netconfig_enabled(void); diff --git a/client/dbus-proxy.h b/client/dbus-proxy.h index a3ca270a..6852a378 100644 --- a/client/dbus-proxy.h +++ b/client/dbus-proxy.h @@ -35,6 +35,7 @@ struct proxy_interface; #define IWD_STATION_INTERFACE "net.connman.iwd.Station" #define IWD_STATION_DIAGNOSTIC_INTERFACE "net.connman.iwd.StationDiagnostic" #define IWD_AP_DIAGNOSTIC_INTERFACE "net.connman.iwd.AccessPointDiagnostic" +#define IWD_DAEMON_INTERFACE "net.connman.iwd.Daemon" typedef bool (*proxy_property_match_func_t) (const void *a, const void *b);