Add code to re-use an existing ctrl_iface socket file
Port the code from wpa_supplicant to re-use an existing ctrl_iface socket file if the file does not seem to be in use. This allows hostapd to recover from unclean shutdown of the control interface.
This commit is contained in:
parent
826fff182f
commit
617d155547
1 changed files with 29 additions and 2 deletions
|
@ -484,9 +484,36 @@ int hostapd_ctrl_iface_init(struct hostapd_data *hapd)
|
||||||
goto fail;
|
goto fail;
|
||||||
os_strlcpy(addr.sun_path, fname, sizeof(addr.sun_path));
|
os_strlcpy(addr.sun_path, fname, sizeof(addr.sun_path));
|
||||||
if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
|
if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
|
||||||
|
wpa_printf(MSG_DEBUG, "ctrl_iface bind(PF_UNIX) failed: %s",
|
||||||
|
strerror(errno));
|
||||||
|
if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
|
||||||
|
wpa_printf(MSG_DEBUG, "ctrl_iface exists, but does not"
|
||||||
|
" allow connections - assuming it was left"
|
||||||
|
"over from forced program termination");
|
||||||
|
if (unlink(fname) < 0) {
|
||||||
|
perror("unlink[ctrl_iface]");
|
||||||
|
wpa_printf(MSG_ERROR, "Could not unlink "
|
||||||
|
"existing ctrl_iface socket '%s'",
|
||||||
|
fname);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) <
|
||||||
|
0) {
|
||||||
perror("bind(PF_UNIX)");
|
perror("bind(PF_UNIX)");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
wpa_printf(MSG_DEBUG, "Successfully replaced leftover "
|
||||||
|
"ctrl_iface socket '%s'", fname);
|
||||||
|
} else {
|
||||||
|
wpa_printf(MSG_INFO, "ctrl_iface exists and seems to "
|
||||||
|
"be in use - cannot override it");
|
||||||
|
wpa_printf(MSG_INFO, "Delete '%s' manually if it is "
|
||||||
|
"not used anymore", fname);
|
||||||
|
os_free(fname);
|
||||||
|
fname = NULL;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (hapd->conf->ctrl_interface_gid_set &&
|
if (hapd->conf->ctrl_interface_gid_set &&
|
||||||
chown(fname, 0, hapd->conf->ctrl_interface_gid) < 0) {
|
chown(fname, 0, hapd->conf->ctrl_interface_gid) < 0) {
|
||||||
|
|
Loading…
Reference in a new issue