Hi Michal, On Thu, 2022-02-03 at 15:12 +0100, Michał Lowas-Rzechonek wrote: > Some io implementations might want to either make calls to other D- > Bus > services, or provide additional objects/interfaces that allow > applications to fine-tune their operation. > --- > mesh/main.c | 9 ++++----- > mesh/mesh-io-api.h | 3 ++- > mesh/mesh-io-generic.c | 4 +++- > mesh/mesh-io-unit.c | 2 +- > mesh/mesh-io.c | 5 +++-- > mesh/mesh-io.h | 3 ++- > mesh/mesh.c | 12 +++++++----- > mesh/mesh.h | 9 +++++---- > 8 files changed, 27 insertions(+), 20 deletions(-) > > diff --git a/mesh/main.c b/mesh/main.c > index dd99c3085..74b0f884e 100644 > --- a/mesh/main.c > +++ b/mesh/main.c > @@ -76,10 +76,9 @@ static void do_debug(const char *str, void > *user_data) > l_info("%s%s", prefix, str); > } > > -static void mesh_ready_callback(void *user_data, bool success) > +static void mesh_ready_callback(bool success, struct l_dbus *dbus, > + void > *user_data) > { > - struct l_dbus *dbus = user_data; > - > l_info("mesh_ready_callback"); > if (!success) { > l_error("Failed to start mesh"); > @@ -102,8 +101,8 @@ static void request_name_callback(struct l_dbus > *dbus, bool success, > return; > } > > - if (!mesh_init(storage_dir, mesh_conf_fname, io_type, > io_opts, > - mesh_ready_callback, dbus)) { > + if (!mesh_init(dbus, storage_dir, mesh_conf_fname, io_type, > io_opts, > + mesh_ready_callback, NULL)) { > l_error("Failed to initialize mesh"); > l_main_quit(); > } > diff --git a/mesh/mesh-io-api.h b/mesh/mesh-io-api.h > index 61f79f224..7a50937da 100644 > --- a/mesh/mesh-io-api.h > +++ b/mesh/mesh-io-api.h > @@ -11,7 +11,8 @@ > struct mesh_io_private; > > typedef bool (*mesh_io_init_t)(struct mesh_io *io, void *opts, > - mesh_io_ready_func_t cb, void > *user_data); > + struct l_dbus *dbus, > mesh_io_ready_func_t cb, > + void *user_data); > typedef bool (*mesh_io_destroy_t)(struct mesh_io *io); > typedef bool (*mesh_io_caps_t)(struct mesh_io *io, struct > mesh_io_caps *caps); > typedef bool (*mesh_io_send_t)(struct mesh_io *io, > diff --git a/mesh/mesh-io-generic.c b/mesh/mesh-io-generic.c > index 6c0b8f0fd..27cb4cf5f 100644 > --- a/mesh/mesh-io-generic.c > +++ b/mesh/mesh-io-generic.c > @@ -27,6 +27,7 @@ > #include "mesh/mesh-io.h" > #include "mesh/mesh-io-api.h" > #include "mesh/mesh-io-generic.h" > +#include "mesh/dbus.h" > > struct mesh_io_private { > struct bt_hci *hci; > @@ -40,6 +41,7 @@ struct mesh_io_private { > uint16_t interval; > bool sending; > bool active; > + struct l_dbus *dbus; > }; > > struct pvt_rx_reg { > @@ -429,7 +431,7 @@ static void read_info(int index, void *user_data) > hci_init(io); > } > > -static bool dev_init(struct mesh_io *io, void *opts, > +static bool dev_init(struct mesh_io *io, void *opts, struct l_dbus > *dbus, > mesh_io_ready_func_t cb, void > *user_data) > { > if (!io || io->pvt) > diff --git a/mesh/mesh-io-unit.c b/mesh/mesh-io-unit.c > index f4b615ac8..a3cba747e 100644 > --- a/mesh/mesh-io-unit.c > +++ b/mesh/mesh-io-unit.c > @@ -209,7 +209,7 @@ static void unit_up(void *user_data) > l_timeout_create_ms(1, get_name, pvt, NULL); > } > > -static bool unit_init(struct mesh_io *io, void *opt, > +static bool unit_init(struct mesh_io *io, void *opt, struct l_dbus > *dbus, > mesh_io_ready_func_t cb, void > *user_data) > { > struct mesh_io_private *pvt; > diff --git a/mesh/mesh-io.c b/mesh/mesh-io.c > index 96891313a..dfd9e43d9 100644 > --- a/mesh/mesh-io.c > +++ b/mesh/mesh-io.c > @@ -46,7 +46,8 @@ static bool match_by_type(const void *a, const void > *b) > } > > struct mesh_io *mesh_io_new(enum mesh_io_type type, void *opts, > - mesh_io_ready_func_t cb, void > *user_data) > + struct l_dbus *dbus, > mesh_io_ready_func_t cb, > + void *user_data) > { > const struct mesh_io_api *api = NULL; > struct mesh_io *io; > @@ -69,7 +70,7 @@ struct mesh_io *mesh_io_new(enum mesh_io_type type, > void *opts, > io->type = type; > io->api = api; > > - if (!api->init(io, opts, cb, user_data)) > + if (!api->init(io, opts, dbus, cb, user_data)) > goto fail; > > if (!io_list) > diff --git a/mesh/mesh-io.h b/mesh/mesh-io.h > index 80ef3fa3e..8a4b2e8ee 100644 > --- a/mesh/mesh-io.h > +++ b/mesh/mesh-io.h > @@ -74,7 +74,8 @@ typedef void (*mesh_io_recv_ext_func_t)(void > *user_data, > typedef void (*mesh_io_ready_func_t)(void *user_data, bool result); > > struct mesh_io *mesh_io_new(enum mesh_io_type type, void *opts, > - mesh_io_ready_func_t cb, void > *user_data); > + struct l_dbus *dbus, > mesh_io_ready_func_t cb, > + void *user_data); > void mesh_io_destroy(struct mesh_io *io); > > bool mesh_io_get_caps(struct mesh_io *io, struct mesh_io_caps > *caps); > diff --git a/mesh/mesh.c b/mesh/mesh.c > index 62d650328..1d3451cf4 100644 > --- a/mesh/mesh.c > +++ b/mesh/mesh.c > @@ -71,6 +71,7 @@ struct join_data{ > > struct mesh_init_request { > mesh_ready_func_t cb; > + struct l_dbus *dbus; > void *user_data; > }; > > @@ -173,7 +174,7 @@ static void io_ready_callback(void *user_data, > bool result) > if (result) > node_attach_io_all(mesh.io); > > - req->cb(req->user_data, result); > + req->cb(result, req->dbus, req->user_data); > > l_free(req); > } > @@ -249,9 +250,9 @@ done: > l_settings_free(settings); > } > > -bool mesh_init(const char *config_dir, const char *mesh_conf_fname, > - enum mesh_io_type type, void > *opts, > - mesh_ready_func_t cb, void > *user_data) > +bool mesh_init(struct l_dbus *dbus, const char *config_dir, > + const char *mesh_conf_fname, enum mesh_io_type type, > void *opts, > + mesh_ready_func_t cb, void *user_data) > { > struct mesh_io_caps caps; > struct mesh_init_request *req; > @@ -280,9 +281,10 @@ bool mesh_init(const char *config_dir, const > char *mesh_conf_fname, > > req = l_new(struct mesh_init_request, 1); > req->cb = cb; > + req->dbus = dbus; > req->user_data = user_data; > > - mesh.io = mesh_io_new(type, opts, io_ready_callback, req); > + mesh.io = mesh_io_new(type, opts, dbus, io_ready_callback, > req); > if (!mesh.io) { > l_free(req); > return false; > diff --git a/mesh/mesh.h b/mesh/mesh.h > index 0f77ebc58..6050cfa06 100644 > --- a/mesh/mesh.h > +++ b/mesh/mesh.h > @@ -21,13 +21,14 @@ > > enum mesh_io_type; > > -typedef void (*mesh_ready_func_t)(void *user_data, bool success); > +typedef void (*mesh_ready_func_t)(bool success, struct l_dbus *dbus, > + void > *user_data); > typedef void (*prov_rx_cb_t)(void *user_data, const uint8_t *data, > uint1 > 6_t len); > > -bool mesh_init(const char *config_dir, const char *mesh_conf_fname, > - enum mesh_io_type type, void > *opts, > - mesh_ready_func_t cb, void > *user_data); > +bool mesh_init(struct l_dbus *dus, const char *config_dir, > + const char *mesh_conf_fname, enum mesh_io_type type, > void *opts, > + mesh_ready_func_t cb, void *user_data); > void mesh_cleanup(void); > bool mesh_dbus_init(struct l_dbus *dbus); > I wonder if setting the global dbus value prior to initializing mesh would be a bettter solution. That is, introducing a function like void dbus_set_bus(struct l_dbus *bus) (in dbus.c) and call it right after l_dbus_new_default()in main.c Would that provide the required functionality? Best regards, Inga