diff options
author | Richard Jones <rjones@redhat.com> | 2009-05-07 21:01:02 +0100 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2009-05-07 21:01:02 +0100 |
commit | bb349b05333aa5bf87a3882f15458d8f7341d807 (patch) | |
tree | 8953f776bdfc43165fe07cdff0fe4f97e091bdcd /src | |
parent | 672c4ba257924c3e64836c08fb3b55bc4a6b2aba (diff) | |
download | libguestfs-bb349b05333aa5bf87a3882f15458d8f7341d807.tar.gz libguestfs-bb349b05333aa5bf87a3882f15458d8f7341d807.tar.xz libguestfs-bb349b05333aa5bf87a3882f15458d8f7341d807.zip |
Handle EINTR and EAGAIN in reads.
Diffstat (limited to 'src')
-rw-r--r-- | src/guestfs.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/guestfs.c b/src/guestfs.c index 395bc97c..c1fb01d1 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -441,8 +441,11 @@ xread (int fd, void *buf, size_t len) while (len > 0) { r = read (fd, buf, len); - if (r == -1) + if (r == -1) { + if (errno == EINTR || errno == EAGAIN) + continue; return -1; + } buf += r; len -= r; @@ -1201,7 +1204,7 @@ stdout_event (struct guestfs_main_loop *ml, guestfs_h *g, void *data, } if (n == -1) { - if (errno != EAGAIN) + if (errno != EINTR && errno != EAGAIN) perrorf (g, "read"); return; } @@ -1249,7 +1252,7 @@ sock_read_event (struct guestfs_main_loop *ml, guestfs_h *g, void *data, return; if (n == -1) { - if (errno != EAGAIN) + if (errno != EINTR && errno != EAGAIN) perrorf (g, "read"); return; } @@ -1656,7 +1659,11 @@ guestfs__send_file_sync (guestfs_h *g, const char *filename) } /* Send file in chunked encoding. */ - while (!cancel && (r = read (fd, buf, sizeof buf)) > 0) { + while (!cancel) { + r = read (fd, buf, sizeof buf); + if (r == -1 && (errno == EINTR || errno == EAGAIN)) + continue; + if (r <= 0) break; err = send_file_data_sync (g, buf, r); if (err < 0) { if (err == -2) /* daemon sent cancellation */ |