xref: /plan9/sys/src/cmd/dial/pass.c (revision 1cea15714743963faff4290d6d10fb8f68cb0f53)
1*1cea1571SDavid du Colombier #include <u.h>
2*1cea1571SDavid du Colombier #include <libc.h>
3*1cea1571SDavid du Colombier 
4*1cea1571SDavid du Colombier int alarmed;
5*1cea1571SDavid du Colombier 
6*1cea1571SDavid du Colombier void
7*1cea1571SDavid du Colombier usage(void)
8*1cea1571SDavid du Colombier {
9*1cea1571SDavid du Colombier 	fprint(2, "usage: %s [-q]\n", argv0);
10*1cea1571SDavid du Colombier 	exits("usage");
11*1cea1571SDavid du Colombier }
12*1cea1571SDavid du Colombier 
13*1cea1571SDavid du Colombier void
14*1cea1571SDavid du Colombier ding(void*, char *s)
15*1cea1571SDavid du Colombier {
16*1cea1571SDavid du Colombier 	if(strstr(s, "alarm")){
17*1cea1571SDavid du Colombier 		alarmed = 1;
18*1cea1571SDavid du Colombier 		noted(NCONT);
19*1cea1571SDavid du Colombier 	} else
20*1cea1571SDavid du Colombier 		noted(NDFLT);
21*1cea1571SDavid du Colombier }
22*1cea1571SDavid du Colombier 
23*1cea1571SDavid du Colombier void
24*1cea1571SDavid du Colombier main(int argc, char **argv)
25*1cea1571SDavid du Colombier {
26*1cea1571SDavid du Colombier 	int fd, cfd;
27*1cea1571SDavid du Colombier 	char buf[1];
28*1cea1571SDavid du Colombier 	int quiet = 0;
29*1cea1571SDavid du Colombier 	int done = 0;
30*1cea1571SDavid du Colombier 
31*1cea1571SDavid du Colombier 	ARGBEGIN {
32*1cea1571SDavid du Colombier 	case 'q':
33*1cea1571SDavid du Colombier 		quiet = 1;
34*1cea1571SDavid du Colombier 		break;
35*1cea1571SDavid du Colombier 	} ARGEND;
36*1cea1571SDavid du Colombier 
37*1cea1571SDavid du Colombier 	notify(ding);
38*1cea1571SDavid du Colombier 
39*1cea1571SDavid du Colombier 	fd = open("/dev/cons", ORDWR);
40*1cea1571SDavid du Colombier 	if(fd < 0)
41*1cea1571SDavid du Colombier 		sysfatal("opening /dev/cons: %r");
42*1cea1571SDavid du Colombier 	cfd = open("/dev/consctl", OWRITE);
43*1cea1571SDavid du Colombier 	if(cfd >= 0)
44*1cea1571SDavid du Colombier 		fprint(cfd, "rawon");
45*1cea1571SDavid du Colombier 
46*1cea1571SDavid du Colombier 	while(!done){
47*1cea1571SDavid du Colombier 		if(read(fd, buf, 1) <= 0)
48*1cea1571SDavid du Colombier 			break;
49*1cea1571SDavid du Colombier 		if(buf[0] == '\n' || buf[0] == '\r')
50*1cea1571SDavid du Colombier 			done = 1;
51*1cea1571SDavid du Colombier 		if(write(1, buf, 1) < 0)
52*1cea1571SDavid du Colombier 			break;
53*1cea1571SDavid du Colombier 		if(!quiet){
54*1cea1571SDavid du Colombier 			alarmed = 0;
55*1cea1571SDavid du Colombier 			alarm(500);
56*1cea1571SDavid du Colombier 			if(read(0, buf, 1) <= 0 && !alarmed)
57*1cea1571SDavid du Colombier 				break;
58*1cea1571SDavid du Colombier 			alarm(0);
59*1cea1571SDavid du Colombier 			if(buf[0] != '\r' && write(fd, buf, 1) < 0)
60*1cea1571SDavid du Colombier 				break;
61*1cea1571SDavid du Colombier 		}
62*1cea1571SDavid du Colombier 	}
63*1cea1571SDavid du Colombier 	exits(0);
64*1cea1571SDavid du Colombier }
65