xref: /plan9/sys/src/cmd/lp/tonet.c (revision 14f51593fd82e19ba95969a8c07ff71131015979)
1 /* tonet dest - copy stdin to dest, after dialing dest */
2 #include <u.h>
3 #include <libc.h>
4 
5 enum { TIMEOUT = 10*60*1000 };
6 
7 int
alarmhandler(void *,char * note)8 alarmhandler(void *, char *note)
9 {
10 	if(strcmp(note, "alarm") == 0) {
11 		fprint(2, "alarm\n");
12 		return 1;
13 	} else
14 		return 0;
15 }
16 
17 void
pass(int in,int out)18 pass(int in, int out)
19 {
20 	int rv;
21 	static char buf[4096];
22 
23 	for(;;) {
24 		alarm(TIMEOUT);		/* to break hanging */
25 		rv = read(in, buf, sizeof buf);
26 		if (rv == 0)
27 			break;
28 		if(rv < 0)
29 			sysfatal("read error: %r");
30 		if(write(out, buf, rv) != rv)
31 			sysfatal("write error: %r");
32 	}
33 	alarm(0);
34 }
35 
36 static void
usage(void)37 usage(void)
38 {
39 	fprint(2, "usage: %s network!destination!service\n", argv0);
40 	exits("usage");
41 }
42 
43 void
main(int argc,char * argv[])44 main(int argc, char *argv[])
45 {
46 	int netfd;
47 
48 	argv0 = argv[0];
49 	if (argc != 2)
50 		usage();
51 
52 	atnotify(alarmhandler, 1);
53 
54 	netfd = dial(argv[1], "net", 0, 0);
55 	if (netfd < 0)
56 		sysfatal("can't dial %s: %r", argv[1]);
57 	pass(0, netfd);
58 	exits(0);
59 }
60