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