mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-22 14:49:24 +01:00
wired: Add concept of D-Bus application and async shutdown handling
This commit is contained in:
parent
8bc97d7caa
commit
05ccd73818
66
wired/dbus.c
66
wired/dbus.c
@ -30,17 +30,35 @@
|
|||||||
|
|
||||||
static struct l_dbus *dbus = NULL;
|
static struct l_dbus *dbus = NULL;
|
||||||
|
|
||||||
struct l_dbus *dbus_get(void)
|
struct l_dbus *dbus_app_get(void)
|
||||||
{
|
{
|
||||||
return dbus;
|
return dbus;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct dbus_info {
|
struct dbus_info {
|
||||||
char *name;
|
const struct dbus_app *app;
|
||||||
dbus_ready_func_t ready_func;
|
|
||||||
void *user_data;
|
void *user_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void dbus_app_shutdown_complete(void)
|
||||||
|
{
|
||||||
|
l_main_quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dbus_shutdown(struct dbus_info *info)
|
||||||
|
{
|
||||||
|
static bool terminated = false;
|
||||||
|
|
||||||
|
if (!terminated) {
|
||||||
|
terminated = true;
|
||||||
|
|
||||||
|
if (info->app->shutdown)
|
||||||
|
info->app->shutdown(dbus, info->user_data);
|
||||||
|
else
|
||||||
|
l_main_quit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void request_name_callback(struct l_dbus *dbus, bool success,
|
static void request_name_callback(struct l_dbus *dbus, bool success,
|
||||||
bool queued, void *user_data)
|
bool queued, void *user_data)
|
||||||
{
|
{
|
||||||
@ -55,59 +73,65 @@ static void request_name_callback(struct l_dbus *dbus, bool success,
|
|||||||
if (!l_dbus_object_manager_enable(dbus))
|
if (!l_dbus_object_manager_enable(dbus))
|
||||||
l_warn("Unable to register ObjectManager interface");
|
l_warn("Unable to register ObjectManager interface");
|
||||||
|
|
||||||
if (info->ready_func)
|
if (info->app->ready)
|
||||||
info->ready_func(dbus, info->user_data);
|
info->app->ready(dbus, info->user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dbus_ready(void *user_data)
|
static void dbus_ready(void *user_data)
|
||||||
{
|
{
|
||||||
struct dbus_info *info = user_data;
|
struct dbus_info *info = user_data;
|
||||||
|
|
||||||
l_dbus_name_acquire(dbus, info->name, false, false, true,
|
if (info->app->name) {
|
||||||
|
l_dbus_name_acquire(dbus, info->app->name, false, false, true,
|
||||||
request_name_callback, info);
|
request_name_callback, info);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->app->ready)
|
||||||
|
info->app->ready(dbus, info->user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dbus_disconnected(void *user_data)
|
static void dbus_disconnected(void *user_data)
|
||||||
{
|
{
|
||||||
l_info("D-Bus disconnected, quitting...");
|
struct dbus_info *info = user_data;
|
||||||
l_main_quit();
|
|
||||||
|
l_info("D-Bus disconnected");
|
||||||
|
dbus_shutdown(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dbus_signal_handler(uint32_t signo, void *user_data)
|
static void dbus_signal_handler(uint32_t signo, void *user_data)
|
||||||
{
|
{
|
||||||
|
struct dbus_info *info = user_data;
|
||||||
|
|
||||||
switch (signo) {
|
switch (signo) {
|
||||||
case SIGINT:
|
case SIGINT:
|
||||||
case SIGTERM:
|
case SIGTERM:
|
||||||
l_info("Terminate");
|
l_info("Termination signal");
|
||||||
l_main_quit();
|
dbus_shutdown(info);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int dbus_run(enum l_dbus_bus bus, const char *name,
|
int dbus_app_run(const struct dbus_app *app, void *user_data,
|
||||||
dbus_ready_func_t ready_func,
|
dbus_app_destroy_func_t destroy)
|
||||||
dbus_shutdown_func_t shutdown_func,
|
|
||||||
void *user_data,
|
|
||||||
dbus_destroy_func_t destroy)
|
|
||||||
{
|
{
|
||||||
struct dbus_info *info;
|
struct dbus_info *info;
|
||||||
int exit_status;
|
int exit_status;
|
||||||
|
|
||||||
if (dbus)
|
if (dbus || !app)
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
if (!l_main_init())
|
if (!l_main_init())
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
dbus = l_dbus_new_default(bus);
|
dbus = l_dbus_new_default(app->bus);
|
||||||
if (!dbus) {
|
if (!dbus) {
|
||||||
l_error("Failed to initialize D-Bus");
|
l_error("Failed to initialize D-Bus");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
info = l_new(struct dbus_info, 1);
|
info = l_new(struct dbus_info, 1);
|
||||||
info->name = l_strdup(name);
|
info->app = app;
|
||||||
info->ready_func = ready_func;
|
|
||||||
info->user_data = user_data;
|
info->user_data = user_data;
|
||||||
|
|
||||||
l_dbus_set_ready_handler(dbus, dbus_ready, info, NULL);
|
l_dbus_set_ready_handler(dbus, dbus_ready, info, NULL);
|
||||||
@ -115,16 +139,12 @@ int dbus_run(enum l_dbus_bus bus, const char *name,
|
|||||||
|
|
||||||
exit_status = l_main_run_with_signal(dbus_signal_handler, info);
|
exit_status = l_main_run_with_signal(dbus_signal_handler, info);
|
||||||
|
|
||||||
if (shutdown_func)
|
|
||||||
shutdown_func(dbus, info->user_data);
|
|
||||||
|
|
||||||
l_dbus_destroy(dbus);
|
l_dbus_destroy(dbus);
|
||||||
dbus = NULL;
|
dbus = NULL;
|
||||||
|
|
||||||
if (destroy)
|
if (destroy)
|
||||||
destroy(info->user_data);
|
destroy(info->user_data);
|
||||||
|
|
||||||
l_free(info->name);
|
|
||||||
l_free(info);
|
l_free(info);
|
||||||
|
|
||||||
return exit_status;
|
return exit_status;
|
||||||
|
21
wired/dbus.h
21
wired/dbus.h
@ -23,15 +23,18 @@
|
|||||||
enum l_dbus_bus;
|
enum l_dbus_bus;
|
||||||
struct l_dbus;
|
struct l_dbus;
|
||||||
|
|
||||||
struct l_dbus *dbus_get(void);
|
struct l_dbus *dbus_app_get(void);
|
||||||
|
|
||||||
typedef void (*dbus_ready_func_t) (struct l_dbus *dbus, void *user_data);
|
typedef void (*dbus_app_destroy_func_t) (void *user_data);
|
||||||
typedef void (*dbus_shutdown_func_t) (struct l_dbus *dbus, void *user_data);
|
|
||||||
|
|
||||||
typedef void (*dbus_destroy_func_t) (void *user_data);
|
struct dbus_app {
|
||||||
|
enum l_dbus_bus bus;
|
||||||
|
const char *name;
|
||||||
|
void (*ready) (struct l_dbus *dbus, void *user_data);
|
||||||
|
void (*shutdown) (struct l_dbus *dbus, void *user_data);
|
||||||
|
};
|
||||||
|
|
||||||
int dbus_run(enum l_dbus_bus bus, const char *name,
|
void dbus_app_shutdown_complete(void);
|
||||||
dbus_ready_func_t ready_func,
|
|
||||||
dbus_shutdown_func_t shutdown_func,
|
int dbus_app_run(const struct dbus_app *app, void *user_data,
|
||||||
void *user_data,
|
dbus_app_destroy_func_t destroy);
|
||||||
dbus_destroy_func_t destroy);
|
|
||||||
|
12
wired/main.c
12
wired/main.c
@ -58,8 +58,17 @@ static void dbus_shutdown(struct l_dbus *dbus, void *user_data)
|
|||||||
ethdev_exit();
|
ethdev_exit();
|
||||||
network_exit();
|
network_exit();
|
||||||
eap_exit();
|
eap_exit();
|
||||||
|
|
||||||
|
dbus_app_shutdown_complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct dbus_app app = {
|
||||||
|
.bus = L_DBUS_SYSTEM_BUS,
|
||||||
|
.name = "net.connman.ead",
|
||||||
|
.ready = dbus_ready,
|
||||||
|
.shutdown = dbus_shutdown,
|
||||||
|
};
|
||||||
|
|
||||||
static void usage(void)
|
static void usage(void)
|
||||||
{
|
{
|
||||||
printf("ead - Authentication daemon\n"
|
printf("ead - Authentication daemon\n"
|
||||||
@ -131,6 +140,5 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
l_info("Authentication daemon version %s", VERSION);
|
l_info("Authentication daemon version %s", VERSION);
|
||||||
|
|
||||||
return dbus_run(L_DBUS_SYSTEM_BUS, "net.connman.ead",
|
return dbus_app_run(&app, &opts, NULL);
|
||||||
dbus_ready, dbus_shutdown, &opts, NULL);
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user