Cleaned up main() by splitting it into number of helper functions
This commit is contained in:
parent
b5b969e9c7
commit
5fa30f32da
1 changed files with 136 additions and 93 deletions
|
@ -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 (hostapd_global_run(&interfaces, daemonize, pid_file))
|
||||||
if (ret)
|
|
||||||
goto out;
|
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 (tnc && tncs_global_init() < 0) {
|
|
||||||
wpa_printf(MSG_ERROR, "Failed to initialize TNCS");
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue