1*906943f9SDavid du Colombier /* 2*906943f9SDavid du Colombier * usb/print - usb printer file server 3*906943f9SDavid du Colombier * BUG: Assumes the printer will be always connected and 4*906943f9SDavid du Colombier * not hot-plugged. (Otherwise should stay running and 5*906943f9SDavid du Colombier * listen to errors to keep the device there as long as it has 6*906943f9SDavid du Colombier * not failed). Also, this is untested and done ad-hoc to 7*906943f9SDavid du Colombier * replace the print script. 8*906943f9SDavid du Colombier */ 9*906943f9SDavid du Colombier #include <u.h> 10*906943f9SDavid du Colombier #include <libc.h> 11*906943f9SDavid du Colombier #include <thread.h> 12*906943f9SDavid du Colombier #include "usb.h" 13*906943f9SDavid du Colombier 14*906943f9SDavid du Colombier enum 15*906943f9SDavid du Colombier { 16*906943f9SDavid du Colombier Qdir = 0, 17*906943f9SDavid du Colombier Qctl, 18*906943f9SDavid du Colombier Qraw, 19*906943f9SDavid du Colombier Qdata, 20*906943f9SDavid du Colombier Qmax, 21*906943f9SDavid du Colombier }; 22*906943f9SDavid du Colombier 23*906943f9SDavid du Colombier int 24*906943f9SDavid du Colombier findendpoints(Dev *dev) 25*906943f9SDavid du Colombier { 26*906943f9SDavid du Colombier Ep *ep; 27*906943f9SDavid du Colombier Dev *d; 28*906943f9SDavid du Colombier Usbdev *ud; 29*906943f9SDavid du Colombier int i; 30*906943f9SDavid du Colombier int epout; 31*906943f9SDavid du Colombier 32*906943f9SDavid du Colombier epout = -1; 33*906943f9SDavid du Colombier ud = dev->usb; 34*906943f9SDavid du Colombier for(i = 0; i < nelem(ud->ep); i++){ 35*906943f9SDavid du Colombier if((ep = ud->ep[i]) == nil) 36*906943f9SDavid du Colombier break; 37*906943f9SDavid du Colombier if(ep->iface->csp != 0x020107) 38*906943f9SDavid du Colombier continue; 39*906943f9SDavid du Colombier if(ep->type == Ebulk && (ep->dir == Eboth || ep->dir == Eout)) 40*906943f9SDavid du Colombier if(epout == -1) 41*906943f9SDavid du Colombier epout = ep->id; 42*906943f9SDavid du Colombier } 43*906943f9SDavid du Colombier dprint(2, "print: ep ids: out %d\n", epout); 44*906943f9SDavid du Colombier if(epout == -1) 45*906943f9SDavid du Colombier return -1; 46*906943f9SDavid du Colombier d = openep(dev, epout); 47*906943f9SDavid du Colombier if(d == nil){ 48*906943f9SDavid du Colombier fprint(2, "print: openep %d: %r\n", epout); 49*906943f9SDavid du Colombier return -1; 50*906943f9SDavid du Colombier } 51*906943f9SDavid du Colombier opendevdata(d, OWRITE); 52*906943f9SDavid du Colombier if(d->dfd < 0){ 53*906943f9SDavid du Colombier fprint(2, "print: open i/o ep data: %r\n"); 54*906943f9SDavid du Colombier closedev(d); 55*906943f9SDavid du Colombier return -1; 56*906943f9SDavid du Colombier } 57*906943f9SDavid du Colombier dprint(2, "print: ep out %s\n", d->dir); 58*906943f9SDavid du Colombier if(usbdebug > 1) 59*906943f9SDavid du Colombier devctl(d, "debug 1"); 60*906943f9SDavid du Colombier devctl(d, "name lp%d", dev->id); 61*906943f9SDavid du Colombier return 0; 62*906943f9SDavid du Colombier } 63*906943f9SDavid du Colombier 64*906943f9SDavid du Colombier static int 65*906943f9SDavid du Colombier usage(void) 66*906943f9SDavid du Colombier { 67*906943f9SDavid du Colombier werrstr("usage: usb/print"); 68*906943f9SDavid du Colombier return -1; 69*906943f9SDavid du Colombier } 70*906943f9SDavid du Colombier 71*906943f9SDavid du Colombier int 72*906943f9SDavid du Colombier printmain(Dev *dev, int argc, char **argv) 73*906943f9SDavid du Colombier { 74*906943f9SDavid du Colombier ARGBEGIN{ 75*906943f9SDavid du Colombier default: 76*906943f9SDavid du Colombier return usage(); 77*906943f9SDavid du Colombier }ARGEND 78*906943f9SDavid du Colombier if(argc != 0) 79*906943f9SDavid du Colombier return usage(); 80*906943f9SDavid du Colombier 81*906943f9SDavid du Colombier if(findendpoints(dev) < 0){ 82*906943f9SDavid du Colombier werrstr("print: endpoints not found"); 83*906943f9SDavid du Colombier return -1; 84*906943f9SDavid du Colombier } 85*906943f9SDavid du Colombier return 0; 86*906943f9SDavid du Colombier } 87