- don't include we're not using it. - be more careful about string descriptors - use %H and not hexstr(). avoid truncation, malloc, and extra code Reference: /n/atom/patch/applied/usbuseencodefmt Date: Sat Apr 19 16:12:21 CES 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/usb/lib/dev.c Sat Apr 19 16:10:56 2014 +++ /sys/src/cmd/usb/lib/dev.c Sat Apr 19 16:10:56 2014 @@ -242,13 +242,15 @@ if(sid == 0) return estrdup("none"); type = Rd2h|Rstd|Rdev; - nr = usbcmd(d, type, Rgetdesc, Dstr<<8|sid, 0, buf, sizeof(buf)); - if(nr < 4) + nr = usbcmd(d, type, Rgetdesc, Dstr<<8|sid, 0, buf, 9); + if(nr < 4){ langid = 0x0409; /* english */ + buf[0] = 0; + usbcmd(d, type, Rgetdesc, Dstr<<8|sid, langid, buf, 9); + } else langid = buf[3]<<8 | buf[2]; - nr = usbcmd(d, type, Rgetdesc, Dstr<<8|sid, langid, buf, sizeof(buf)); - + nr = usbcmd(d, type, Rgetdesc, Dstr<<8|sid, langid, buf, buf[0]); return mkstr(buf, nr); } @@ -395,7 +397,7 @@ int ndata, n; uchar *wp; uchar buf[8]; - char *hd, *rs; + char *rs; assert(d != nil); if(data == nil){ @@ -413,12 +415,10 @@ if(data != nil) memmove(wp+8, data, ndata); if(usbdebug>2){ - hd = hexstr(wp, ndata+8); rs = reqstr(type, req); - fprint(2, "%s: %s val %d|%d idx %d cnt %d out[%d] %s\n", + fprint(2, "%s: %s val %d|%d idx %d cnt %d out[%d] %.*H\n", d->dir, rs, value>>8, value&0xFF, - index, count, ndata+8, hd); - free(hd); + index, count, ndata+8, ndata+8, wp); } n = write(d->dfd, wp, 8+ndata); if(wp != buf) --- /sys/src/cmd/usb/lib/dump.c Sat Apr 19 16:10:56 2014 +++ /sys/src/cmd/usb/lib/dump.c Sat Apr 19 16:10:56 2014 @@ -1,7 +1,6 @@ #include #include #include -#include #include "usb.h" int usbdebug; @@ -29,24 +28,6 @@ snprint(buf, sizeof(buf), "%d", c); return buf; } -} - -char * -hexstr(void *a, int n) -{ - int i; - char *dbuff, *s, *e; - uchar *b; - - b = a; - dbuff = s = emallocz(1024, 0); - *s = 0; - e = s + 1024; - for(i = 0; i < n; i++) - s = seprint(s, e, " %.2ux", b[i]); - if(s == e) - fprint(2, "%s: usb/lib: hexdump: bug: small buffer\n", argv0); - return dbuff; } static int --- /sys/src/cmd/usb/lib/parse.c Sat Apr 19 16:10:56 2014 +++ /sys/src/cmd/usb/lib/parse.c Sat Apr 19 16:10:56 2014 @@ -1,24 +1,27 @@ #include #include #include -#include #include "usb.h" +static int +min(int a, int b) +{ + if(a < b) + return a; + return b; +} + int parsedev(Dev *xd, uchar *b, int n) { Usbdev *d; DDev *dd; - char *hd; d = xd->usb; assert(d != nil); dd = (DDev*)b; - if(usbdebug>1){ - hd = hexstr(b, Ddevlen); - fprint(2, "%s: parsedev %s: %s\n", argv0, xd->dir, hd); - free(hd); - } + if(usbdebug>1) + fprint(2, "%s: parsedev %s: %.*H\n", argv0, xd->dir, min(Ddevlen, n), b); if(dd->bLength < Ddevlen){ werrstr("short dev descr. (%d < %d)", dd->bLength, Ddevlen); return -1; @@ -163,7 +166,6 @@ Iface *ip; Ep *ep; Altc *altc; - char *hd; assert(d != nil && c != nil); tot = 0; @@ -176,12 +178,9 @@ while(n > 2 && b[0] != 0 && b[0] <= n){ len = b[0]; - if(usbdebug>1){ - hd = hexstr(b, len); - fprint(2, "%s:\t\tparsedesc %s %x[%d] %s\n", - argv0, dname(b[1]), b[1], b[0], hd); - free(hd); - } + if(usbdebug>1) + fprint(2, "%s:\t\tparsedesc %s %x[%d] %.*H\n", + argv0, dname(b[1]), b[1], b[0], len, b); switch(b[1]){ case Ddev: case Dconf: @@ -233,15 +232,11 @@ DConf* dc; int l; int nr; - char *hd; assert(d != nil && c != nil); dc = (DConf*)b; - if(usbdebug>1){ - hd = hexstr(b, Dconflen); - fprint(2, "%s:\tparseconf %s\n", argv0, hd); - free(hd); - } + if(usbdebug>1) + fprint(2, "%s:\tparseconf %.*H\n", argv0, min(Dconflen, n), b); if(dc->bLength < Dconflen){ werrstr("short configuration descriptor"); return -1; --- /sys/src/cmd/usb/lib/usb.h Sat Apr 19 16:10:56 2014 +++ /sys/src/cmd/usb/lib/usb.h Sat Apr 19 16:10:56 2014 @@ -341,7 +341,6 @@ char* estrdup(char *s); int matchdevcsp(char *info, void *a); int finddevs(int (*matchf)(char*,void*), void *farg, char** dirs, int ndirs); -char* hexstr(void *a, int n); int loaddevconf(Dev *d, int n); int loaddevdesc(Dev *d); char* loaddevstr(Dev *d, int sid); @@ -354,7 +353,6 @@ void startdevs(char *args, char *argv[], int argc, int (*mf)(char*,void*), void*ma, int (*df)(Dev*,int,char**)); int unstall(Dev *dev, Dev *ep, int dir); int usbcmd(Dev *d, int type, int req, int value, int index, uchar *data, int count); - extern int usbdebug; /* more messages for bigger values */