1 #include <u.h>
2 #include <libc.h>
3
4 void
usage(void)5 usage(void)
6 {
7 fprint(2, "usage: %s [-q] [-t secs] goodstring [badstring ...]\n", argv0);
8 exits("usage");
9 }
10
11 void
catch(void *,char * s)12 catch(void*, char *s)
13 {
14 exits(s);
15 }
16
17 int
writewithoutcr(int fd,char * p,int i)18 writewithoutcr(int fd, char *p, int i)
19 {
20 char *q, *e;
21
22 /* dump cr's */
23 for(e = p+i; p < e; ){
24 q = memchr(p, '\r', e-p);
25 if(q == nil)
26 break;
27 if(q > p)
28 if(write(fd, p, q-p) < 0)
29 return -1;
30 p = q+1;
31 }
32 if(p < e)
33 if(write(fd, p, e-p) < 0)
34 return -1;
35 return i;
36 }
37
38 void
main(int argc,char ** argv)39 main(int argc, char **argv)
40 {
41 int timeout = 5*60;
42 int quiet = 0;
43 int ignorecase = 0;
44 int fd, i, m, n, bsize;
45 char *good;
46 char *buf;
47 int sofar;
48
49 ARGBEGIN {
50 case 'i':
51 ignorecase = 1;
52 break;
53 case 't':
54 timeout = atoi(EARGF(usage()));
55 break;
56 case 'q':
57 quiet = 1;
58 break;
59 } ARGEND;
60
61 if(argc < 1)
62 usage();
63
64 good = argv[0];
65 n = strlen(good);
66
67 for(i = 1; i < argc; i++){
68 m = strlen(argv[i]);
69 if(m > n)
70 n = m;
71 }
72
73 fd = open("/dev/cons", ORDWR);
74 if(fd < 0)
75 sysfatal("opening /dev/cons: %r");
76
77 bsize = n+4096;
78 buf = malloc(bsize+1);
79
80 sofar = 0;
81 alarm(timeout*1000);
82 for(;;){
83 if(sofar > n){
84 memmove(buf, &buf[sofar-n], n);
85 sofar = n;
86 }
87 i = read(0, buf+sofar, bsize);
88 if(i <= 0)
89 exits("EOF");
90 if(!quiet)
91 writewithoutcr(fd, buf+sofar, i);
92 sofar += i;
93 buf[sofar] = 0;
94 if(ignorecase){
95 if(cistrstr(buf, good))
96 break;
97 for(i = 1; i < argc; i++)
98 if(cistrstr(buf, argv[i]))
99 exits(argv[i]);
100 } else {
101 if(strstr(buf, good))
102 break;
103 for(i = 1; i < argc; i++)
104 if(strstr(buf, argv[i]))
105 exits(argv[i]);
106 }
107 }
108
109 exits(0);
110 }
111