From: Jim Meyering Date: Thu, 20 Aug 2009 10:29:46 +0000 (+0200) Subject: daemon: diagnose socket write failure X-Git-Tag: 1.0.69~49 X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=commitdiff_plain;h=d1c35f871022e40f9abd93048c1115c6565f94cb 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. --- diff --git a/daemon/daemon.h b/daemon/daemon.h index 0ce56e1..83c9672 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 9b33902..d935ded 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 03dc512..c3bdcf7 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 143fa82..da86bd6 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; }