diff options
Diffstat (limited to 'iw_if.c')
-rw-r--r-- | iw_if.c | 34 |
1 files changed, 27 insertions, 7 deletions
@@ -39,16 +39,20 @@ static int if_get_flags(int skfd, const char *ifname) return ifr.ifr_flags; } -/* Return true if @ifname is known to be up */ +/* Return true if @ifname is known to be up. */ bool if_is_up(int skfd, const char *ifname) { return if_get_flags(skfd, ifname) & IFF_UP; } /** Bring @ifname up if not already up. Return 0 if ok, < 0 on error. */ -int if_set_up(int skfd, const char *ifname) +int if_set_up(const char *ifname) { struct ifreq ifr; + int ret, skfd = socket(AF_INET, SOCK_DGRAM, 0); + + if (skfd < 0) + err_sys("%s: can not open socket", __func__); memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1); @@ -58,7 +62,9 @@ int if_set_up(int skfd, const char *ifname) return 0; ifr.ifr_flags |= IFF_UP; - return ioctl(skfd, SIOCSIFFLAGS, &ifr); + ret = ioctl(skfd, SIOCSIFFLAGS, &ifr); + close(skfd); + return ret; } /* Interface information */ @@ -128,6 +134,8 @@ char **iw_get_interface_list(void) continue; if_list = realloc(if_list, sizeof(char *) * (nifs + 1)); + if (if_list == NULL) + err_sys("can not reallocate interface list"); if_list[nifs-1] = strdup(p); if_list[nifs++] = NULL; } @@ -157,7 +165,7 @@ void if_getstat(const char *ifname, struct if_stat *stat) lp += strlen(ifname) + 1; lp += strspn(lp, " "); - sscanf(lp, "%llu %llu %lu %lu %lu %lu %lu %lu %llu %llu", + sscanf(lp, "%Lu %Lu %lu %lu %lu %lu %lu %lu %Lu %Lu", &stat->rx_bytes, &stat->rx_packets, &d, &d, &d, &d, &d, &d, &stat->tx_bytes, &stat->tx_packets); } @@ -304,7 +312,9 @@ void dyn_info_cleanup(struct iw_dyn_info *info) /* - * get range information + * Request range information for a given wireless interface. + * @ifname: name of the wireless argument + * @range: storage location to populate with range information. */ void iw_getinf_range(const char *ifname, struct iw_range *range) { @@ -468,6 +478,17 @@ void iw_getstat(struct iw_stat *iw) iw_sanitize(&iw->range, &iw->stat.qual, &iw->dbm); } +const char *we_version(void) +{ + static char buf[BUFSIZ]; + struct iw_stat iw; + + iw_getinf_range(conf_ifname(), &iw.range); + sprintf(buf, "wireless extensions v%d (source v%d)", + iw.range.we_version_compiled, iw.range.we_version_source); + return buf; +} + void dump_parameters(void) { struct iw_dyn_info info; @@ -501,8 +522,7 @@ void dump_parameters(void) } printf("\n"); } - printf(" WE version: %d (source version %d)\n\n", - iw.range.we_version_compiled, iw.range.we_version_source); + printf("\n"); if (info.cap_essid) { if (info.essid_ct > 1) |