xref: /plan9/sys/src/cmd/dial/pass.c (revision eb6381a058b1e26f0fe884ab31d18924de42fcb8)
11cea1571SDavid du Colombier #include <u.h>
21cea1571SDavid du Colombier #include <libc.h>
31cea1571SDavid du Colombier 
41cea1571SDavid du Colombier int alarmed;
5*eb6381a0SDavid du Colombier int done;
61cea1571SDavid du Colombier 
71cea1571SDavid du Colombier void
usage(void)81cea1571SDavid du Colombier usage(void)
91cea1571SDavid du Colombier {
101cea1571SDavid du Colombier 	fprint(2, "usage: %s [-q]\n", argv0);
111cea1571SDavid du Colombier 	exits("usage");
121cea1571SDavid du Colombier }
131cea1571SDavid du Colombier 
141cea1571SDavid du Colombier void
ding(void *,char * s)151cea1571SDavid du Colombier ding(void*, char *s)
161cea1571SDavid du Colombier {
171cea1571SDavid du Colombier 	if(strstr(s, "alarm")){
181cea1571SDavid du Colombier 		alarmed = 1;
191cea1571SDavid du Colombier 		noted(NCONT);
201cea1571SDavid du Colombier 	} else
211cea1571SDavid du Colombier 		noted(NDFLT);
221cea1571SDavid du Colombier }
231cea1571SDavid du Colombier 
24*eb6381a0SDavid du Colombier 
251cea1571SDavid du Colombier void
main(int argc,char ** argv)261cea1571SDavid du Colombier main(int argc, char **argv)
271cea1571SDavid du Colombier {
281cea1571SDavid du Colombier 	int fd, cfd;
29*eb6381a0SDavid du Colombier 	int i;
301cea1571SDavid du Colombier 	char buf[1];
311cea1571SDavid du Colombier 	int quiet = 0;
321cea1571SDavid du Colombier 
331cea1571SDavid du Colombier 	ARGBEGIN {
341cea1571SDavid du Colombier 	case 'q':
351cea1571SDavid du Colombier 		quiet = 1;
361cea1571SDavid du Colombier 		break;
371cea1571SDavid du Colombier 	} ARGEND;
381cea1571SDavid du Colombier 
391cea1571SDavid du Colombier 	notify(ding);
401cea1571SDavid du Colombier 
411cea1571SDavid du Colombier 	fd = open("/dev/cons", ORDWR);
421cea1571SDavid du Colombier 	if(fd < 0)
431cea1571SDavid du Colombier 		sysfatal("opening /dev/cons: %r");
441cea1571SDavid du Colombier 	cfd = open("/dev/consctl", OWRITE);
451cea1571SDavid du Colombier 	if(cfd >= 0)
461cea1571SDavid du Colombier 		fprint(cfd, "rawon");
471cea1571SDavid du Colombier 
48*eb6381a0SDavid du Colombier 	switch(rfork(RFPROC|RFFDG|RFMEM)){
49*eb6381a0SDavid du Colombier 	case -1:
50*eb6381a0SDavid du Colombier 		sysfatal("forking: %r");
51*eb6381a0SDavid du Colombier 	default:
52*eb6381a0SDavid du Colombier 		// read until we're done writing or
53*eb6381a0SDavid du Colombier 		// we get an end of line
541cea1571SDavid du Colombier 		while(!done){
551cea1571SDavid du Colombier 			alarmed = 0;
56*eb6381a0SDavid du Colombier 			alarm(250);
57*eb6381a0SDavid du Colombier 			i = read(0, buf, 1);
581cea1571SDavid du Colombier 			alarm(0);
59*eb6381a0SDavid du Colombier 
60*eb6381a0SDavid du Colombier 			if(i == 0)
61*eb6381a0SDavid du Colombier 				break;
62*eb6381a0SDavid du Colombier 			if(i < 0){
63*eb6381a0SDavid du Colombier 				if(alarmed)
64*eb6381a0SDavid du Colombier 					continue;
65*eb6381a0SDavid du Colombier 				else
661cea1571SDavid du Colombier 					break;
671cea1571SDavid du Colombier 			}
68*eb6381a0SDavid du Colombier 			if(!quiet && write(fd, buf, 1) < 1)
69*eb6381a0SDavid du Colombier 				break;
70*eb6381a0SDavid du Colombier 			if(buf[0] == '\n' || buf[0] == '\r')
71*eb6381a0SDavid du Colombier 				break;
72*eb6381a0SDavid du Colombier 		}
73*eb6381a0SDavid du Colombier 		break;
74*eb6381a0SDavid du Colombier 	case 0:
75*eb6381a0SDavid du Colombier 		// pass one character at a time till end of line
76*eb6381a0SDavid du Colombier 		for(;;){
77*eb6381a0SDavid du Colombier 			if(read(fd, buf, 1) <= 0)
78*eb6381a0SDavid du Colombier 				break;
79*eb6381a0SDavid du Colombier 			if(write(1, buf, 1) < 0)
80*eb6381a0SDavid du Colombier 				break;
81*eb6381a0SDavid du Colombier 			if(buf[0] == '\n' || buf[0] == '\r')
82*eb6381a0SDavid du Colombier 				break;
83*eb6381a0SDavid du Colombier 		}
84*eb6381a0SDavid du Colombier 
85*eb6381a0SDavid du Colombier 		// tell reader to give up after next char
86*eb6381a0SDavid du Colombier 		done = 1;
87*eb6381a0SDavid du Colombier 		break;
881cea1571SDavid du Colombier 	}
891cea1571SDavid du Colombier 	exits(0);
901cea1571SDavid du Colombier }
91