xref: /plan9/sys/src/cmd/lp/tonet.c (revision 14f51593fd82e19ba95969a8c07ff71131015979)
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