From 2386fa7938131cd59d0dc75685d348c557f375c9 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Sun, 19 May 2019 12:57:45 -0500 Subject: [PATCH] main: Add IWD_MODULE macro --- src/iwd.h | 13 +++++++++++++ src/main.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/iwd.h b/src/iwd.h index ee3e9d70..13ab9570 100644 --- a/src/iwd.h +++ b/src/iwd.h @@ -54,3 +54,16 @@ void station_exit(void); bool manager_init(struct l_genl_family *in, const char *if_whitelist, const char *if_blacklist); void manager_exit(void); + +struct iwd_module_desc { + const char *name; + int (*init)(void); + void (*exit)(void); + bool active; +} __attribute__((aligned(8))); + +#define IWD_MODULE(name, init, exit) \ + static struct iwd_module_desc __iwd_module_ ## name \ + __attribute__((used, section("__iwd_module"), aligned(8))) = {\ + #name, init, exit \ + }; diff --git a/src/main.c b/src/main.c index da388ea3..e6625850 100644 --- a/src/main.c +++ b/src/main.c @@ -168,6 +168,44 @@ static void nl80211_appeared(const struct l_genl_family_info *info, adhoc_init(nl80211); } +extern struct iwd_module_desc __start___iwd_module[]; +extern struct iwd_module_desc __stop___iwd_module[]; + +static int iwd_modules_init() +{ + struct iwd_module_desc *desc; + int r; + + l_debug(""); + + for (desc = __start___iwd_module; desc < __stop___iwd_module; desc++) { + r = desc->init(); + if (r < 0) + return r; + + l_debug("Initialized module: %s", desc->name); + desc->active = true; + } + + return 0; +} + +static void iwd_modules_exit() +{ + struct iwd_module_desc *desc; + + l_debug(""); + + for (desc = __stop___iwd_module - 1; + desc >= __start___iwd_module; desc--) { + if (!desc->active) + continue; + l_debug("Removing module: %s", desc->name); + desc->exit(); + desc->active = false; + } +} + static void request_name_callback(struct l_dbus *dbus, bool success, bool queued, void *user_data) { @@ -494,15 +532,21 @@ int main(int argc, char *argv[]) network_init(); known_networks_init(); sim_auth_init(); - plugin_init(plugins, noplugins); blacklist_init(); erp_init(); + if (iwd_modules_init() < 0) + goto fail_modules; + + plugin_init(plugins, noplugins); exit_status = l_main_run_with_signal(signal_handler, NULL); + plugin_exit(); + +fail_modules: + iwd_modules_exit(); erp_exit(); blacklist_exit(); - plugin_exit(); sim_auth_exit(); known_networks_exit(); network_exit();