void hostapd_ctrl_iface_deinit(struct hostapd_data *hapd) { struct wpa_ctrl_dst *dst, *prev; if (hapd->ctrl_sock > -1) { char *fname; eloop_unregister_read_sock(hapd->ctrl_sock); close(hapd->ctrl_sock); hapd->ctrl_sock = -1; fname = hostapd_ctrl_iface_path(hapd); if (fname) unlink(fname); free(fname); if (hapd->conf->ctrl_interface && rmdir(hapd->conf->ctrl_interface) < 0) { if (errno == ENOTEMPTY) { wpa_printf(MSG_DEBUG, "Control interface " "directory not empty - leaving it " "behind"); } else { perror("rmdir[ctrl_interface]"); } } } dst = hapd->ctrl_dst; while (dst) { prev = dst; dst = dst->next; free(prev); } }
int hostapd_ctrl_iface_init(struct hostapd_data *hapd) { struct sockaddr_un addr; int s = -1; char *fname = NULL; hapd->ctrl_sock = -1; if (hapd->conf->ctrl_interface == NULL) return 0; /* Jerry:soc nok. if (mkdir(hapd->conf->ctrl_interface, S_IRWXU | S_IRWXG) < 0) {*/ if (mkdir(hapd->conf->ctrl_interface, 777) < 0) { if (errno == EEXIST) { wpa_printf(MSG_DEBUG, "Using existing control " "interface directory."); } else { perror("mkdir[ctrl_interface]"); goto fail; } } if (hapd->conf->ctrl_interface_gid_set && chown(hapd->conf->ctrl_interface, 0, hapd->conf->ctrl_interface_gid) < 0) { perror("chown[ctrl_interface]"); return -1; } if (strlen(hapd->conf->ctrl_interface) + 1 + strlen(hapd->conf->iface) >= sizeof(addr.sun_path)) goto fail; s = socket(PF_UNIX, SOCK_DGRAM, 0); if (s < 0) { perror("socket(PF_UNIX)"); goto fail; } memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; fname = hostapd_ctrl_iface_path(hapd); if (fname == NULL) goto fail; strncpy(addr.sun_path, fname, sizeof(addr.sun_path)); if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror("bind(PF_UNIX)"); goto fail; } if (hapd->conf->ctrl_interface_gid_set && chown(fname, 0, hapd->conf->ctrl_interface_gid) < 0) { perror("chown[ctrl_interface/ifname]"); goto fail; } if (chmod(fname, S_IRWXU | S_IRWXG) < 0) { perror("chmod[ctrl_interface/ifname]"); goto fail; } free(fname); hapd->ctrl_sock = s; eloop_register_read_sock(s, hostapd_ctrl_iface_receive, hapd, NULL); return 0; fail: if (s >= 0) close(s); if (fname) { unlink(fname); free(fname); } return -1; }
int hostapd_ctrl_iface_init(struct hostapd_data *hapd) { struct sockaddr_un addr; int s = -1; char *fname = NULL; hapd->ctrl_sock = -1; if (hapd->conf->ctrl_interface == NULL) return 0; if (mkdir(hapd->conf->ctrl_interface, S_IRWXU | S_IRWXG) < 0) { if (errno == EEXIST) { wpa_printf(MSG_DEBUG, "Using existing control " "interface directory."); } else { perror("mkdir[ctrl_interface]"); goto fail; } } if (hapd->conf->ctrl_interface_gid_set && chown(hapd->conf->ctrl_interface, 0, hapd->conf->ctrl_interface_gid) < 0) { perror("chown[ctrl_interface]"); return -1; } if (strlen(hapd->conf->ctrl_interface) + 1 + strlen(hapd->conf->iface) >= sizeof(addr.sun_path)) goto fail; s = socket(PF_UNIX, SOCK_DGRAM, 0); if (s < 0) { perror("socket(PF_UNIX)"); goto fail; } memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; fname = hostapd_ctrl_iface_path(hapd); if (fname == NULL) goto fail; /* An existing socket could indicate that we are trying to run * program twice, but more likely it is left behind when a previous * instance crashed... remove it to be safe. */ (void) unlink(fname); hostapd_create_directory_path(fname); strncpy(addr.sun_path, fname, sizeof(addr.sun_path)); if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror("bind(PF_UNIX)"); goto fail; } if (hapd->conf->ctrl_interface_gid_set && chown(fname, 0, hapd->conf->ctrl_interface_gid) < 0) { perror("chown[ctrl_interface/ifname]"); goto fail; } if (chmod(fname, S_IRWXU | S_IRWXG) < 0) { perror("chmod[ctrl_interface/ifname]"); goto fail; } free(fname); hapd->ctrl_sock = s; eloop_register_read_sock(s, hostapd_ctrl_iface_receive, hapd, NULL); return 0; fail: if (s >= 0) close(s); if (fname) { unlink(fname); free(fname); } return -1; }
int hostapd_ctrl_iface_init(struct hostapd_data *hapd) { struct sockaddr_un addr; int s = -1; char *fname = NULL; hapd->ctrl_sock = -1; if (hapd->conf->ctrl_interface == NULL) return 0; #ifdef ANDROID os_snprintf(addr.sun_path, sizeof(addr.sun_path), "hostapd_%s", hapd->conf->ctrl_interface); s = android_get_control_socket(addr.sun_path); if (s >= 0) goto havesock; #endif if (mkdir(hapd->conf->ctrl_interface, S_IRWXU | S_IRWXG) < 0) { if (errno == EEXIST) { wpa_printf(MSG_DEBUG, "Using existing control " "interface directory."); #ifdef ANDROID fname = hostapd_ctrl_iface_path(hapd); if (fname) unlink(fname); free(fname); rmdir(hapd->conf->ctrl_interface); mkdir(hapd->conf->ctrl_interface, S_IRWXU | S_IRWXG); #endif /* ANDROID */ } else { perror("mkdir[ctrl_interface]"); goto fail; } } #ifdef ANDROID if (chown(hapd->conf->ctrl_interface, AID_SYSTEM, AID_WIFI) < 0) { perror("chown[ctrl_interface]"); } #endif /* ANDROID */ if (hapd->conf->ctrl_interface_gid_set && chown(hapd->conf->ctrl_interface, 0, hapd->conf->ctrl_interface_gid) < 0) { perror("chown[ctrl_interface]"); return -1; } if (os_strlen(hapd->conf->ctrl_interface) + 1 + os_strlen(hapd->conf->iface) >= sizeof(addr.sun_path)) goto fail; s = socket(PF_UNIX, SOCK_DGRAM, 0); if (s < 0) { perror("socket(PF_UNIX)"); goto fail; } os_memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; fname = hostapd_ctrl_iface_path(hapd); if (fname == NULL) goto fail; os_strlcpy(addr.sun_path, fname, sizeof(addr.sun_path)); if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { perror("bind(PF_UNIX)"); goto fail; } if (hapd->conf->ctrl_interface_gid_set && chown(fname, 0, hapd->conf->ctrl_interface_gid) < 0) { perror("chown[ctrl_interface/ifname]"); goto fail; } if (chmod(fname, S_IRWXU | S_IRWXG) < 0) { perror("chmod[ctrl_interface/ifname]"); goto fail; } os_free(fname); #ifdef ANDROID havesock: #endif hapd->ctrl_sock = s; eloop_register_read_sock(s, hostapd_ctrl_iface_receive, hapd, NULL); wpa_msg_register_cb(hostapd_ctrl_iface_msg_cb); return 0; fail: if (s >= 0) close(s); if (fname) { unlink(fname); os_free(fname); } return -1; }