]> sourceware.org Git - newlib-cygwin.git/commitdiff
* fhandler_nodevice.cc (fhandler_nodevice::open): Convert EROFS to
authorCorinna Vinschen <corinna@vinschen.de>
Wed, 4 Apr 2012 12:45:24 +0000 (12:45 +0000)
committerCorinna Vinschen <corinna@vinschen.de>
Wed, 4 Apr 2012 12:45:24 +0000 (12:45 +0000)
ENOENT if non-existent file got opened for reading only.  Explain why.
* path.cc (path_conv::check): Stick to ENOENT if file has been opened
for informational purposes only.  Add to comment.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler_nodevice.cc
winsup/cygwin/path.cc

index 5ebc53dc1e350b54c6db86dffaf8069702d7d41a..57f411250579f283feae4a8c8f1c4611ea445c6d 100644 (file)
@@ -1,3 +1,10 @@
+2012-04-04  Corinna Vinschen  <corinna@vinschen.de>
+
+       * fhandler_nodevice.cc (fhandler_nodevice::open): Convert EROFS to
+       ENOENT if non-existent file got opened for reading only.  Explain why.
+       * path.cc (path_conv::check): Stick to ENOENT if file has been opened
+       for informational purposes only.  Add to comment.
+
 2012-04-04  Corinna Vinschen  <corinna@vinschen.de>
 
        * path.cc (path_conv::check): Convert device type to FH_FS for
index 4ffe2c4477432e8cf98321596e1dbdd81b51d419..39842d3943765c122701274fdbf118b1a93758a7 100644 (file)
@@ -15,10 +15,14 @@ details. */
 #include "fhandler.h"
 
 int
-fhandler_nodevice::open (int, mode_t)
+fhandler_nodevice::open (int flags, mode_t)
 {
   if (!pc.error)
     set_errno (ENXIO);
+  /* Fixup EROFS error returned from path_conv if /dev is not backed by real
+     directory on disk and the file doesn't exist. */
+  else if (pc.error == EROFS && (flags & O_ACCMODE) == O_RDONLY)
+    set_errno (ENOENT);
   return 0;
 }
 
index 4fee713aea6700342a41b6e5d8be25d48d67e93e..6c848fc6f10cb0180a3ec3ff4ae94734c964547a 100644 (file)
@@ -889,8 +889,11 @@ is_virtual_symlink:
                 subsequent code handles the file correctly.
                 Unless /dev itself doesn't exist on disk.  In that case /dev
                 is handled as virtual filesystem, and virtual filesystems are
-                read-only. */
-             if (sym.error == ENOENT)
+                read-only.  The PC_KEEP_HANDLE check allows to check for
+                a call from an informational system call.  In that case we
+                just stick to ENOENT, and the device type doesn't matter
+                anyway. */
+             if (sym.error == ENOENT && !(opt & PC_KEEP_HANDLE))
                sym.error = EROFS;
              else
                dev.d.devn = FH_FS;
This page took 0.039398 seconds and 5 git commands to generate.