11cea1571SDavid du Colombier #include <u.h>
21cea1571SDavid du Colombier #include <libc.h>
31cea1571SDavid du Colombier
41cea1571SDavid du Colombier void
usage(void)51cea1571SDavid du Colombier usage(void)
61cea1571SDavid du Colombier {
7*0cc39a83SDavid du Colombier fprint(2, "usage: %s [-q] [-t secs] goodstring [badstring ...]\n", argv0);
81cea1571SDavid du Colombier exits("usage");
91cea1571SDavid du Colombier }
101cea1571SDavid du Colombier
111cea1571SDavid du Colombier void
catch(void *,char * s)121cea1571SDavid du Colombier catch(void*, char *s)
131cea1571SDavid du Colombier {
141cea1571SDavid du Colombier exits(s);
151cea1571SDavid du Colombier }
161cea1571SDavid du Colombier
171cea1571SDavid du Colombier int
writewithoutcr(int fd,char * p,int i)181cea1571SDavid du Colombier writewithoutcr(int fd, char *p, int i)
191cea1571SDavid du Colombier {
201cea1571SDavid du Colombier char *q, *e;
211cea1571SDavid du Colombier
221cea1571SDavid du Colombier /* dump cr's */
231cea1571SDavid du Colombier for(e = p+i; p < e; ){
241cea1571SDavid du Colombier q = memchr(p, '\r', e-p);
251cea1571SDavid du Colombier if(q == nil)
261cea1571SDavid du Colombier break;
271cea1571SDavid du Colombier if(q > p)
281cea1571SDavid du Colombier if(write(fd, p, q-p) < 0)
291cea1571SDavid du Colombier return -1;
301cea1571SDavid du Colombier p = q+1;
311cea1571SDavid du Colombier }
321cea1571SDavid du Colombier if(p < e)
331cea1571SDavid du Colombier if(write(fd, p, e-p) < 0)
341cea1571SDavid du Colombier return -1;
351cea1571SDavid du Colombier return i;
361cea1571SDavid du Colombier }
371cea1571SDavid du Colombier
381cea1571SDavid du Colombier void
main(int argc,char ** argv)391cea1571SDavid du Colombier main(int argc, char **argv)
401cea1571SDavid du Colombier {
411cea1571SDavid du Colombier int timeout = 5*60;
421cea1571SDavid du Colombier int quiet = 0;
431cea1571SDavid du Colombier int ignorecase = 0;
441cea1571SDavid du Colombier int fd, i, m, n, bsize;
451cea1571SDavid du Colombier char *good;
461cea1571SDavid du Colombier char *buf;
471cea1571SDavid du Colombier int sofar;
481cea1571SDavid du Colombier
491cea1571SDavid du Colombier ARGBEGIN {
501cea1571SDavid du Colombier case 'i':
511cea1571SDavid du Colombier ignorecase = 1;
521cea1571SDavid du Colombier break;
531cea1571SDavid du Colombier case 't':
541cea1571SDavid du Colombier timeout = atoi(EARGF(usage()));
551cea1571SDavid du Colombier break;
561cea1571SDavid du Colombier case 'q':
571cea1571SDavid du Colombier quiet = 1;
581cea1571SDavid du Colombier break;
591cea1571SDavid du Colombier } ARGEND;
601cea1571SDavid du Colombier
611cea1571SDavid du Colombier if(argc < 1)
621cea1571SDavid du Colombier usage();
631cea1571SDavid du Colombier
641cea1571SDavid du Colombier good = argv[0];
651cea1571SDavid du Colombier n = strlen(good);
661cea1571SDavid du Colombier
671cea1571SDavid du Colombier for(i = 1; i < argc; i++){
681cea1571SDavid du Colombier m = strlen(argv[i]);
691cea1571SDavid du Colombier if(m > n)
701cea1571SDavid du Colombier n = m;
711cea1571SDavid du Colombier }
721cea1571SDavid du Colombier
731cea1571SDavid du Colombier fd = open("/dev/cons", ORDWR);
741cea1571SDavid du Colombier if(fd < 0)
751cea1571SDavid du Colombier sysfatal("opening /dev/cons: %r");
761cea1571SDavid du Colombier
771cea1571SDavid du Colombier bsize = n+4096;
781cea1571SDavid du Colombier buf = malloc(bsize+1);
791cea1571SDavid du Colombier
801cea1571SDavid du Colombier sofar = 0;
811cea1571SDavid du Colombier alarm(timeout*1000);
821cea1571SDavid du Colombier for(;;){
831cea1571SDavid du Colombier if(sofar > n){
841cea1571SDavid du Colombier memmove(buf, &buf[sofar-n], n);
851cea1571SDavid du Colombier sofar = n;
861cea1571SDavid du Colombier }
871cea1571SDavid du Colombier i = read(0, buf+sofar, bsize);
881cea1571SDavid du Colombier if(i <= 0)
891cea1571SDavid du Colombier exits("EOF");
901cea1571SDavid du Colombier if(!quiet)
911cea1571SDavid du Colombier writewithoutcr(fd, buf+sofar, i);
921cea1571SDavid du Colombier sofar += i;
931cea1571SDavid du Colombier buf[sofar] = 0;
941cea1571SDavid du Colombier if(ignorecase){
951cea1571SDavid du Colombier if(cistrstr(buf, good))
961cea1571SDavid du Colombier break;
971cea1571SDavid du Colombier for(i = 1; i < argc; i++)
981cea1571SDavid du Colombier if(cistrstr(buf, argv[i]))
991cea1571SDavid du Colombier exits(argv[i]);
1001cea1571SDavid du Colombier } else {
1011cea1571SDavid du Colombier if(strstr(buf, good))
1021cea1571SDavid du Colombier break;
1031cea1571SDavid du Colombier for(i = 1; i < argc; i++)
1041cea1571SDavid du Colombier if(strstr(buf, argv[i]))
1051cea1571SDavid du Colombier exits(argv[i]);
1061cea1571SDavid du Colombier }
1071cea1571SDavid du Colombier }
1081cea1571SDavid du Colombier
1091cea1571SDavid du Colombier exits(0);
1101cea1571SDavid du Colombier }
111