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 |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/dial')
-rwxr-xr-x | sys/src/cmd/dial/at.c | 144 | ||||
-rwxr-xr-x | sys/src/cmd/dial/drain.c | 23 | ||||
-rwxr-xr-x | sys/src/cmd/dial/expect.c | 110 | ||||
-rwxr-xr-x | sys/src/cmd/dial/mkfile | 20 | ||||
-rwxr-xr-x | sys/src/cmd/dial/pass.c | 90 |
5 files changed, 387 insertions, 0 deletions
diff --git a/sys/src/cmd/dial/at.c b/sys/src/cmd/dial/at.c new file mode 100755 index 000000000..a680511ab --- /dev/null +++ b/sys/src/cmd/dial/at.c @@ -0,0 +1,144 @@ +#include <u.h> +#include <libc.h> + +void +usage(void) +{ + fprint(2, "usage: %s [-q] [-t seconds] command\n", argv0); + exits("usage"); +} + +struct { + char *resp; + int ok; +} tab[] = +{ + { "ok", 1 }, + { "connect", 1 }, + { "no carrier", 0 }, + { "no dialtone", 0 }, + { "error", 0 }, + { "busy", 0 }, + { "no answer", 0 }, + { "delayed", 0 }, + { "blacklisted", 0 }, +}; + +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; +} + +int +readln(int fd, char *buf, int n) +{ + int c, i, sofar; + + sofar = 0; + buf[sofar] = 0; + while(sofar < n-1){ + i = read(fd, buf+sofar, 1); + if(i <= 0) + return i; + c = buf[sofar]; + if(c == '\r') + continue; + sofar++; + if(c == '\n') + break; + } + buf[sofar] = 0; + return sofar; +} + +void +docmd(char *cmd, int timeout, int quiet, int consfd) +{ + char buf[4096]; + int i; + char *p, *cp; + + if(timeout == 0){ + if(*cmd == 'd' || *cmd == 'D') + timeout = 2*60; + else + timeout = 5; + } + + p = smprint("at%s\r", cmd); + for(cp = p; *cp; cp++){ + write(1, cp, 1); + sleep(100); + } + free(p); + + alarm(timeout*1000); + for(;;){ + i = readln(0, buf, sizeof(buf)); + if(i <= 0){ + rerrstr(buf, sizeof buf); + exits(buf); + } + if(!quiet) + writewithoutcr(consfd, buf, i); + for(i = 0; i < nelem(tab); i++) + if(cistrstr(buf, tab[i].resp)){ + if(tab[i].ok) + goto out; + else + exits(buf); + } + } +out: + alarm(0); +} + +void +main(int argc, char **argv) +{ + int timeout; + int quiet; + int i; + int consfd; + + timeout = 0; + quiet = 0; + ARGBEGIN { + case 't': + timeout = atoi(EARGF(usage())); + break; + case 'q': + quiet = 1; + break; + default: + usage(); + } ARGEND; + + if(argc < 1) + usage(); + + consfd = open("/dev/cons", ORDWR); + if(consfd < 0) + sysfatal("opening /dev/cons: %r"); + + for(i = 0; i < argc; i++) + docmd(argv[i], timeout, quiet, consfd); + + exits(0); +} diff --git a/sys/src/cmd/dial/drain.c b/sys/src/cmd/dial/drain.c new file mode 100755 index 000000000..e872b32c8 --- /dev/null +++ b/sys/src/cmd/dial/drain.c @@ -0,0 +1,23 @@ +#include <u.h> +#include <libc.h> + +void +ding(void*, char *s) +{ + if(strstr(s, "alarm")) + noted(NCONT); + else + noted(NDFLT); +} + +void +main(void) +{ + char buf[256]; + + alarm(100); + while(read(0, buf, sizeof(buf)) > 0) + ; + alarm(0); + exits(0); +} 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); +} diff --git a/sys/src/cmd/dial/mkfile b/sys/src/cmd/dial/mkfile new file mode 100755 index 000000000..b2247c623 --- /dev/null +++ b/sys/src/cmd/dial/mkfile @@ -0,0 +1,20 @@ +</$objtype/mkfile + +TARG=expect\ + pass\ + drain\ + at\ + +OFILES= + +BIN=/$objtype/bin/dial + +UPDATE=\ + mkfile\ + $HFILES\ + ${OFILES:%.$O=%.c}\ + ${TARG:%=%.c}\ + /sys/man/1/con\ + +</sys/src/cmd/mkmany + diff --git a/sys/src/cmd/dial/pass.c b/sys/src/cmd/dial/pass.c new file mode 100755 index 000000000..b5b740bf8 --- /dev/null +++ b/sys/src/cmd/dial/pass.c @@ -0,0 +1,90 @@ +#include <u.h> +#include <libc.h> + +int alarmed; +int done; + +void +usage(void) +{ + fprint(2, "usage: %s [-q]\n", argv0); + exits("usage"); +} + +void +ding(void*, char *s) +{ + if(strstr(s, "alarm")){ + alarmed = 1; + noted(NCONT); + } else + noted(NDFLT); +} + + +void +main(int argc, char **argv) +{ + int fd, cfd; + int i; + char buf[1]; + int quiet = 0; + + ARGBEGIN { + case 'q': + quiet = 1; + break; + } ARGEND; + + notify(ding); + + fd = open("/dev/cons", ORDWR); + if(fd < 0) + sysfatal("opening /dev/cons: %r"); + cfd = open("/dev/consctl", OWRITE); + if(cfd >= 0) + fprint(cfd, "rawon"); + + switch(rfork(RFPROC|RFFDG|RFMEM)){ + case -1: + sysfatal("forking: %r"); + default: + // read until we're done writing or + // we get an end of line + while(!done){ + alarmed = 0; + alarm(250); + i = read(0, buf, 1); + alarm(0); + + if(i == 0) + break; + if(i < 0){ + if(alarmed) + continue; + else + break; + } + if(!quiet && write(fd, buf, 1) < 1) + break; + if(buf[0] == '\n' || buf[0] == '\r') + break; + } + break; + case 0: + // pass one character at a time till end of line + for(;;){ + if(read(fd, buf, 1) <= 0) + break; + if(write(1, buf, 1) < 0) + break; + if(buf[0] == '\n' || buf[0] == '\r') + break; + } + + // tell reader to give up after next char + done = 1; + break; + } + exits(0); +} |