diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/dial/expect.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/dial/expect.c')
-rwxr-xr-x | sys/src/cmd/dial/expect.c | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/sys/src/cmd/dial/expect.c b/sys/src/cmd/dial/expect.c new file mode 100755 index 000000000..4ab6eceb5 --- /dev/null +++ b/sys/src/cmd/dial/expect.c @@ -0,0 +1,110 @@ +#include <u.h> +#include <libc.h> + +void +usage(void) +{ + fprint(2, "usage: %s [-q] [-t secs] goodstring [badstring ...]\n", argv0); + exits("usage"); +} + +void +catch(void*, char *s) +{ + exits(s); +} + +int +writewithoutcr(int fd, char *p, int i) +{ + char *q, *e; + + /* dump cr's */ + for(e = p+i; p < e; ){ + q = memchr(p, '\r', e-p); + if(q == nil) + break; + if(q > p) + if(write(fd, p, q-p) < 0) + return -1; + p = q+1; + } + if(p < e) + if(write(fd, p, e-p) < 0) + return -1; + return i; +} + +void +main(int argc, char **argv) +{ + int timeout = 5*60; + int quiet = 0; + int ignorecase = 0; + int fd, i, m, n, bsize; + char *good; + char *buf; + int sofar; + + ARGBEGIN { + case 'i': + ignorecase = 1; + break; + case 't': + timeout = atoi(EARGF(usage())); + break; + case 'q': + quiet = 1; + break; + } ARGEND; + + if(argc < 1) + usage(); + + good = argv[0]; + n = strlen(good); + + for(i = 1; i < argc; i++){ + m = strlen(argv[i]); + if(m > n) + n = m; + } + + fd = open("/dev/cons", ORDWR); + if(fd < 0) + sysfatal("opening /dev/cons: %r"); + + bsize = n+4096; + buf = malloc(bsize+1); + + sofar = 0; + alarm(timeout*1000); + for(;;){ + if(sofar > n){ + memmove(buf, &buf[sofar-n], n); + sofar = n; + } + i = read(0, buf+sofar, bsize); + if(i <= 0) + exits("EOF"); + if(!quiet) + writewithoutcr(fd, buf+sofar, i); + sofar += i; + buf[sofar] = 0; + if(ignorecase){ + if(cistrstr(buf, good)) + break; + for(i = 1; i < argc; i++) + if(cistrstr(buf, argv[i])) + exits(argv[i]); + } else { + if(strstr(buf, good)) + break; + for(i = 1; i < argc; i++) + if(strstr(buf, argv[i])) + exits(argv[i]); + } + } + + exits(0); +} |