don't limit dump print with fixed buffers. this can lead to missing endpoints in the output, and a lot of wasted time. Reference: /n/sources/patch/maybe/usb-ufmt-limit Date: Tue Mar 11 11:02:08 CET 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/usb/lib/fs.c Tue Mar 11 11:01:07 2014 +++ /sys/src/cmd/usb/lib/fs.c Tue Mar 11 11:01:05 2014 @@ -647,6 +647,7 @@ user = getuser(); epoch = time(nil); + fmtinstall('H', encodefmt); fmtinstall('D', dirfmt); fmtinstall('M', dirmodefmt); fmtinstall('F', fcallfmt); --- /sys/src/cmd/usb/lib/dump.c Tue Mar 11 11:01:09 2014 +++ /sys/src/cmd/usb/lib/dump.c Tue Mar 11 11:01:08 2014 @@ -21,12 +21,12 @@ char* classname(int c) { - static char buf[30]; + static char buf[12]; if(c >= 0 && c < nelem(cnames)) return cnames[c]; else{ - seprint(buf, buf+30, "%d", c); + snprint(buf, sizeof(buf), "%d", c); return buf; } } @@ -49,26 +49,26 @@ return dbuff; } -static char * -seprintiface(char *s, char *e, Iface *i) +static int +fmtprintiface(Fmt *f, Iface *i) { int j; Altc *a; Ep *ep; char *eds, *ets; - s = seprint(s, e, "\t\tiface csp %s.%uld.%uld\n", + fmtprint(f, "\t\tiface csp %s.%uld.%uld\n", classname(Class(i->csp)), Subclass(i->csp), Proto(i->csp)); for(j = 0; j < Naltc; j++){ a=i->altc[j]; if(a == nil) break; - s = seprint(s, e, "\t\t alt %d attr %d ival %d", + fmtprint(f, "\t\t alt %d attr %d ival %d", j, a->attrib, a->interval); if(a->aux != nil) - s = seprint(s, e, " devspec %p\n", a->aux); + fmtprint(f, " devspec %p\n", a->aux); else - s = seprint(s, e, "\n"); + fmtprint(f, "\n"); } for(j = 0; j < Nep; j++){ ep = i->ep[j]; @@ -79,41 +79,39 @@ eds = edir[ep->dir]; if(ep->type <= nelem(etype)) ets = etype[ep->type]; - s = seprint(s, e, "\t\t ep id %d addr %d dir %s type %s" + fmtprint(f, "\t\t ep id %d addr %d dir %s type %s" " itype %d maxpkt %d ntds %d\n", ep->id, ep->addr, eds, ets, ep->isotype, ep->maxpkt, ep->ntds); } - return s; + return 0; } -static char* -seprintconf(char *s, char *e, Usbdev *d, int ci) +static int +fmtprintconf(Fmt *f, Usbdev *d, int ci) { int i; Conf *c; - char *hd; c = d->conf[ci]; - s = seprint(s, e, "\tconf: cval %d attrib %x %d mA\n", + fmtprint(f, "\tconf: cval %d attrib %x %d mA\n", c->cval, c->attrib, c->milliamps); for(i = 0; i < Niface; i++) if(c->iface[i] == nil) break; else - s = seprintiface(s, e, c->iface[i]); + fmtprintiface(f, c->iface[i]); for(i = 0; i < Nddesc; i++) if(d->ddesc[i] == nil) break; else if(d->ddesc[i]->conf == c){ - hd = hexstr((uchar*)&d->ddesc[i]->data, - d->ddesc[i]->data.bLength); - s = seprint(s, e, "\t\tdev desc %x[%d]: %s\n", + fmtprint(f, "\t\tdev desc %x[%d]: %.*lH\n", d->ddesc[i]->data.bDescriptorType, - d->ddesc[i]->data.bLength, hd); - free(hd); + d->ddesc[i]->data.bLength, + d->ddesc[i]->data.bLength, + &d->ddesc[i]->data); } - return s; + return 0; } int @@ -122,30 +120,26 @@ int i; Dev *d; Usbdev *ud; - char buf[1024]; - char *s, *e; - s = buf; - e = buf+sizeof(buf); d = va_arg(f->args, Dev*); if(d == nil) return fmtprint(f, "\n"); - s = seprint(s, e, "%s", d->dir); + fmtprint(f, "%s", d->dir); ud = d->usb; if(ud == nil) - return fmtprint(f, "%s %ld refs\n", buf, d->ref); - s = seprint(s, e, " csp %s.%uld.%uld", + return fmtprint(f, " %ld refs\n", d->ref); + fmtprint(f, " csp %s.%uld.%uld", classname(Class(ud->csp)), Subclass(ud->csp), Proto(ud->csp)); - s = seprint(s, e, " vid %#ux did %#ux", ud->vid, ud->did); - s = seprint(s, e, " refs %ld\n", d->ref); - s = seprint(s, e, "\t%s %s %s\n", ud->vendor, ud->product, ud->serial); + fmtprint(f, " vid %#.4ux did %#.4ux", ud->vid, ud->did); + fmtprint(f, " refs %ld\n", d->ref); + fmtprint(f, "\t%s %s %s\n", ud->vendor, ud->product, ud->serial); for(i = 0; i < Nconf; i++){ if(ud->conf[i] == nil) break; else - s = seprintconf(s, e, ud, i); + fmtprintconf(f, ud, i); } - return fmtprint(f, "%s", buf); + return 0; } char*