192f23974SDavid du Colombier /* tonet dest - copy stdin to dest, after dialing dest */
292f23974SDavid du Colombier #include <u.h>
392f23974SDavid du Colombier #include <libc.h>
492f23974SDavid du Colombier
592f23974SDavid du Colombier enum { TIMEOUT = 10*60*1000 };
692f23974SDavid du Colombier
792f23974SDavid du Colombier int
alarmhandler(void *,char * note)892f23974SDavid du Colombier alarmhandler(void *, char *note)
992f23974SDavid du Colombier {
1092f23974SDavid du Colombier if(strcmp(note, "alarm") == 0) {
1192f23974SDavid du Colombier fprint(2, "alarm\n");
1292f23974SDavid du Colombier return 1;
1392f23974SDavid du Colombier } else
1492f23974SDavid du Colombier return 0;
1592f23974SDavid du Colombier }
1692f23974SDavid du Colombier
1792f23974SDavid du Colombier void
pass(int in,int out)1892f23974SDavid du Colombier pass(int in, int out)
1992f23974SDavid du Colombier {
20*14f51593SDavid du Colombier int rv;
2192f23974SDavid du Colombier static char buf[4096];
2292f23974SDavid du Colombier
2392f23974SDavid du Colombier for(;;) {
2492f23974SDavid du Colombier alarm(TIMEOUT); /* to break hanging */
2592f23974SDavid du Colombier rv = read(in, buf, sizeof buf);
2692f23974SDavid du Colombier if (rv == 0)
2792f23974SDavid du Colombier break;
2892f23974SDavid du Colombier if(rv < 0)
2992f23974SDavid du Colombier sysfatal("read error: %r");
3092f23974SDavid du Colombier if(write(out, buf, rv) != rv)
3192f23974SDavid du Colombier sysfatal("write error: %r");
3292f23974SDavid du Colombier }
3392f23974SDavid du Colombier alarm(0);
3492f23974SDavid du Colombier }
3592f23974SDavid du Colombier
3692f23974SDavid du Colombier static void
usage(void)3792f23974SDavid du Colombier usage(void)
3892f23974SDavid du Colombier {
3992f23974SDavid du Colombier fprint(2, "usage: %s network!destination!service\n", argv0);
4092f23974SDavid du Colombier exits("usage");
4192f23974SDavid du Colombier }
4292f23974SDavid du Colombier
4392f23974SDavid du Colombier void
main(int argc,char * argv[])4492f23974SDavid du Colombier main(int argc, char *argv[])
4592f23974SDavid du Colombier {
4692f23974SDavid du Colombier int netfd;
4792f23974SDavid du Colombier
4892f23974SDavid du Colombier argv0 = argv[0];
4992f23974SDavid du Colombier if (argc != 2)
5092f23974SDavid du Colombier usage();
5192f23974SDavid du Colombier
5292f23974SDavid du Colombier atnotify(alarmhandler, 1);
5392f23974SDavid du Colombier
5492f23974SDavid du Colombier netfd = dial(argv[1], "net", 0, 0);
5592f23974SDavid du Colombier if (netfd < 0)
5692f23974SDavid du Colombier sysfatal("can't dial %s: %r", argv[1]);
5792f23974SDavid du Colombier pass(0, netfd);
5892f23974SDavid du Colombier exits(0);
5992f23974SDavid du Colombier }
60