henesyinit from p9fd787fda5 years agoHistory
94 lines · 1.4 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <thread.h>#include "usb.h" static intreadnum(int fd){	int n;	char buf[20]; 	n = read(fd, buf, sizeof buf);	buf[sizeof(buf)-1] = 0;	return n <= 0? -1: strtol(buf, nil, 0);} Device*opendev(int ctlrno, int id){	int isnew;	Device *d;	char name[100], *p; 	d = emallocz(sizeof(Device), 1);	incref(d); 	isnew = 0;	if(id == -1) {		sprint(name, "/dev/usb%d/new", ctlrno);		if((d->ctl = open(name, ORDWR)) < 0){		Error0:			close(d->ctl);			werrstr("open %s: %r", name);			free(d);			/* return nil; */			sysfatal("%r");		}		id = readnum(d->ctl);		isnew = 1;	}	sprint(name, "/dev/usb%d/%d/", ctlrno, id);	p = name+strlen(name); 	if(!isnew) {		strcpy(p, "ctl");		if((d->ctl = open(name, ORDWR)) < 0)			goto Error0;	} 	strcpy(p, "setup");	if((d->setup = open(name, ORDWR)) < 0){	Error1:		close(d->setup);		goto Error0;	} 	strcpy(p, "status");	if((d->status = open(name, OREAD)) < 0)		goto Error1; 	d->ctlrno = ctlrno;	d->id = id;	return d;} voidclosedev(Device *d){	int i, j;	Dconf *conf;	Dalt *alt, *nextalt; 	if(d==nil)		return;	if(decref(d) != 0)		return;	close(d->ctl);	close(d->setup);	close(d->status); 	for(i = 0; i < d->nconf; i++) {		conf = &d->config[i];		for(j = 0; j < conf->nif; j++) {			for(alt = conf->iface[j].alt; alt != nil; alt = nextalt) {				nextalt = alt->next;				free(alt->ep);				free(alt);			}		}		free(conf->iface);	}	free(d->config);	free(d);}