2009-06-05 Doug Kwan <dougkwan@google.com>
[deliverable/binutils-gdb.git] / bfd / bfdio.c
index cb06453e0168d7b7ab859d0fb3a33741d2621f8f..16bbf03a6970b619ed3d57dcb008f120a98c399c 100644 (file)
@@ -86,11 +86,45 @@ close_on_exec (FILE *file)
 FILE *
 real_fopen (const char *filename, const char *modes)
 {
+#ifdef VMS
+  char vms_modes[4];
+  char *vms_attr;
+
+  /* On VMS, fopen allows file attributes as optionnal arguments.
+     We need to use them but we'd better to use the common prototype.
+     In fopen-vms.h, they are separated from the mode with a comma.
+     Split here.  */
+  vms_attr = strchr (modes, ',');
+  if (vms_attr == NULL)
+    {
+      /* No attributes.  */
+      return close_on_exec (fopen (filename, modes));
+    }
+  else
+    {
+      /* Attributes found.  Split.  */
+      size_t modes_len = strlen (modes) + 1;
+      char attrs[modes_len + 1];
+      char *at[3];
+      int i;
+
+      memcpy (attrs, modes, modes_len);
+      at[0] = attrs;
+      for (i = 0; i < 2; i++)
+       {
+         at[i + 1] = strchr (at[i], ',');
+         BFD_ASSERT (at[i + 1] != NULL);
+         *(at[i + 1]++) = 0; /* Replace ',' with a nul, and skip it.  */
+       }
+      return close_on_exec (fopen (filename, at[0], at[1], at[2]));
+    }
+#else /* !VMS */
 #if defined (HAVE_FOPEN64)
   return close_on_exec (fopen64 (filename, modes));
 #else
   return close_on_exec (fopen (filename, modes));
 #endif
+#endif /* !VMS */
 }
 
 /*
@@ -201,6 +235,8 @@ bfd_bwrite (const void *ptr, bfd_size_type size, bfd *abfd)
                  bim->size = 0;
                  return 0;
                }
+             if (newsize > bim->size)
+               memset (bim->buffer + bim->size, 0, newsize - bim->size);
            }
        }
       memcpy (bim->buffer + abfd->where, ptr, (size_t) size);
@@ -308,8 +344,8 @@ bfd_seek (bfd *abfd, file_ptr position, int direction)
 
       if (abfd->where > bim->size)
        {
-         if ((abfd->direction == write_direction) ||
-             (abfd->direction == both_direction))
+         if (abfd->direction == write_direction
+             || abfd->direction == both_direction)
            {
              bfd_size_type newsize, oldsize;
 
@@ -325,6 +361,7 @@ bfd_seek (bfd *abfd, file_ptr position, int direction)
                      bim->size = 0;
                      return -1;
                    }
+                 memset (bim->buffer + oldsize, 0, newsize - oldsize);
                }
            }
          else
This page took 0.02341 seconds and 4 git commands to generate.