21 static char Enonexist[] = "does not exist";
23 typedef struct Event Event;
32 static Event *evfirst, *evlast;
33 static Req *reqfirst, *reqlast;
48 fulfill(Req *req, Event *e)
53 if(n > req->ifcall.count)
54 n = req->ifcall.count;
55 memmove(req->ofcall.data, e->data, n);
56 req->ofcall.count = n;
62 evfirst = mallocz(sizeof(*evfirst), 1);
64 sysfatal("malloc: %r");
81 req->fid->aux = e->link;
83 if(--e->ref == 0 && e == evfirst){
100 ee = emallocz(sizeof(Event), 1);
102 sysfatal("malloc: %r");
105 e->len = strlen(data);
107 for(r = reqfirst; r != nil; r = rr){
116 if(e->ref == 0 && e == evfirst){
127 dirgen(int n, Dir *d, void *)
137 d->uid = strdup(getuser());
138 d->gid = strdup(d->uid);
139 d->muid = strdup(d->uid);
140 d->name = strdup(names[n+1]);
141 d->mode = 0555 | (d->qid.type << 24);
142 d->atime = d->mtime = time(0);
150 req->fid->qid = (Qid) {Qroot, 0, QTDIR};
151 req->ofcall.qid = req->fid->qid;
156 usbdwalk(Fid *fid, char *name, Qid *qid)
160 if(strcmp(name, "..") == 0){
161 fid->qid = (Qid) {Qroot, 0, QTDIR};
165 if(fid->qid.path != Qroot)
166 return "not a directory";
167 for(i = 0; i < Qmax; i++)
168 if(strcmp(name, names[i]) == 0){
169 fid->qid = (Qid) {i, 0, 0};
173 return "does not exist";
179 switch((long)req->fid->qid.path){
181 dirread9p(req, dirgen, nil);
188 respond(req, Enonexist);
196 if(dirgen(req->fid->qid.path - 1, &req->d, nil) < 0)
197 respond(req, "the front fell off");
205 if(req->fid->qid.path == Qusbevent){
207 req->fid->aux = evlast;
215 usbddestroyfid(Fid *fid)
219 if(fid->qid.path == Qusbevent){
222 if(--e->ref == 0 && e == evfirst){
223 while(e->ref == 0 && e != evlast){
242 if(r == req->oldreq){
249 respond(req->oldreq, "interrupted");
254 .attach = usbdattach,
260 .destroyfid = usbddestroyfid,
269 if((d = p->dev) == nil || (u = p->dev->usb) == nil){
270 fprint(2, "okay what?\n");
273 pushevent(smprint("in id %d vid 0x%.4x did 0x%.4x csp 0x%.8x\n",
274 d->id, u->vid, u->did, u->csp));
280 main(int argc, char **argv)
288 switch(rfork(RFPROC|RFMEM)){
289 case -1: sysfatal("rfork: %r");
290 case 0: work(); exits(nil);
293 fd = open("/dev/usb", OREAD);
295 sysfatal("/dev/usb: %r");
296 nd = dirreadall(fd, &d);
299 sysfatal("/dev/usb: no hubs");
300 for(i = 0; i < nd; i++)
301 if(strcmp(d[i].name, "ctl") != 0)
302 rendezvous(work, smprint("/dev/usb/%s", d[i].name));
305 for(i = 0; i < argc; i++)
306 rendezvous(work, strdup(argv[i]));
307 rendezvous(work, nil);
308 postsharesrv(&usbdsrv, nil, "usb", "usbd", "b");