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/"; char Fdprefix[]="/dev/fd/";
long readnb(int, char *, long);
void execfinit(void); void execfinit(void);
void execbind(void); void execbind(void);
void execmount(void); void execmount(void);
@ -488,7 +489,7 @@ long Read(int fd, char *buf, long cnt)
{ {
int i; int i;
i = read(fd, buf, cnt); i = readnb(fd, buf, cnt);
if(ntrap) dotrap(); if(ntrap) dotrap();
return i; return i;
} }

View file

@ -2,6 +2,8 @@
#include <sys/time.h> #include <sys/time.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/resource.h> #include <sys/resource.h>
#include <errno.h>
#include <fcntl.h>
#include <libc.h> #include <libc.h>
#include "rc.h" #include "rc.h"
#include "exec.h" #include "exec.h"
@ -209,3 +211,26 @@ out:
poplist(); poplist();
flush(err); 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;
}