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