Sync config/warnings.m4 with GCC
[deliverable/binutils-gdb.git] / libiberty / simple-object.c
index d000cfc08067e89dce043bc35de9b2726644cb3a..5d379d053c419cfacf812ba89e60fe93b8d7b73d 100644 (file)
@@ -51,7 +51,8 @@ static const struct simple_object_functions * const format_functions[] =
 {
   &simple_object_elf_functions,
   &simple_object_mach_o_functions,
-  &simple_object_coff_functions
+  &simple_object_coff_functions,
+  &simple_object_xcoff_functions
 };
 
 /* Read data from a file using the simple_object error reporting
@@ -62,8 +63,6 @@ simple_object_internal_read (int descriptor, off_t offset,
                             unsigned char *buffer, size_t size,
                             const char **errmsg, int *err)
 {
-  ssize_t got;
-
   if (lseek (descriptor, offset, SEEK_SET) < 0)
     {
       *errmsg = "lseek";
@@ -71,15 +70,26 @@ simple_object_internal_read (int descriptor, off_t offset,
       return 0;
     }
 
-  got = read (descriptor, buffer, size);
-  if (got < 0)
+  do
     {
-      *errmsg = "read";
-      *err = errno;
-      return 0;
+      ssize_t got = read (descriptor, buffer, size);
+      if (got == 0)
+       break;
+      else if (got > 0)
+       {
+         buffer += got;
+         size -= got;
+       }
+      else if (errno != EINTR)
+       {
+         *errmsg = "read";
+         *err = errno;
+         return 0;
+       }
     }
+  while (size > 0);
 
-  if ((size_t) got < size)
+  if (size > 0)
     {
       *errmsg = "file too short";
       *err = 0;
@@ -97,8 +107,6 @@ simple_object_internal_write (int descriptor, off_t offset,
                              const unsigned char *buffer, size_t size,
                              const char **errmsg, int *err)
 {
-  ssize_t wrote;
-
   if (lseek (descriptor, offset, SEEK_SET) < 0)
     {
       *errmsg = "lseek";
@@ -106,15 +114,26 @@ simple_object_internal_write (int descriptor, off_t offset,
       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;
This page took 0.025152 seconds and 4 git commands to generate.