summaryrefslogtreecommitdiff
path: root/package/network/utils/iwinfo/src/iwinfo_nl80211.c
diff options
context:
space:
mode:
Diffstat (limited to 'package/network/utils/iwinfo/src/iwinfo_nl80211.c')
-rw-r--r--package/network/utils/iwinfo/src/iwinfo_nl80211.c72
1 files changed, 69 insertions, 3 deletions
diff --git a/package/network/utils/iwinfo/src/iwinfo_nl80211.c b/package/network/utils/iwinfo/src/iwinfo_nl80211.c
index 33c6238..d69dc3d 100644
--- a/package/network/utils/iwinfo/src/iwinfo_nl80211.c
+++ b/package/network/utils/iwinfo/src/iwinfo_nl80211.c
@@ -1146,6 +1146,7 @@ static void nl80211_fill_signal(const char *ifname, struct nl80211_rssi_rate *r)
static int nl80211_get_bitrate(const char *ifname, int *buf)
{
+#if 0
struct nl80211_rssi_rate rr;
nl80211_fill_signal(ifname, &rr);
@@ -1157,10 +1158,14 @@ static int nl80211_get_bitrate(const char *ifname, int *buf)
}
return -1;
+#endif
+ return wext_ops.bitrate(ifname, buf);
+
}
static int nl80211_get_signal(const char *ifname, int *buf)
{
+#if 0
struct nl80211_rssi_rate rr;
nl80211_fill_signal(ifname, &rr);
@@ -1172,6 +1177,8 @@ static int nl80211_get_signal(const char *ifname, int *buf)
}
return -1;
+#endif
+ return wext_ops.signal(ifname, buf);
}
static int nl80211_get_noise_cb(struct nl_msg *msg, void *arg)
@@ -1881,11 +1888,70 @@ static int nl80211_get_scanlist_nl(const char *ifname, char *buf, int *len)
return *len ? 0 : -1;
}
+static int wpasupp_ssid_decode(const char *in, char *out, int outlen)
+{
+#define hex(x) \
+ (((x) >= 'a') ? ((x) - 'a' + 10) : \
+ (((x) >= 'A') ? ((x) - 'A' + 10) : ((x) - '0')))
+
+ int len = 0;
+
+ while (*in)
+ {
+ if (len + 1 >= outlen)
+ break;
+
+ switch (*in)
+ {
+ case '\\':
+ in++;
+ switch (*in)
+ {
+ case 'n':
+ out[len++] = '\n'; in++;
+ break;
+
+ case 'r':
+ out[len++] = '\r'; in++;
+ break;
+
+ case 't':
+ out[len++] = '\t'; in++;
+ break;
+
+ case 'e':
+ out[len++] = '\e'; in++;
+ break;
+
+ case 'x':
+ if (isxdigit(*(in+1)) && isxdigit(*(in+2)))
+ out[len++] = hex(*(in+1)) * 16 + hex(*(in+2));
+ in += 3;
+ break;
+
+ default:
+ out[len++] = *in++;
+ break;
+ }
+ break;
+
+ default:
+ out[len++] = *in++;
+ break;
+ }
+ }
+
+ if (outlen > len)
+ out[len] = '\0';
+
+ return len;
+}
+
static int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
{
int freq, rssi, qmax, count, mode;
char *res;
- char ssid[128] = { 0 };
+ char ssid[129] = { 0 };
char bssid[18] = { 0 };
char cipher[256] = { 0 };
@@ -1930,7 +1996,7 @@ static int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
count++;
goto nextline;
}
- if (sscanf(res, "%17s %d %d %255s%*[ \t]%127[^\n]\n",
+ if (sscanf(res, "%17s %d %d %255s%*[ \t]%128[^\n]\n",
bssid, &freq, &rssi, cipher, ssid) < 5)
{
/* skip malformed lines */
@@ -1945,7 +2011,7 @@ static int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
e->mac[5] = strtol(&bssid[15], NULL, 16);
/* SSID */
- memcpy(e->ssid, ssid, min(strlen(ssid), sizeof(e->ssid) - 1));
+ wpasupp_ssid_decode(ssid, e->ssid, sizeof(e->ssid));
/* Mode (assume master) */
if (strstr(cipher,"[MESH]"))