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