From edc77f0b2b9298831a6007acffd635a87f55a4d7 Mon Sep 17 00:00:00 2001 From: rsc Date: Sun, 25 Mar 2007 17:16:40 +0000 Subject: cope with programs that leave fd in non-blocking mode (Tim Wiess) --- src/cmd/rc/plan9ish.c | 3 ++- src/cmd/rc/unixcrap.c | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/cmd/rc/plan9ish.c b/src/cmd/rc/plan9ish.c index 2e5514e1..4e1ab7c0 100644 --- a/src/cmd/rc/plan9ish.c +++ b/src/cmd/rc/plan9ish.c @@ -31,6 +31,7 @@ Rcmain(void) } char Fdprefix[]="/dev/fd/"; +long readnb(int, char *, long); void execfinit(void); void execbind(void); void execmount(void); @@ -488,7 +489,7 @@ long Read(int fd, char *buf, long cnt) { int i; - i = read(fd, buf, cnt); + i = readnb(fd, buf, cnt); if(ntrap) dotrap(); return i; } diff --git a/src/cmd/rc/unixcrap.c b/src/cmd/rc/unixcrap.c index 98660483..d71cbc38 100644 --- a/src/cmd/rc/unixcrap.c +++ b/src/cmd/rc/unixcrap.c @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include #include "rc.h" #include "exec.h" @@ -209,3 +211,26 @@ out: poplist(); flush(err); } + +/* + * Cope with non-blocking read. + */ +long +readnb(int fd, char *buf, long cnt) +{ + int n, didreset; + int flgs; + + didreset = 0; + while((n = read(fd, buf, cnt)) == -1) + if(!didreset && errno == EAGAIN){ + if((flgs = fcntl(fd, F_GETFL, 0)) == -1) + return -1; + flgs &= ~O_NONBLOCK; + if(fcntl(fd, F_SETFL, flgs) == -1) + return -1; + didreset = 1; + } + + return n; +} -- cgit v1.2.3