1906943f9SDavid du Colombier /*
2906943f9SDavid du Colombier * usb/print - usb printer file server
3906943f9SDavid du Colombier * BUG: Assumes the printer will be always connected and
4906943f9SDavid du Colombier * not hot-plugged. (Otherwise should stay running and
5906943f9SDavid du Colombier * listen to errors to keep the device there as long as it has
6906943f9SDavid du Colombier * not failed). Also, this is untested and done ad-hoc to
7906943f9SDavid du Colombier * replace the print script.
8906943f9SDavid du Colombier */
9906943f9SDavid du Colombier #include <u.h>
10906943f9SDavid du Colombier #include <libc.h>
11906943f9SDavid du Colombier #include <thread.h>
12906943f9SDavid du Colombier #include "usb.h"
13906943f9SDavid du Colombier
14906943f9SDavid du Colombier enum
15906943f9SDavid du Colombier {
16906943f9SDavid du Colombier Qdir = 0,
17906943f9SDavid du Colombier Qctl,
18906943f9SDavid du Colombier Qraw,
19906943f9SDavid du Colombier Qdata,
20906943f9SDavid du Colombier Qmax,
21906943f9SDavid du Colombier };
22906943f9SDavid du Colombier
23906943f9SDavid du Colombier int
findendpoints(Dev * dev,int devid)24*ed868a7cSDavid du Colombier findendpoints(Dev *dev, int devid)
25906943f9SDavid du Colombier {
26906943f9SDavid du Colombier Ep *ep;
27906943f9SDavid du Colombier Dev *d;
28906943f9SDavid du Colombier Usbdev *ud;
29*ed868a7cSDavid du Colombier int i, epout;
30906943f9SDavid du Colombier
31906943f9SDavid du Colombier epout = -1;
32906943f9SDavid du Colombier ud = dev->usb;
33906943f9SDavid du Colombier for(i = 0; i < nelem(ud->ep); i++){
34906943f9SDavid du Colombier if((ep = ud->ep[i]) == nil)
35906943f9SDavid du Colombier break;
36906943f9SDavid du Colombier if(ep->iface->csp != 0x020107)
37906943f9SDavid du Colombier continue;
38906943f9SDavid du Colombier if(ep->type == Ebulk && (ep->dir == Eboth || ep->dir == Eout))
39906943f9SDavid du Colombier if(epout == -1)
40906943f9SDavid du Colombier epout = ep->id;
41906943f9SDavid du Colombier }
42906943f9SDavid du Colombier dprint(2, "print: ep ids: out %d\n", epout);
43906943f9SDavid du Colombier if(epout == -1)
44906943f9SDavid du Colombier return -1;
45906943f9SDavid du Colombier d = openep(dev, epout);
46906943f9SDavid du Colombier if(d == nil){
47906943f9SDavid du Colombier fprint(2, "print: openep %d: %r\n", epout);
48906943f9SDavid du Colombier return -1;
49906943f9SDavid du Colombier }
50906943f9SDavid du Colombier opendevdata(d, OWRITE);
51906943f9SDavid du Colombier if(d->dfd < 0){
52906943f9SDavid du Colombier fprint(2, "print: open i/o ep data: %r\n");
53906943f9SDavid du Colombier closedev(d);
54906943f9SDavid du Colombier return -1;
55906943f9SDavid du Colombier }
56906943f9SDavid du Colombier dprint(2, "print: ep out %s\n", d->dir);
57906943f9SDavid du Colombier if(usbdebug > 1)
58906943f9SDavid du Colombier devctl(d, "debug 1");
59*ed868a7cSDavid du Colombier devctl(d, "name lp%d", devid);
60906943f9SDavid du Colombier return 0;
61906943f9SDavid du Colombier }
62906943f9SDavid du Colombier
63906943f9SDavid du Colombier static int
usage(void)64906943f9SDavid du Colombier usage(void)
65906943f9SDavid du Colombier {
66*ed868a7cSDavid du Colombier werrstr("usage: usb/print [-N id]");
67906943f9SDavid du Colombier return -1;
68906943f9SDavid du Colombier }
69906943f9SDavid du Colombier
70906943f9SDavid du Colombier int
printmain(Dev * dev,int argc,char ** argv)71906943f9SDavid du Colombier printmain(Dev *dev, int argc, char **argv)
72906943f9SDavid du Colombier {
73*ed868a7cSDavid du Colombier int devid;
74*ed868a7cSDavid du Colombier
75*ed868a7cSDavid du Colombier devid = dev->id;
76906943f9SDavid du Colombier ARGBEGIN{
77*ed868a7cSDavid du Colombier case 'N':
78*ed868a7cSDavid du Colombier devid = atoi(EARGF(usage()));
79*ed868a7cSDavid du Colombier break;
80906943f9SDavid du Colombier default:
81906943f9SDavid du Colombier return usage();
82906943f9SDavid du Colombier }ARGEND
83906943f9SDavid du Colombier if(argc != 0)
84906943f9SDavid du Colombier return usage();
85906943f9SDavid du Colombier
86*ed868a7cSDavid du Colombier if(findendpoints(dev, devid) < 0){
87906943f9SDavid du Colombier werrstr("print: endpoints not found");
88906943f9SDavid du Colombier return -1;
89906943f9SDavid du Colombier }
90906943f9SDavid du Colombier return 0;
91906943f9SDavid du Colombier }
92