[PATCH] Handle short writes / EINTR in simple_object_internal_write

Richard Biener rguenther@suse.de
Mon Mar 31 11:52:00 GMT 2014


As promised here is the followup to handle the same kind of "errors"
in simple_object_internal_write as in simple_object_internal_read.

Bootstrapped on x86_64-unknown-linux-gnu, LTO bootstrapped and tested
on x86_64-unknown-linux-gnu.

Ok for trunk?

Thanks,
Richard.

2014-03-31  Richard Biener  <rguenther@suse.de>

	libiberty/
	* simple-object.c (simple_object_internal_write): Handle
	EINTR and short writes.

Index: libiberty/simple-object.c
===================================================================
--- libiberty/simple-object.c	(revision 208954)
+++ libiberty/simple-object.c	(working copy)
@@ -107,8 +107,6 @@ simple_object_internal_write (int descri
 			      const unsigned char *buffer, size_t size,
 			      const char **errmsg, int *err)
 {
-  ssize_t wrote;
-
   if (lseek (descriptor, offset, SEEK_SET) < 0)
     {
       *errmsg = "lseek";
@@ -116,15 +114,26 @@ simple_object_internal_write (int descri
       return 0;
     }
 
-  wrote = write (descriptor, buffer, size);
-  if (wrote < 0)
+  do
     {
-      *errmsg = "write";
-      *err = errno;
-      return 0;
+      ssize_t wrote = write (descriptor, buffer, size);
+      if (wrote == 0)
+	break;
+      else if (wrote > 0)
+	{
+	  buffer += wrote;
+	  size -= wrote;
+	}
+      else if (errno != EINTR)
+	{
+	  *errmsg = "write";
+	  *err = errno;
+	  return 0;
+	}
     }
+  while (size > 0);
 
-  if ((size_t) wrote < size)
+  if (size > 0)
     {
       *errmsg = "short write";
       *err = 0;



More information about the Gcc-patches mailing list