Cleaned up main() by splitting it into number of helper functions

This commit is contained in:
Jouni Malinen 2009-01-09 18:04:57 +02:00 committed by Jouni Malinen
parent b5b969e9c7
commit 5fa30f32da

View file

@ -1789,16 +1789,140 @@ fail:
} }
static int hostapd_global_init(struct hapd_interfaces *interfaces)
{
hostapd_logger_register_cb(hostapd_logger_cb);
if (eap_server_register_methods()) {
wpa_printf(MSG_ERROR, "Failed to register EAP methods");
return -1;
}
if (eloop_init(interfaces)) {
wpa_printf(MSG_ERROR, "Failed to initialize event loop");
return -1;
}
#ifndef CONFIG_NATIVE_WINDOWS
eloop_register_signal(SIGHUP, handle_reload, NULL);
eloop_register_signal(SIGUSR1, handle_dump_state, NULL);
#endif /* CONFIG_NATIVE_WINDOWS */
eloop_register_signal_terminate(handle_term, NULL);
#ifndef CONFIG_NATIVE_WINDOWS
openlog("hostapd", 0, LOG_DAEMON);
#endif /* CONFIG_NATIVE_WINDOWS */
return 0;
}
static void hostapd_global_deinit(const char *pid_file)
{
#ifdef EAP_TNC
tncs_global_deinit();
#endif /* EAP_TNC */
eloop_destroy();
#ifndef CONFIG_NATIVE_WINDOWS
closelog();
#endif /* CONFIG_NATIVE_WINDOWS */
eap_server_unregister_methods();
os_daemonize_terminate(pid_file);
}
static void hostapd_interface_deinit(struct hostapd_iface *iface)
{
size_t j;
if (iface == NULL)
return;
hostapd_cleanup_iface_pre(iface);
for (j = 0; j < iface->num_bss; j++) {
struct hostapd_data *hapd = iface->bss[j];
hostapd_free_stas(hapd);
hostapd_flush_old_stations(hapd);
hostapd_cleanup(hapd);
if (j == iface->num_bss - 1 && hapd->driver)
hostapd_driver_deinit(hapd);
}
for (j = 0; j < iface->num_bss; j++)
os_free(iface->bss[j]);
hostapd_cleanup_iface(iface);
}
static struct hostapd_iface * hostapd_interface_init(const char *config_fname,
int debug)
{
struct hostapd_iface *iface;
int k;
wpa_printf(MSG_ERROR, "Configuration file: %s", config_fname);
iface = hostapd_init(config_fname);
if (!iface)
return NULL;
for (k = 0; k < debug; k++) {
if (iface->bss[0]->conf->logger_stdout_level > 0)
iface->bss[0]->conf->logger_stdout_level--;
}
if (hostapd_setup_interface(iface)) {
hostapd_interface_deinit(iface);
return NULL;
}
return iface;
}
static int hostapd_global_run(struct hapd_interfaces *ifaces, int daemonize,
const char *pid_file)
{
#ifdef EAP_TNC
int tnc = 0;
size_t i, k;
for (i = 0; !tnc && i < ifaces->count; i++) {
for (k = 0; k < ifaces->iface[i]->num_bss; k++) {
if (ifaces->iface[i]->bss[0]->conf->tnc) {
tnc++;
break;
}
}
}
if (tnc && tncs_global_init() < 0) {
wpa_printf(MSG_ERROR, "Failed to initialize TNCS");
return -1;
}
#endif /* EAP_TNC */
if (daemonize && os_daemonize(pid_file)) {
perror("daemon");
return -1;
}
eloop_run();
return 0;
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
struct hapd_interfaces interfaces; struct hapd_interfaces interfaces;
int ret = 1, k; int ret = 1;
size_t i, j; size_t i;
int c, debug = 0, daemonize = 0, tnc = 0; int c, debug = 0, daemonize = 0;
const char *pid_file = NULL; const char *pid_file = NULL;
hostapd_logger_register_cb(hostapd_logger_cb);
for (;;) { for (;;) {
c = getopt(argc, argv, "BdhKP:tv"); c = getopt(argc, argv, "BdhKP:tv");
if (c < 0) if (c < 0)
@ -1838,13 +1962,7 @@ int main(int argc, char *argv[])
if (optind == argc) if (optind == argc)
usage(); usage();
if (eap_server_register_methods()) {
wpa_printf(MSG_ERROR, "Failed to register EAP methods");
return -1;
}
interfaces.count = argc - optind; interfaces.count = argc - optind;
interfaces.iface = os_malloc(interfaces.count * interfaces.iface = os_malloc(interfaces.count *
sizeof(struct hostapd_iface *)); sizeof(struct hostapd_iface *));
if (interfaces.iface == NULL) { if (interfaces.iface == NULL) {
@ -1852,104 +1970,29 @@ int main(int argc, char *argv[])
return -1; return -1;
} }
if (eloop_init(&interfaces)) { if (hostapd_global_init(&interfaces))
wpa_printf(MSG_ERROR, "Failed to initialize event loop");
return -1; return -1;
}
#ifndef CONFIG_NATIVE_WINDOWS
eloop_register_signal(SIGHUP, handle_reload, NULL);
eloop_register_signal(SIGUSR1, handle_dump_state, NULL);
#endif /* CONFIG_NATIVE_WINDOWS */
eloop_register_signal_terminate(handle_term, NULL);
/* Initialize interfaces */ /* Initialize interfaces */
for (i = 0; i < interfaces.count; i++) { for (i = 0; i < interfaces.count; i++) {
wpa_printf(MSG_ERROR, "Configuration file: %s", interfaces.iface[i] = hostapd_interface_init(argv[optind + i],
argv[optind + i]); debug);
interfaces.iface[i] = hostapd_init(argv[optind + i]);
if (!interfaces.iface[i]) if (!interfaces.iface[i])
goto out; goto out;
for (k = 0; k < debug; k++) {
if (interfaces.iface[i]->bss[0]->conf->
logger_stdout_level > 0)
interfaces.iface[i]->bss[0]->conf->
logger_stdout_level--;
}
ret = hostapd_setup_interface(interfaces.iface[i]);
if (ret)
goto out;
for (k = 0; k < (int) interfaces.iface[i]->num_bss; k++) {
if (interfaces.iface[i]->bss[0]->conf->tnc)
tnc++;
}
} }
#ifdef EAP_TNC if (hostapd_global_run(&interfaces, daemonize, pid_file))
if (tnc && tncs_global_init() < 0) {
wpa_printf(MSG_ERROR, "Failed to initialize TNCS");
goto out; goto out;
}
#endif /* EAP_TNC */
if (daemonize && os_daemonize(pid_file)) {
perror("daemon");
goto out;
}
#ifndef CONFIG_NATIVE_WINDOWS
openlog("hostapd", 0, LOG_DAEMON);
#endif /* CONFIG_NATIVE_WINDOWS */
eloop_run();
/* Disconnect associated stations from all interfaces and BSSes */
for (i = 0; i < interfaces.count; i++) {
for (j = 0; j < interfaces.iface[i]->num_bss; j++) {
struct hostapd_data *hapd =
interfaces.iface[i]->bss[j];
hostapd_free_stas(hapd);
hostapd_flush_old_stations(hapd);
}
}
ret = 0; ret = 0;
out: out:
/* Deinitialize all interfaces */ /* Deinitialize all interfaces */
for (i = 0; i < interfaces.count; i++) { for (i = 0; i < interfaces.count; i++)
if (!interfaces.iface[i]) hostapd_interface_deinit(interfaces.iface[i]);
continue;
hostapd_cleanup_iface_pre(interfaces.iface[i]);
for (j = 0; j < interfaces.iface[i]->num_bss; j++) {
struct hostapd_data *hapd =
interfaces.iface[i]->bss[j];
hostapd_cleanup(hapd);
if (j == interfaces.iface[i]->num_bss - 1 &&
hapd->driver)
hostapd_driver_deinit(hapd);
}
for (j = 0; j < interfaces.iface[i]->num_bss; j++)
os_free(interfaces.iface[i]->bss[j]);
hostapd_cleanup_iface(interfaces.iface[i]);
}
os_free(interfaces.iface); os_free(interfaces.iface);
#ifdef EAP_TNC hostapd_global_deinit(pid_file);
tncs_global_deinit();
#endif /* EAP_TNC */
eloop_destroy();
#ifndef CONFIG_NATIVE_WINDOWS
closelog();
#endif /* CONFIG_NATIVE_WINDOWS */
eap_server_unregister_methods();
os_daemonize_terminate(pid_file);
return ret; return ret;
} }