tcope with programs that leave fd in non-blocking mode (Tim Wiess) - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit edc77f0b2b9298831a6007acffd635a87f55a4d7
 (DIR) parent 3802adb1183fe2350add92dec6496b886c0ae70f
 (HTM) Author: rsc <devnull@localhost>
       Date:   Sun, 25 Mar 2007 17:16:40 +0000
       
       cope with programs that leave fd in non-blocking mode (Tim Wiess)
       
       Diffstat:
         M src/cmd/rc/plan9ish.c               |       3 ++-
         M src/cmd/rc/unixcrap.c               |      25 +++++++++++++++++++++++++
       
       2 files changed, 27 insertions(+), 1 deletion(-)
       ---
 (DIR) diff --git a/src/cmd/rc/plan9ish.c b/src/cmd/rc/plan9ish.c
       t@@ -31,6 +31,7 @@ Rcmain(void)
        }
        
        char Fdprefix[]="/dev/fd/";
       +long readnb(int, char *, long);
        void execfinit(void);
        void execbind(void);
        void execmount(void);
       t@@ -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;
        }
 (DIR) diff --git a/src/cmd/rc/unixcrap.c b/src/cmd/rc/unixcrap.c
       t@@ -2,6 +2,8 @@
        #include <sys/time.h>
        #include <sys/stat.h>
        #include <sys/resource.h>
       +#include <errno.h>
       +#include <fcntl.h>
        #include <libc.h>
        #include "rc.h"
        #include "exec.h"
       t@@ -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;
       +}