cope with programs that leave fd in non-blocking mode (Tim Wiess)

This commit is contained in:
rsc 2007-03-25 17:16:40 +00:00
parent 3802adb118
commit edc77f0b2b
2 changed files with 27 additions and 1 deletions

View file

@ -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;
}

View file

@ -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"
@ -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;
}