mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-12 11:10:07 +00:00
cope with programs that leave fd in non-blocking mode (Tim Wiess)
This commit is contained in:
parent
3802adb118
commit
edc77f0b2b
2 changed files with 27 additions and 1 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue