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