static void scan_and_wait(prop_dictionary_t env) { int sroute; sroute = prog_socket(PF_ROUTE, SOCK_RAW, 0); if (sroute < 0) { warn("socket(PF_ROUTE,SOCK_RAW)"); return; } /* NB: only root can trigger a scan so ignore errors */ if (set80211(env, IEEE80211_IOC_SCAN_REQ, 0, 0, NULL) >= 0) { char buf[2048]; struct if_announcemsghdr *ifan; struct rt_msghdr *rtm; do { if (prog_read(sroute, buf, sizeof(buf)) < 0) { warn("read(PF_ROUTE)"); break; } rtm = (struct rt_msghdr *) buf; if (rtm->rtm_version != RTM_VERSION) break; ifan = (struct if_announcemsghdr *) rtm; } while (rtm->rtm_type != RTM_IEEE80211 || ifan->ifan_what != RTM_IEEE80211_SCAN); } prog_close(sroute); }
static int setapbridge(prop_dictionary_t env, prop_dictionary_t oenv) { bool on, rc; rc = prop_dictionary_get_bool(env, "apbridge", &on); assert(rc); return set80211(env, IEEE80211_IOC_APBRIDGE, on ? 1 : 0, 0, NULL); }
static int sethidessid(prop_dictionary_t env, prop_dictionary_t oenv) { bool on, rc; rc = prop_dictionary_get_bool(env, "hidessid", &on); assert(rc); return set80211(env, IEEE80211_IOC_HIDESSID, on ? 1 : 0, 0, NULL); }
static int setiffrag(prop_dictionary_t env, prop_dictionary_t oenv) { bool rc; int16_t val; rc = prop_dictionary_get_int16(env, "frag", &val); assert(rc); if (set80211(env, IEEE80211_IOC_FRAGTHRESHOLD, val, 0, NULL) == -1) err(EXIT_FAILURE, "IEEE80211_IOC_FRAGTHRESHOLD"); return 0; }
static void set80211nwkey(const char* dev, const char* val, int s) { int txkey; int i; int len; u_int8_t data[IEEE80211_KEYBUF_SIZE]; set80211(s, dev, IEEE80211_IOC_WEP, IEEE80211_WEP_ON, 0, NULL); if (isdigit((int)val[0]) && val[1] == ':') { txkey = val[0] - '0' - 1; val += 2; for (i = 0; i < 4; i++) { bzero(data, sizeof(data)); len = sizeof(data); val = get_string(val, ",", data, &len); if (val == NULL) exit(1); set80211(s, dev, IEEE80211_IOC_WEPKEY, i, len, data); } } else { bzero(data, sizeof(data)); len = sizeof(data); get_string(val, NULL, data, &len); txkey = 0; set80211(s, dev, IEEE80211_IOC_WEPKEY, 0, len, data); bzero(data, sizeof(data)); for (i = 1; i < 4; i++) set80211(s, dev, IEEE80211_IOC_WEPKEY, i, 0, data); } set80211(s, dev, IEEE80211_IOC_WEPTXKEY, txkey, 0, NULL); }
static void set80211ssid(const char* dev, const char* val, int s) { int ssid; int len; u_int8_t data[IEEE80211_NWID_LEN]; ssid = 0; len = strlen(val); if (len > 2 && isdigit((int)val[0]) && val[1] == ':') { ssid = atoi(val) - 1; val += 2; } bzero(data, sizeof(data)); len = sizeof(data); if (get_string(val, NULL, data, &len) == NULL) exit(1); set80211(s, dev, IEEE80211_IOC_SSID, ssid, len, data); }