summaryrefslogtreecommitdiffstats
path: root/arch/sandbox/lib/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sandbox/lib/common.c')
-rw-r--r--arch/sandbox/lib/common.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/arch/sandbox/lib/common.c b/arch/sandbox/lib/common.c
index cd5c1c622a..5e08a6b197 100644
--- a/arch/sandbox/lib/common.c
+++ b/arch/sandbox/lib/common.c
@@ -146,7 +146,27 @@ void disable_interrupt(void)
int linux_read(int fd, void *buf, size_t count)
{
- return read(fd, buf, count);
+ ssize_t ret;
+
+ do {
+ ret = read(fd, buf, count);
+
+ if (ret == 0) {
+ printf("read on fd %d returned 0, device gone? - exiting\n", fd);
+ reset_cpu(0);
+ } else if (ret == -1) {
+ if (errno == EAGAIN)
+ usleep(100);
+ else if (errno == EINTR)
+ continue;
+ else {
+ printf("read on fd %d returned -1, errno %d - exiting\n", fd, errno);
+ reset_cpu(0);
+ }
+ }
+ } while (ret <= 0);
+
+ return (int)ret;
}
int linux_read_nonblock(int fd, void *buf, size_t count)
@@ -160,14 +180,11 @@ int linux_read_nonblock(int fd, void *buf, size_t count)
if (fcntl(fd, F_SETFL, oldflags | O_NONBLOCK) == -1)
goto err_out;
- ret = read(fd, buf, count);
+ ret = linux_read(fd, buf, count);
if (fcntl(fd, F_SETFL, oldflags) == -1)
goto err_out;
- if (ret == -1)
- usleep(100);
-
return ret;
err_out: