From ce508e512aa91b03dfe35e20182f4b80ebde135c Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 4 Apr 2012 12:06:21 +0000 Subject: [PATCH] * path.cc (path_conv::check): Convert device type to FH_FS for non-existant files on /dev, unless /dev itself doesn't exist on disk. Add comment to explain why. --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/path.cc | 13 +++++++++++++ 2 files changed, 19 insertions(+) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 33f507764..5ebc53dc1 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,9 @@ +2012-04-04 Corinna Vinschen + + * path.cc (path_conv::check): Convert device type to FH_FS for + non-existant files on /dev, unless /dev itself doesn't exist on disk. + Add comment to explain why. + 2012-04-04 Corinna Vinschen * hookapi.cc (rvadelta): Compute max_size using SizeOfRawData rather diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 87389141a..4fee713ae 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -882,6 +882,19 @@ is_virtual_symlink: : sym.fileattr; path_flags = sym.pflags; } + else if (isdev_dev (dev)) + { + /* If we're looking for a file below /dev, which doesn't exist, + make sure that the device type is converted to FH_FS, so that + 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) + sym.error = EROFS; + else + dev.d.devn = FH_FS; + } /* If symlink.check found an existing non-symlink file, then it sets the appropriate flag. It also sets any suffix found