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
findendpoints(Dev * dev,int devid)24 findendpoints(Dev *dev, int devid)
25 {
26 Ep *ep;
27 Dev *d;
28 Usbdev *ud;
29 int i, epout;
30
31 epout = -1;
32 ud = dev->usb;
33 for(i = 0; i < nelem(ud->ep); i++){
34 if((ep = ud->ep[i]) == nil)
35 break;
36 if(ep->iface->csp != 0x020107)
37 continue;
38 if(ep->type == Ebulk && (ep->dir == Eboth || ep->dir == Eout))
39 if(epout == -1)
40 epout = ep->id;
41 }
42 dprint(2, "print: ep ids: out %d\n", epout);
43 if(epout == -1)
44 return -1;
45 d = openep(dev, epout);
46 if(d == nil){
47 fprint(2, "print: openep %d: %r\n", epout);
48 return -1;
49 }
50 opendevdata(d, OWRITE);
51 if(d->dfd < 0){
52 fprint(2, "print: open i/o ep data: %r\n");
53 closedev(d);
54 return -1;
55 }
56 dprint(2, "print: ep out %s\n", d->dir);
57 if(usbdebug > 1)
58 devctl(d, "debug 1");
59 devctl(d, "name lp%d", devid);
60 return 0;
61 }
62
63 static int
usage(void)64 usage(void)
65 {
66 werrstr("usage: usb/print [-N id]");
67 return -1;
68 }
69
70 int
printmain(Dev * dev,int argc,char ** argv)71 printmain(Dev *dev, int argc, char **argv)
72 {
73 int devid;
74
75 devid = dev->id;
76 ARGBEGIN{
77 case 'N':
78 devid = atoi(EARGF(usage()));
79 break;
80 default:
81 return usage();
82 }ARGEND
83 if(argc != 0)
84 return usage();
85
86 if(findendpoints(dev, devid) < 0){
87 werrstr("print: endpoints not found");
88 return -1;
89 }
90 return 0;
91 }
92