/* tonet dest - copy stdin to dest, after dialing dest */ #include #include enum { TIMEOUT = 10*60*1000 }; int alarmhandler(void *, char *note) { if(strcmp(note, "alarm") == 0) { fprint(2, "alarm\n"); return 1; } else return 0; } void pass(int in, int out) { int rv; static char buf[4096]; for(;;) { alarm(TIMEOUT); /* to break hanging */ rv = read(in, buf, sizeof buf); if (rv == 0) break; if(rv < 0) sysfatal("read error: %r"); if(write(out, buf, rv) != rv) sysfatal("write error: %r"); } alarm(0); } static void usage(void) { fprint(2, "usage: %s network!destination!service\n", argv0); exits("usage"); } void main(int argc, char *argv[]) { int netfd; argv0 = argv[0]; if (argc != 2) usage(); atnotify(alarmhandler, 1); netfd = dial(argv[1], "net", 0, 0); if (netfd < 0) sysfatal("can't dial %s: %r", argv[1]); pass(0, netfd); exits(0); }