daemon: diagnose socket write failure
authorJim Meyering <meyering@redhat.com>
Thu, 20 Aug 2009 10:29:46 +0000 (12:29 +0200)
committerJim Meyering <meyering@redhat.com>
Thu, 20 Aug 2009 13:59:53 +0000 (15:59 +0200)
* 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.

daemon/daemon.h
daemon/proto.c
daemon/tar.c
daemon/upload.c

index 0ce56e1..83c9672 100644 (file)
@@ -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);
index 9b33902..d935ded 100644 (file)
@@ -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;
 }
index 03dc512..c3bdcf7 100644 (file)
@@ -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;
 }
index 143fa82..da86bd6 100644 (file)
@@ -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;
 }