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