1 #include <u.h> 2 #include <libc.h> 3 4 void 5 usage(void) 6 { 7 fprint(2, "usage: %s [-q] [-t secs] goodstring [badstring ...]\n", argv0); 8 exits("usage"); 9 } 10 11 void 12 catch(void*, char *s) 13 { 14 exits(s); 15 } 16 17 int 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 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