Hi Andrew, On Tue, Jun 3, 2025 at 11:17 AM Andrew Sayers <kernel.org@xxxxxxxxxxxxxxx> wrote: > > Logind (un)registers callbacks that it calls when the user's state changes. > Callbacks may also be called during (un)registration. > Clients may need to handle those initial/final calls specially. > > Pass an argument indicating whether this is being called during > (un)registration, and modify existing callbacks to ignore that argument. > > Signed-off-by: Andrew Sayers <kernel.org@xxxxxxxxxxxxxxx> > --- > obexd/client/pbap.c | 6 ++++-- > obexd/plugins/bluetooth.c | 6 ++++-- > obexd/src/logind.c | 14 +++++++------- > obexd/src/logind.h | 8 ++++---- > 4 files changed, 19 insertions(+), 15 deletions(-) > > diff --git a/obexd/client/pbap.c b/obexd/client/pbap.c > index 51b523592..64bb8ff72 100644 > --- a/obexd/client/pbap.c > +++ b/obexd/client/pbap.c > @@ -1455,8 +1455,9 @@ static struct obc_driver pbap = { > .remove = pbap_remove > }; > > -static int pbap_init_cb(void) > +static int pbap_init_cb(gboolean at_register) > { > + (void)at_register; > int err; > > DBG(""); > @@ -1482,8 +1483,9 @@ static int pbap_init_cb(void) > return 0; > } > > -static void pbap_exit_cb(void) > +static void pbap_exit_cb(gboolean at_unregister) > { > + (void)at_unregister; > DBG(""); > > g_dbus_remove_watch(system_conn, listener_id); > diff --git a/obexd/plugins/bluetooth.c b/obexd/plugins/bluetooth.c > index 7ff27a8a8..ad37e636d 100644 > --- a/obexd/plugins/bluetooth.c > +++ b/obexd/plugins/bluetooth.c > @@ -427,8 +427,9 @@ static const struct obex_transport_driver driver = { > > static unsigned int listener_id = 0; > > -static int bluetooth_init_cb(void) > +static int bluetooth_init_cb(gboolean at_register) > { > + (void)at_register; > connection = g_dbus_setup_private(DBUS_BUS_SYSTEM, NULL, NULL); > if (connection == NULL) > return -EPERM; > @@ -439,8 +440,9 @@ static int bluetooth_init_cb(void) > return obex_transport_driver_register(&driver); > } > > -static void bluetooth_exit_cb(void) > +static void bluetooth_exit_cb(gboolean at_unregister) > { > + (void)at_unregister; > GSList *l; > > g_dbus_remove_watch(connection, listener_id); > diff --git a/obexd/src/logind.c b/obexd/src/logind.c > index a0eb62b1e..b4279b209 100644 > --- a/obexd/src/logind.c > +++ b/obexd/src/logind.c > @@ -43,13 +43,13 @@ static void call_init_cb(gpointer data, gpointer user_data) > { > int res; > > - res = ((struct callback_pair *)data)->init_cb(); > + res = ((struct callback_pair *)data)->init_cb(FALSE); > if (res) > *(int *)user_data = res; > } > static void call_exit_cb(gpointer data, gpointer user_data) > { > - ((struct callback_pair *)data)->exit_cb(); > + ((struct callback_pair *)data)->exit_cb(FALSE); > } > > static int update(void) > @@ -229,7 +229,7 @@ int logind_register(logind_init_cb init_cb, logind_exit_cb exit_cb) > struct callback_pair *cbs; > > if (!monitoring_enabled) > - return init_cb(); > + return init_cb(TRUE); > if (callbacks == NULL) { > int res; > > @@ -237,23 +237,23 @@ int logind_register(logind_init_cb init_cb, logind_exit_cb exit_cb) > if (res) { > error("logind_init(): %s - login detection disabled", > strerror(-res)); > - return init_cb(); > + return init_cb(TRUE); > } > } > cbs = g_new(struct callback_pair, 1); > cbs->init_cb = init_cb; > cbs->exit_cb = exit_cb; > callbacks = g_slist_prepend(callbacks, cbs); > - return active ? init_cb() : 0; > + return active ? init_cb(TRUE) : 0; > } > void logind_unregister(logind_init_cb init_cb, logind_exit_cb exit_cb) > { > GSList *cb_node; > > if (!monitoring_enabled) > - return exit_cb(); > + return exit_cb(TRUE); > if (active) > - exit_cb(); > + exit_cb(TRUE); > cb_node = g_slist_find_custom(callbacks, init_cb, find_cb); > if (cb_node != NULL) > callbacks = g_slist_delete_link(callbacks, cb_node); > diff --git a/obexd/src/logind.h b/obexd/src/logind.h > index eb3ff8d7b..3cdb03338 100644 > --- a/obexd/src/logind.h > +++ b/obexd/src/logind.h > @@ -8,8 +8,8 @@ > * > */ > > -typedef int (*logind_init_cb)(void); > -typedef void (*logind_exit_cb)(void); > +typedef int (*logind_init_cb)(gboolean at_register); > +typedef void (*logind_exit_cb)(gboolean at_unregister); > > #ifdef SYSTEMD > > @@ -22,12 +22,12 @@ int logind_set(gboolean enabled); > static inline int logind_register(logind_init_cb init_cb, > logind_exit_cb exit_cb) > { > - return init_cb(); > + return init_cb(TRUE); > } > static inline void logind_unregister(logind_init_cb init_cb, > logind_exit_cb exit_cb) > { > - return exit_cb(); > + return exit_cb(TRUE); > } > static inline int logind_set(gboolean enabled) > { > -- > 2.49.0 This is not going very well in my opinion, it looks like we missed the opportunity to integrate the logind directly into obc_driver so we don't have to duplicate code for each coded, so we keep just doing plugin_init->obc_driver_register/plugin_exit->obc_driver_unregister and that internally can detect when it shall be registered with the Bluetoothd, etc, plugin_exit->obc_driver_unregister can actually be assumed to be exit rather than just D-Bus unregister which happens when seat is not longer active. -- Luiz Augusto von Dentz