xref: /plan9-contrib/sys/src/cmd/usb/print/print.c (revision 906943f9f6b8411972abb5e3a03ed19f74be7ccc)
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