* opncls.c (_maybe_make_executable): New function. Gives execute
authorNick Clifton <nickc@redhat.com>
Fri, 12 Jun 2009 12:04:19 +0000 (12:04 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 12 Jun 2009 12:04:19 +0000 (12:04 +0000)
        permission to an executable bfd that was opened for writing
        provided that it is a regular file.  Replaces common code found in...
        (bfd_close): here and ...
        (bfd_close_all_done): here.

bfd/ChangeLog
bfd/opncls.c

index c0002d030f05335b11d53b89168d422796b57f89..b6945c994806a27d529fc8cd2226877823c4b7c7 100644 (file)
        (bfd_mach_o_bfd_reloc_type_lookup)
        (bfd_mach_o_bfd_reloc_name_lookup): Ditto.
 
+2009-06-11  Eric Paris  <eparis@redhat.com>
+           Nick Clifton  <nickc@redhat.com>
+
+       * opncls.c (_maybe_make_executable): New function.  Gives execute
+       permission to an executable bfd that was opened for writing
+       provided that it is a regular file.  Replaces common code found in...
+       (bfd_close): here and ...
+       (bfd_close_all_done): here.
+
 2009-06-11  Anthony Green  <green@moxielogic.com>
 
        * reloc.c: Add BFD_RELOC_MOXIE_10_PCREL.
index 3add02f1867c6de5cfdbcd021376d1db3630d16b..6a4f319d3156f4ea200a91ff9ec60b584cff4173 100644 (file)
@@ -629,6 +629,32 @@ bfd_openw (const char *filename, const char *target)
   return nbfd;
 }
 
+static inline void
+_maybe_make_executable (bfd * abfd)
+{
+  /* If the file was open for writing and is now executable,
+     make it so.  */
+  if (abfd->direction == write_direction
+      && abfd->flags & EXEC_P)
+    {
+      struct stat buf;
+
+      if (stat (abfd->filename, &buf) == 0
+         /* Do not attempt to change non-regular files.  This is
+            here especially for configure scripts and kernel builds
+            which run tests with "ld [...] -o /dev/null".  */
+         && S_ISREG(buf.st_mode))
+       {
+         unsigned int mask = umask (0);
+
+         umask (mask);
+         chmod (abfd->filename,
+                (0777
+                 & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
+       }
+    }
+}
+
 /*
 
 FUNCTION
@@ -684,24 +710,8 @@ bfd_close (bfd *abfd)
   else
     ret = TRUE;
 
-  /* If the file was open for writing and is now executable,
-     make it so.  */
-  if (ret
-      && abfd->direction == write_direction
-      && abfd->flags & EXEC_P)
-    {
-      struct stat buf;
-
-      if (stat (abfd->filename, &buf) == 0)
-       {
-         unsigned int mask = umask (0);
-
-         umask (mask);
-         chmod (abfd->filename,
-                (0777
-                 & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
-       }
-    }
+  if (ret)
+    _maybe_make_executable (abfd);
 
   _bfd_delete_bfd (abfd);
 
@@ -737,24 +747,8 @@ bfd_close_all_done (bfd *abfd)
 
   ret = bfd_cache_close (abfd);
 
-  /* If the file was open for writing and is now executable,
-     make it so.  */
-  if (ret
-      && abfd->direction == write_direction
-      && abfd->flags & EXEC_P)
-    {
-      struct stat buf;
-
-      if (stat (abfd->filename, &buf) == 0)
-       {
-         unsigned int mask = umask (0);
-
-         umask (mask);
-         chmod (abfd->filename,
-                (0777
-                 & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask))));
-       }
-    }
+  if (ret)
+    _maybe_make_executable (abfd);
 
   _bfd_delete_bfd (abfd);