diff -r 077fe1dc73d0 sys/src/cmd/stats.c --- a/sys/src/cmd/stats.c Fri Jan 22 10:57:43 2021 +0100 +++ b/sys/src/cmd/stats.c Fri Jan 22 15:03:51 2021 -0800 @@ -86,6 +86,9 @@ char buf[8*1024]; char *bufp; char *ebufp; + + /* for new wifi stack */ + char *essid; }; enum @@ -471,6 +474,76 @@ } int +readessid(Machine *m) +{ + char *p, *ep; + int l; + + if(strncmp(m->bufp, "essid: ", 7) == 0){ + p = m->bufp + 7; + + for(ep=p; epebufp; ep++) + if(*ep == '\n') + break; + + if (m->essid != nil) { + free(m->essid); + m->essid = nil; + } + + l = ep-p; + if (l == 0) + return 0; + + m->essid = malloc(l+1); + if (m->essid == nil) + return 0; + + m->essid[l] = '\0'; + memcpy(m->essid, p, l); + return 1; + } + + return 0; +} + +int +readrssi(Machine *m, uvlong *a) +{ + char *p, *e; + static uvlong last[5]; + int i; + + p = strstr(m->bufp, "status: "); + if (p == nil) + return 0; + p += 8; + if (strncmp(p, "associated", 10) != 0) { + a[0] = 0; + return 1; + } + + for(e = m->bufp; *e != '\n'; e++); + e = strstr(e, m->essid); + if (e == nil) + return 0; + + for(p = e; p>m->bufp && *p != '\n'; p--); + if (p == m->bufp) + return 0; + p += 25; + + memmove(&last[1], last, sizeof(uvlong) * 4); + last[0] = strtoull(p, &p, 12); + a[0] = 0; + for(i = 0; i < 5; i++) + a[0] += last[i]; + a[0] = -(a[0] / 60) - 45; /* scale for wavelan type */ + + return 1; +} + +int readswap(Machine *m, uvlong *a) { static int xxx = 0; @@ -615,7 +688,7 @@ m->ifstatsfd = open(buf, OREAD); if(loadbuf(m, &m->ifstatsfd)){ /* need to check that this is a wavelan interface */ - if(strncmp(m->buf, "Signal: ", 8) == 0 && readnums(m, nelem(m->netetherifstats), a, 1)) + if((strncmp(m->buf, "Signal: ", 8) == 0 && readnums(m, nelem(m->netetherifstats), a, 1)) || (readessid(m) && readrssi(m, a))) memmove(m->netetherifstats, a, sizeof m->netetherifstats); } @@ -752,7 +825,7 @@ memmove(m->prevetherstats, m->netetherstats, sizeof m->netetherstats); memmove(m->netetherstats, a, sizeof m->netetherstats); } - if(needsignal(init) && loadbuf(m, &m->ifstatsfd) && strncmp(m->buf, "Signal: ", 8)==0 && readnums(m, nelem(m->netetherifstats), a, 1)){ + if(needsignal(init) && loadbuf(m, &m->ifstatsfd) && (strncmp(m->buf, "Signal: ", 8)==0 && readnums(m, nelem(m->netetherifstats), a, 1)) || (readessid(m) && readrssi(m, a))){ memmove(m->netetherifstats, a, sizeof m->netetherifstats); } if(needbattery(init)){