summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2009-08-20 12:29:46 +0200
committerJim Meyering <meyering@redhat.com>2009-08-20 15:59:53 +0200
commitd1c35f871022e40f9abd93048c1115c6565f94cb (patch)
treefc408da49d2690ede7c15bd6b9db0f67f56e4db4
parent0c92c583d5291e1a3a966b36f107bf48e4bfad93 (diff)
downloadlibguestfs-d1c35f871022e40f9abd93048c1115c6565f94cb.tar.gz
libguestfs-d1c35f871022e40f9abd93048c1115c6565f94cb.tar.xz
libguestfs-d1c35f871022e40f9abd93048c1115c6565f94cb.zip
daemon: diagnose socket write failure
* daemon/proto.c (send_chunk): Don't ignore socket-write error. * daemon/proto.c (send_file_end): Return "int", not void, so we can propagate send_chunk failure to caller. * daemon/daemon.h (send_file_end): Update prototype. * daemon/tar.c (do_tar_out, do_tgz_out): Update uses of send_file_end. * daemon/upload.c (do_download): Likewise.
-rw-r--r--daemon/daemon.h2
-rw-r--r--daemon/proto.c14
-rw-r--r--daemon/tar.c8
-rw-r--r--daemon/upload.c4
4 files changed, 19 insertions, 9 deletions
diff --git a/daemon/daemon.h b/daemon/daemon.h
index 0ce56e18..83c9672d 100644
--- a/daemon/daemon.h
+++ b/daemon/daemon.h
@@ -116,7 +116,7 @@ extern void cancel_receive (void);
* Note max write size if GUESTFS_MAX_CHUNK_SIZE.
*/
extern int send_file_write (const void *buf, int len);
-extern void send_file_end (int cancel);
+extern int send_file_end (int cancel);
/* only call this if there is a FileOut parameter */
extern void reply (xdrproc_t xdrp, char *ret);
diff --git a/daemon/proto.c b/daemon/proto.c
index 9b33902f..d935ded5 100644
--- a/daemon/proto.c
+++ b/daemon/proto.c
@@ -462,7 +462,7 @@ check_for_library_cancellation (void)
return 1;
}
-void
+int
send_file_end (int cancel)
{
guestfs_chunk chunk;
@@ -470,7 +470,7 @@ send_file_end (int cancel)
chunk.cancel = cancel;
chunk.data.data_len = 0;
chunk.data.data_val = NULL;
- send_chunk (&chunk);
+ return send_chunk (&chunk);
}
static int
@@ -495,8 +495,12 @@ send_chunk (const guestfs_chunk *chunk)
xdr_uint32_t (&xdr, &len);
xdr_destroy (&xdr);
- (void) xwrite (sock, lenbuf, 4);
- (void) xwrite (sock, buf, len);
+ int err = (xwrite (sock, lenbuf, 4) == 0
+ && xwrite (sock, buf, len) == 0 ? 0 : -1);
+ if (err) {
+ fprintf (stderr, "send_chunk: write failed\n");
+ exit (1);
+ }
- return 0;
+ return err;
}
diff --git a/daemon/tar.c b/daemon/tar.c
index 03dc5121..c3bdcf7e 100644
--- a/daemon/tar.c
+++ b/daemon/tar.c
@@ -149,7 +149,9 @@ do_tar_out (const char *dir)
return -1;
}
- send_file_end (0); /* Normal end of file. */
+ if (send_file_end (0)) /* Normal end of file. */
+ return -1;
+
return 0;
}
@@ -268,6 +270,8 @@ do_tgz_out (const char *dir)
return -1;
}
- send_file_end (0); /* Normal end of file. */
+ if (send_file_end (0)) /* Normal end of file. */
+ return -1;
+
return 0;
}
diff --git a/daemon/upload.c b/daemon/upload.c
index 143fa823..da86bd65 100644
--- a/daemon/upload.c
+++ b/daemon/upload.c
@@ -129,6 +129,8 @@ do_download (const char *filename)
return -1;
}
- send_file_end (0); /* Normal end of file. */
+ if (send_file_end (0)) /* Normal end of file. */
+ return -1;
+
return 0;
}