nusb/usbd: cleanup

This commit is contained in:
cinap_lenrek 2014-06-03 21:40:30 +02:00
parent 0aa3af0934
commit 93d0474f77

View file

@ -91,9 +91,9 @@ procreqs(void)
Loop: Loop:
for(p = nil, r = reqfirst; r != nil; p = r, r = x){ for(p = nil, r = reqfirst; r != nil; p = r, r = x){
x = (Req*)r->aux; x = r->aux;
f = r->fid; f = r->fid;
e = (Event*)f->aux; e = f->aux;
if(e == evlast) if(e == evlast)
continue; continue;
if(e->dev->aux == f){ if(e->dev->aux == f){
@ -150,10 +150,10 @@ dirgen(int n, Dir *d, void *)
d->qid.type = 0; d->qid.type = 0;
else else
d->qid.type = QTDIR; d->qid.type = QTDIR;
d->uid = strdup(getuser()); d->uid = estrdup9p(getuser());
d->gid = strdup(d->uid); d->gid = estrdup9p(d->uid);
d->muid = strdup(d->uid); d->muid = estrdup9p(d->uid);
d->name = strdup(names[n+1]); d->name = estrdup9p(names[n+1]);
d->mode = 0555 | (d->qid.type << 24); d->mode = 0555 | (d->qid.type << 24);
d->atime = d->mtime = time(0); d->atime = d->mtime = time(0);
d->length = 0; d->length = 0;
@ -173,20 +173,19 @@ usbdwalk(Fid *fid, char *name, Qid *qid)
{ {
int i; int i;
if(fid->qid.path != Qroot)
return "not a directory";
if(strcmp(name, "..") == 0){ if(strcmp(name, "..") == 0){
fid->qid = (Qid) {Qroot, 0, QTDIR};
*qid = fid->qid; *qid = fid->qid;
return nil; return nil;
} }
if(fid->qid.path != Qroot) for(i = Qroot+1; i < Qmax; i++)
return "not a directory";
for(i = 0; i < Qmax; i++)
if(strcmp(name, names[i]) == 0){ if(strcmp(name, names[i]) == 0){
fid->qid = (Qid) {i, 0, 0}; fid->qid = (Qid) {i, 0, 0};
*qid = fid->qid; *qid = fid->qid;
return nil; return nil;
} }
return "does not exist"; return Enonexist;
} }
static void static void
@ -198,10 +197,6 @@ usbdread(Req *req)
respond(req, nil); respond(req, nil);
break; break;
case Qusbevent: case Qusbevent:
if(req->fid->aux == nil){
respond(req, "the front fell off");
return;
}
qlock(&evlock); qlock(&evlock);
addreader(req); addreader(req);
procreqs(); procreqs();
@ -217,7 +212,7 @@ static void
usbdstat(Req *req) usbdstat(Req *req)
{ {
if(dirgen(req->fid->qid.path - 1, &req->d, nil) < 0) if(dirgen(req->fid->qid.path - 1, &req->d, nil) < 0)
respond(req, "the front fell off"); respond(req, Enonexist);
else else
respond(req, nil); respond(req, nil);
} }
@ -225,9 +220,8 @@ usbdstat(Req *req)
static char * static char *
formatdev(Dev *d, int type) formatdev(Dev *d, int type)
{ {
Usbdev *u; Usbdev *u = d->usb;
u = d->usb;
return smprint("%s %d %.4x %.4x %.8lx\n", type ? "detach" : "attach", d->id, u->vid, u->did, u->csp); return smprint("%s %d %.4x %.4x %.8lx\n", type ? "detach" : "attach", d->id, u->vid, u->did, u->csp);
} }
@ -274,10 +268,10 @@ usbdopen(Req *req)
qlock(&hublock); qlock(&hublock);
qlock(&evlock); qlock(&evlock);
enumerate(&req->fid->aux); enumerate(&e);
e = req->fid->aux;
e->ref++;
e->prev--; e->prev--;
e->ref++;
req->fid->aux = e;
qunlock(&evlock); qunlock(&evlock);
qunlock(&hublock); qunlock(&hublock);
@ -288,18 +282,21 @@ usbdopen(Req *req)
static void static void
usbddestroyfid(Fid *fid) usbddestroyfid(Fid *fid)
{ {
if(fid->qid.path == Qusbevent){
Event *e; Event *e;
if(fid->qid.path == Qusbevent && fid->aux != nil){
qlock(&evlock); qlock(&evlock);
e = fid->aux; e = fid->aux;
if(e != nil){
fid->aux = nil;
if(e->dev != nil && e->dev->aux == fid){ if(e->dev != nil && e->dev->aux == fid){
e->dev->aux = nil; /* release device */ e->dev->aux = nil; /* release device */
procreqs(); procreqs();
} }
if(--e->ref == 0 && e->prev == 0) e->ref--;
while(e->ref == 0 && e->prev == 0 && e != evlast) while(e->ref == 0 && e->prev == 0 && e != evlast)
e = putevent(e); e = putevent(e);
}
qunlock(&evlock); qunlock(&evlock);
} }
} }
@ -311,7 +308,7 @@ usbdflush(Req *req)
qlock(&evlock); qlock(&evlock);
for(p = nil, r = reqfirst; r != nil; p = r, r = x){ for(p = nil, r = reqfirst; r != nil; p = r, r = x){
x = (Req*)r->aux; x = r->aux;
if(r == req->oldreq){ if(r == req->oldreq){
if(x == nil) if(x == nil)
reqlast = p; reqlast = p;
@ -355,10 +352,10 @@ attachdev(Port *p)
return 0; return 0;
} }
/* close control endpoint so driver can open it */
close(d->dfd); close(d->dfd);
d->dfd = -1; d->dfd = -1;
d->aux = nil; /* device initially unclaimed */
pushevent(d, formatdev(d, 0)); pushevent(d, formatdev(d, 0));
return 0; return 0;
} }
@ -366,9 +363,8 @@ attachdev(Port *p)
void void
detachdev(Port *p) detachdev(Port *p)
{ {
Dev *d; Dev *d = p->dev;
d = p->dev;
if(d->usb->class == Clhub) if(d->usb->class == Clhub)
return; return;
pushevent(d, formatdev(d, 1)); pushevent(d, formatdev(d, 1));
@ -413,7 +409,7 @@ main(int argc, char **argv)
free(d); free(d);
}else }else
for(i = 0; i < argc; i++) for(i = 0; i < argc; i++)
rendezvous(work, strdup(argv[i])); rendezvous(work, estrdup9p(argv[i]));
rendezvous(work, nil); rendezvous(work, nil);
postsharesrv(&usbdsrv, nil, "usb", "usbd"); postsharesrv(&usbdsrv, nil, "usb", "usbd");
exits(nil); exits(nil);