summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2009-05-07 21:01:02 +0100
committerRichard Jones <rjones@redhat.com>2009-05-07 21:01:02 +0100
commitbb349b05333aa5bf87a3882f15458d8f7341d807 (patch)
tree8953f776bdfc43165fe07cdff0fe4f97e091bdcd /src
parent672c4ba257924c3e64836c08fb3b55bc4a6b2aba (diff)
downloadlibguestfs-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.c15
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 */