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 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 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 37 usage(void) 38 { 39 fprint(2, "usage: %s network!destination!service\n", argv0); 40 exits("usage"); 41 } 42 43 void 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