3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2024-11-22 06:29:23 +01:00

wired: Move system setup after aquiring bus name

This commit is contained in:
Marcel Holtmann 2018-09-15 21:40:32 +02:00
parent 405de7019c
commit 975e3714b8
3 changed files with 101 additions and 64 deletions

View File

@ -28,11 +28,19 @@
#include "wired/dbus.h"
static struct l_dbus *dbus;
static struct l_dbus *dbus = NULL;
struct dbus_info {
char *name;
dbus_ready_func_t ready_func;
void *user_data;
};
static void request_name_callback(struct l_dbus *dbus, bool success,
bool queued, void *user_data)
{
struct dbus_info *info = user_data;
if (!success) {
l_error("Failed to request D-Bus service Name");
l_main_quit();
@ -41,12 +49,17 @@ static void request_name_callback(struct l_dbus *dbus, bool success,
if (!l_dbus_object_manager_enable(dbus))
l_warn("Unable to register ObjectManager interface");
if (info->ready_func)
info->ready_func(info->user_data);
}
static void dbus_ready(void *user_data)
{
l_dbus_name_acquire(dbus, "net.connman.ead", false, false, true,
request_name_callback, NULL);
struct dbus_info *info = user_data;
l_dbus_name_acquire(dbus, info->name, false, false, true,
request_name_callback, info);
}
static void dbus_disconnected(void *user_data)
@ -55,22 +68,59 @@ static void dbus_disconnected(void *user_data)
l_main_quit();
}
bool dbus_init(void)
static void dbus_signal_handler(uint32_t signo, void *user_data)
{
dbus = l_dbus_new_default(L_DBUS_SYSTEM_BUS);
switch (signo) {
case SIGINT:
case SIGTERM:
l_info("Terminate");
l_main_quit();
break;
}
}
int dbus_run(enum l_dbus_bus bus, const char *name,
dbus_ready_func_t ready_func,
dbus_shutdown_func_t shutdown_func,
void *user_data,
dbus_destroy_func_t destroy)
{
struct dbus_info *info;
int exit_status;
if (dbus)
return EXIT_FAILURE;
if (!l_main_init())
return EXIT_FAILURE;
dbus = l_dbus_new_default(bus);
if (!dbus) {
l_error("Failed to initialize D-Bus");
return false;
return EXIT_FAILURE;
}
l_dbus_set_ready_handler(dbus, dbus_ready, dbus, NULL);
l_dbus_set_disconnect_handler(dbus, dbus_disconnected, NULL, NULL);
info = l_new(struct dbus_info, 1);
info->name = l_strdup(name);
info->ready_func = ready_func;
info->user_data = user_data;
return true;
}
l_dbus_set_ready_handler(dbus, dbus_ready, info, NULL);
l_dbus_set_disconnect_handler(dbus, dbus_disconnected, info, NULL);
exit_status = l_main_run_with_signal(dbus_signal_handler, info);
if (shutdown_func)
shutdown_func(info->user_data);
void dbus_exit(void)
{
l_dbus_destroy(dbus);
dbus = NULL;
if (destroy)
destroy(info->user_data);
l_free(info->name);
l_free(info);
return exit_status;
}

View File

@ -20,5 +20,15 @@
*
*/
bool dbus_init(void);
void dbus_exit(void);
enum l_dbus_bus;
typedef void (*dbus_ready_func_t) (void *user_data);
typedef void (*dbus_shutdown_func_t) (void *user_data);
typedef void (*dbus_destroy_func_t) (void *user_data);
int dbus_run(enum l_dbus_bus bus, const char *name,
dbus_ready_func_t ready_func,
dbus_shutdown_func_t shutdown_func,
void *user_data,
dbus_destroy_func_t destroy);

View File

@ -35,16 +35,29 @@
#include "wired/ethdev.h"
#include "wired/network.h"
static void signal_handler(struct l_signal *signal, uint32_t signo,
void *user_data)
struct main_opts {
const char *interfaces;
const char *nointerfaces;
};
static void dbus_ready(void *user_data)
{
switch (signo) {
case SIGINT:
case SIGTERM:
l_info("Terminate");
l_main_quit();
break;
}
struct main_opts *opts = user_data;
l_info("System ready");
eap_init(0);
network_init();
ethdev_init(opts->interfaces, opts->nointerfaces);
}
static void dbus_shutdown(void *user_data)
{
l_info("System shutdown");
ethdev_exit();
network_exit();
eap_exit();
}
static void usage(void)
@ -70,11 +83,7 @@ static const struct option main_options[] = {
int main(int argc, char *argv[])
{
struct l_signal *signal;
sigset_t mask;
int exit_status;
const char *interfaces = NULL;
const char *nointerfaces = NULL;
struct main_opts opts;
const char *debugopt = NULL;
for (;;) {
@ -86,10 +95,10 @@ int main(int argc, char *argv[])
switch (opt) {
case 'i':
interfaces = optarg;
opts.interfaces = optarg;
break;
case 'I':
nointerfaces = optarg;
opts.nointerfaces = optarg;
break;
case 'd':
if (optarg)
@ -117,43 +126,11 @@ int main(int argc, char *argv[])
l_log_set_stderr();
if (!l_main_init())
return EXIT_FAILURE;
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
sigaddset(&mask, SIGTERM);
signal = l_signal_create(&mask, signal_handler, NULL, NULL);
if (debugopt)
l_debug_enable(debugopt);
l_info("Authentication daemon version %s", VERSION);
exit_status = EXIT_FAILURE;
if (!dbus_init())
goto done;
eap_init(0);
network_init();
ethdev_init(interfaces, nointerfaces);
exit_status = EXIT_SUCCESS;
l_main_run();
ethdev_exit();
network_exit();
eap_exit();
dbus_exit();
done:
l_signal_remove(signal);
l_main_exit();
return exit_status;
return dbus_run(L_DBUS_SYSTEM_BUS, "net.connman.ead",
dbus_ready, dbus_shutdown, &opts, NULL);
}