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/";
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue