diff --git a/hostapd/main.c b/hostapd/main.c index bc61db180..4e9fe404d 100644 --- a/hostapd/main.c +++ b/hostapd/main.c @@ -693,6 +693,7 @@ int main(int argc, char *argv[]) * In such case, the interface will be enabled from eloop context within * hostapd_global_run(). */ + interfaces.terminate_on_error = interfaces.count; for (i = 0; i < interfaces.count; i++) { if (hostapd_driver_init(interfaces.iface[i]) || hostapd_setup_interface(interfaces.iface[i])) diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c index 5d51c7771..52be3110d 100644 --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c @@ -1082,7 +1082,8 @@ int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err) if (err) { wpa_printf(MSG_ERROR, "Interface initialization failed"); hostapd_set_state(iface, HAPD_IFACE_DISABLED); - eloop_terminate(); + if (iface->interfaces && iface->interfaces->terminate_on_error) + eloop_terminate(); return -1; } @@ -1187,6 +1188,8 @@ int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err) wpa_printf(MSG_DEBUG, "%s: Setup of interface done.", iface->bss[0]->conf->iface); + if (iface->interfaces && iface->interfaces->terminate_on_error > 0) + iface->interfaces->terminate_on_error--; return 0; } diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h index 05bcb6202..adb3728d7 100644 --- a/src/ap/hostapd.h +++ b/src/ap/hostapd.h @@ -45,6 +45,8 @@ struct hapd_interfaces { gid_t ctrl_iface_group; struct hostapd_iface **iface; struct hostapd_dynamic_iface **dynamic_iface; + + size_t terminate_on_error; }; enum hostapd_chan_status {