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/pass.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/dial/pass.c')
-rwxr-xr-x | sys/src/cmd/dial/pass.c | 90 |
1 files changed, 90 insertions, 0 deletions
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); +} |