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