diff options
Diffstat (limited to 'src/iwapi.c')
-rw-r--r-- | src/iwapi.c | 76 |
1 files changed, 42 insertions, 34 deletions
diff --git a/src/iwapi.c b/src/iwapi.c index f5338f6..5d8afe8 100644 --- a/src/iwapi.c +++ b/src/iwapi.c @@ -44,7 +44,7 @@ int iw_set_essid(struct interface *i, const char* essid) { } if (ioctl(i->fd, SIOCSIWESSID, &req) < 0) { - daemon_log(LOG_ERR, "ioctl(SIOCSIWESSID): %s\n", strerror(errno)); + daemon_log(LOG_ERR, "ioctl(SIOCSIWESSID): %s", strerror(errno)); return -1; } @@ -60,28 +60,28 @@ int iw_set_mode(struct interface *i, int m) { req.u.mode = m; if (ioctl(i->fd, SIOCSIWMODE, &req) < 0) { - daemon_log(LOG_ERR, "ioctl(SIOCSIWMODE): %s\n", strerror(errno)); + daemon_log(LOG_ERR, "ioctl(SIOCSIWMODE): %s", strerror(errno)); return -1; } return 0; } -int iw_set_freq(struct interface *i, const struct iw_freq *f) { - struct iwreq req; - assert(i && f); +/* int iw_set_freq(struct interface *i, const struct iw_freq *f) { */ +/* struct iwreq req; */ +/* assert(i && f); */ - memset(&req, 0, sizeof(req)); - strncpy(req.ifr_ifrn.ifrn_name, i->name, IFNAMSIZ); - req.u.freq = *f; +/* memset(&req, 0, sizeof(req)); */ +/* strncpy(req.ifr_ifrn.ifrn_name, i->name, IFNAMSIZ); */ +/* req.u.freq = *f; */ - if (ioctl(i->fd, SIOCSIWFREQ, &req) < 0) { - daemon_log(LOG_ERR, "ioctl(SIOCSIWFREQ): %s\n", strerror(errno)); - return -1; - } +/* if (ioctl(i->fd, SIOCSIWFREQ, &req) < 0) { */ +/* daemon_log(LOG_ERR, "ioctl(SIOCSIWFREQ): %s", strerror(errno)); */ +/* return -1; */ +/* } */ - return 0; -} +/* return 0; */ +/* } */ int iw_set_ap(struct interface *i, const struct hw_addr *ap) { struct iwreq req; @@ -94,7 +94,7 @@ int iw_set_ap(struct interface *i, const struct hw_addr *ap) { memcpy(req.u.ap_addr.sa_data, ap->addr, ETH_ALEN); if (ioctl(i->fd, SIOCSIWAP, &req) < 0) { - daemon_log(LOG_ERR, "ioctl(SIOCSIWAP): %s\n", strerror(errno)); + daemon_log(LOG_ERR, "ioctl(SIOCSIWAP): %s", strerror(errno)); return -1; } @@ -105,6 +105,12 @@ int iw_scan(struct interface *i) { struct iwreq req; assert(i); + daemon_log(LOG_INFO, "Scanning..."); + + iw_set_mode(i, IW_MODE_INFRA); + iw_set_essid(i, NULL); + /* Due to driver issues, the return codes of these function calls are no longer evaluated */ + memset(&req, 0, sizeof(req)); strncpy(req.ifr_ifrn.ifrn_name, i->name, IFNAMSIZ); @@ -112,7 +118,7 @@ int iw_scan(struct interface *i) { req.u.param.value = 0; if (ioctl(i->fd, SIOCSIWSCAN, &req) < 0) { - daemon_log(LOG_ERR, "ioctl(SIOCSIWSCAN): %s\n", strerror(errno)); + daemon_log(LOG_ERR, "ioctl(SIOCSIWSCAN): %s", strerror(errno)); return -1; } @@ -140,7 +146,7 @@ int iw_scan_result(struct interface *i, int (*callback)(struct ap_info* ap)) { if (errno == EAGAIN) return 1; - daemon_log(LOG_ERR, "ioctl(SIOCGIWSCAN): %s\n", strerror(errno)); + daemon_log(LOG_ERR, "ioctl(SIOCGIWSCAN): %s", strerror(errno)); return -1; } @@ -148,9 +154,11 @@ int iw_scan_result(struct interface *i, int (*callback)(struct ap_info* ap)) { l = req.u.data.length; f = 0; hs = sizeof(struct iw_event)-sizeof(union iwreq_data); + while (l >= sizeof(struct iw_event)) { + if (e->len < hs) { - daemon_log(LOG_ERR, "Recieved bogus wireless event\n"); + daemon_log(LOG_ERR, "Recieved bogus wireless event"); return -1; } @@ -162,9 +170,9 @@ int iw_scan_result(struct interface *i, int (*callback)(struct ap_info* ap)) { case SIOCGIWAP: f = 1; - + if (e->len < hs + sizeof(struct sockaddr)) { - daemon_log(LOG_ERR, "Corrupt scan result (1)\n"); + daemon_log(LOG_ERR, "Corrupt scan result (1)"); return -1; } @@ -175,7 +183,7 @@ int iw_scan_result(struct interface *i, int (*callback)(struct ap_info* ap)) { case SIOCGIWESSID: if (e->len < hs + sizeof(struct iw_point)) { - daemon_log(LOG_ERR, "Corrupt scan result (2)\n"); + daemon_log(LOG_ERR, "Corrupt scan result (2)"); return -1; } @@ -189,7 +197,7 @@ int iw_scan_result(struct interface *i, int (*callback)(struct ap_info* ap)) { case SIOCGIWMODE: if (e->len < hs + sizeof(__u32)) { - daemon_log(LOG_ERR, "Corrupt scan result (3)\n"); + daemon_log(LOG_ERR, "Corrupt scan result (3)"); return -1; } @@ -203,7 +211,7 @@ int iw_scan_result(struct interface *i, int (*callback)(struct ap_info* ap)) { case SIOCGIWFREQ: if (e->len < hs + sizeof(struct iw_freq)) { - daemon_log(LOG_ERR, "Corrupt scan result (4)\n"); + daemon_log(LOG_ERR, "Corrupt scan result (4)"); return -1; } @@ -233,7 +241,7 @@ int iw_tune(struct interface *i, struct ap_info *ap) { /* We are not interested in the return values of these functions due to driver issues */ iw_set_mode(i, IW_MODE_INFRA); iw_set_essid(i, ap->essid); - iw_set_freq(i, &ap->freq); + //iw_set_freq(i, &ap->freq); iw_set_ap(i, &ap->ap); return 0; @@ -247,7 +255,7 @@ int iw_get_ap(struct interface *i, struct hw_addr *ap) { strncpy(req.ifr_ifrn.ifrn_name, i->name, IFNAMSIZ); if (ioctl(i->fd, SIOCGIWAP, &req) < 0) { - daemon_log(LOG_ERR, "ioctl(SIOCGIWAP): %s\n", strerror(errno)); + daemon_log(LOG_ERR, "ioctl(SIOCGIWAP): %s", strerror(errno)); return -1; } @@ -269,7 +277,7 @@ int iw_get_essid(struct interface *i, char *essid) { req.u.essid.flags = 1; if (ioctl(i->fd, SIOCGIWESSID, &req) < 0) { - daemon_log(LOG_ERR, "ioctl(SIOCGSIWESSID): %s\n", strerror(errno)); + daemon_log(LOG_ERR, "ioctl(SIOCGSIWESSID): %s", strerror(errno)); return -1; } @@ -286,7 +294,7 @@ int iw_get_mode(struct interface *i, int *m) { req.u.mode = 0; if (ioctl(i->fd, SIOCGIWMODE, &req) < 0) { - daemon_log(LOG_ERR, "ioctl(SIOCGIWMODE): %s\n", strerror(errno)); + daemon_log(LOG_ERR, "ioctl(SIOCGIWMODE): %s", strerror(errno)); return -1; } @@ -302,8 +310,8 @@ int iw_get_freq(struct interface *i, struct iw_freq *f) { strncpy(req.ifr_ifrn.ifrn_name, i->name, IFNAMSIZ); if (ioctl(i->fd, SIOCGIWFREQ, &req) < 0) { - daemon_log(LOG_ERR, "ioctl(SIOCGIWFREQ): %s\n", strerror(errno)); - return -1; + memset(f, 0, sizeof(struct iw_freq)); /* hostap 0.1.2 fails to report the freq sometimes */ + return 0; } *f = req.u.freq; @@ -339,7 +347,7 @@ int iw_assoc(struct interface *i, struct ap_info *ap) { req.u.data.flags = 1; if (ioctl(i->fd, SIOCGIWSTATS, &req) < 0) { - daemon_log(LOG_ERR, "Failed to get interface quality\n"); + daemon_log(LOG_ERR, "Failed to get interface quality"); return -1; } @@ -352,7 +360,7 @@ int iw_assoc(struct interface *i, struct ap_info *ap) { req.u.data.flags = 0; if (ioctl(i->fd, SIOCGIWRANGE, &req) < 0) { - fprintf(stderr, "SIOCGIWRANGE failed: %s\n", strerror(errno)); + fprintf(stderr, "SIOCGIWRANGE failed: %s", strerror(errno)); return -1; } @@ -368,9 +376,9 @@ int iw_assoc(struct interface *i, struct ap_info *ap) { if (iw_get_essid(i, ap->essid) < 0) return -1; - + if (iw_get_freq(i, &ap->freq) < 0) - memset(&ap->freq, 0, sizeof(ap->freq)); /* hostap 0.1.2 fails to report the freq sometimes */ + return -1; } return 1; @@ -379,5 +387,5 @@ int iw_assoc(struct interface *i, struct ap_info *ap) { int iw_ap_info_equal(const struct ap_info *a, const struct ap_info *b) { assert(a && b); - return !strcmp(a->essid, b->essid) && !memcmp(&a->freq, &b->freq, sizeof(a->freq)); + return !strcmp(a->essid, b->essid) && !memcmp(&a->ap, &b->ap, sizeof(struct hw_addr)); } |