Fix binutils tools so that they can cope with the special /dev/null file when run...
authorEli Zaretskii <eliz@gnu.org>
Thu, 28 Jan 2021 13:32:05 +0000 (13:32 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 28 Jan 2021 13:32:05 +0000 (13:32 +0000)
 PR 27252
 * bucomm.c (get_file_size): Add code to handle /dev/null on
 Windows systems.
 * elfedit.c (check_file): Likewise.

binutils/ChangeLog
binutils/bucomm.c
binutils/elfedit.c

index 712a9ebc7ac93dcad5f6b7f6269b28a92e88c312..c02a0eef94855c70bc772663ae4c579ce248be6e 100644 (file)
@@ -1,3 +1,10 @@
+2021-01-28  Eli Zaretskii  <eliz@gnu.org>
+
+       PR 27252
+       * bucomm.c (get_file_size): Add code to handle /dev/null on
+       Windows systems.
+       * elfedit.c (check_file): Likewise.
+
 2021-01-27  Nick Clifton  <nickc@redhat.com>
 
        * objcopy.c (copy_main): Remove conditional control of the calls
index 9e6521d80ea728f4cfc082c61d385aba1917d585..0499007c58c1891fc8d580c639d268031d1e78f3 100644 (file)
@@ -623,6 +623,21 @@ get_file_size (const char * file_name)
   else if (statbuf.st_size < 0)
     non_fatal (_("Warning: '%s' has negative size, probably it is too large"),
                file_name);
+#if defined (_WIN32) && !defined (__CYGWIN__)
+  else if (statbuf.st_size == 0)
+    {
+      /* MS-Windows 'stat' doesn't reports the null device as a
+        regular file; fix that.  */
+      int fd = open (file_name, O_RDONLY | O_BINARY);
+      if (isatty (fd))
+       {
+         close (fd);
+         non_fatal (_("Warning: '%s' is not an ordinary file"),
+                    /* libtool wants to see /dev/null in the output.  */
+                    strcasecmp (file_name, "nul") ? file_name : "/dev/null");
+       }
+    }
+#endif
   else
     return statbuf.st_size;
 
index d90cbaf5b5b3c962bf653da4efde87df29c1b792..260abe0201fdbe7bb11bcbcb08051b3261de13a7 100644 (file)
@@ -721,6 +721,20 @@ check_file (const char *file_name, struct stat *statbuf_p)
       return 1;
     }
 
+#if defined (_WIN32) && !defined (__CYGWIN__)
+  else if (statbuf_p->st_size == 0)
+    {
+      /* MS-Windows 'stat' doesn't reports the null device as a
+        regular file; fix that.  */
+      int fd = open (file_name, O_RDONLY | O_BINARY);
+      if (isatty (fd))
+       {
+         statbuf_p->st_mode &= ~S_IFREG;
+         statbuf_p->st_mode |= S_IFCHR;
+       }
+    }
+#endif
+
   if (! S_ISREG (statbuf_p->st_mode))
     {
       error (_("'%s' is not an ordinary file\n"), file_name);