]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/dial/expect.c
audiohda: fix syntax error
[plan9front.git] / sys / src / cmd / dial / expect.c
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 }