[PATCH] dbus: register interface before acquiring name
Ronan Pigott <[email protected]> Tue, 27 Jan 2026 15:40:27 -0700
| Newsgroups | dev.linux.lists.iwd |
|---|---|
| Message-ID | <[email protected]> |
If the interface isn't available by the time we acquire the well-known
name, clients can get confused when the expected interfaces are missing
during bus activation.
---
This code seems backwards to me. Presently, if IWD is not running,
calling any IWD methods will fail:
$ busctl call net.connman.iwd /net/connman/iwd net.connman.iwd.Daemon GetInfo
Call failed: No matching method found
only to succeed immediately after once the bus activation is complete:
$ busctl call net.connman.iwd /net/connman/iwd net.connman.iwd.Daemon GetInfo
a{sv} 3 "NetworkConfigurationEnabled" b false "StateDirectory" s "/var/lib/iwd" "Version" s "3.10"
With this patch, we register IWD methods before acquiring the well-known
name, and the abovve call succeeds on the first try.
src/main.c | 46 +++++++++++++++++++++-------------------------
1 file changed, 21 insertions(+), 25 deletions(-)
diff --git a/src/main.c b/src/main.c
index beaf228fb3cd..0f27488211d0 100644
--- a/src/main.c
+++ b/src/main.c
@@ -197,29 +197,8 @@ static void request_name_callback(struct l_dbus *dbus, bool success,
{
if (!success) {
l_error("Name request failed");
- goto fail_exit;
+ l_main_quit();
}
-
- if (!l_dbus_object_manager_enable(dbus, "/"))
- l_warn("Unable to register the ObjectManager");
-
- if (!l_dbus_object_add_interface(dbus, IWD_BASE_PATH,
- IWD_DAEMON_INTERFACE,
- NULL) ||
- !l_dbus_object_add_interface(dbus, IWD_BASE_PATH,
- L_DBUS_INTERFACE_PROPERTIES,
- NULL))
- l_info("Unable to add %s and/or %s at %s",
- IWD_DAEMON_INTERFACE, L_DBUS_INTERFACE_PROPERTIES,
- IWD_BASE_PATH);
-
- /* TODO: Always request nl80211 for now, ignoring auto-loading */
- l_genl_request_family(genl, NL80211_GENL_NAME, nl80211_appeared,
- NULL, NULL);
- return;
-
-fail_exit:
- l_main_quit();
}
static struct l_dbus_message *iwd_dbus_get_info(struct l_dbus *dbus,
@@ -249,12 +228,29 @@ static void dbus_ready(void *user_data)
{
struct l_dbus *dbus = user_data;
- l_dbus_name_acquire(dbus, "net.connman.iwd", false, false, false,
- request_name_callback, NULL);
-
l_dbus_register_interface(dbus, IWD_DAEMON_INTERFACE,
iwd_setup_deamon_interface,
NULL, false);
+
+ if (!l_dbus_object_manager_enable(dbus, "/"))
+ l_warn("Unable to register the ObjectManager");
+
+ if (!l_dbus_object_add_interface(dbus, IWD_BASE_PATH,
+ IWD_DAEMON_INTERFACE,
+ NULL) ||
+ !l_dbus_object_add_interface(dbus, IWD_BASE_PATH,
+ L_DBUS_INTERFACE_PROPERTIES,
+ NULL))
+ l_info("Unable to add %s and/or %s at %s",
+ IWD_DAEMON_INTERFACE, L_DBUS_INTERFACE_PROPERTIES,
+ IWD_BASE_PATH);
+
+ /* TODO: Always request nl80211 for now, ignoring auto-loading */
+ l_genl_request_family(genl, NL80211_GENL_NAME, nl80211_appeared,
+ NULL, NULL);
+
+ l_dbus_name_acquire(dbus, "net.connman.iwd", false, false, false,
+ request_name_callback, NULL);
}
static void dbus_disconnected(void *user_data)
--
2.52.0