diff options
author | Christopher Faylor <me@cgf.cx> | 2005-12-01 17:33:59 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2005-12-01 17:33:59 +0000 |
commit | c57b13f9f85c50332dab29642d910769ead51255 (patch) | |
tree | a5f055bd50ee117dcf035f75c78e45a8abaafff3 /winsup/cygwin/path.cc | |
parent | 32e616339a776d09df4ba9fbfbf26369d8735060 (diff) | |
download | cygnal-c57b13f9f85c50332dab29642d910769ead51255.tar.gz cygnal-c57b13f9f85c50332dab29642d910769ead51255.tar.bz2 cygnal-c57b13f9f85c50332dab29642d910769ead51255.zip |
* devices.h (_minor): Coerce argument to proper type before manipulating.
(_major): Ditto.
(device::is_fs_special): New function.
* fhandler_disk_file.cc (fhandler_base::fstat_helper): Set the size to 0 for
devices rather than reporting the size of the symlink.
(fhandler_disk_file::readdir): Use is_fs_special to determine if .lnk should be
stripped.
* path.cc: Rename symlink_info::is_symlink to symlink_info::issymlink
throughout.
(symlink_info::isdevice): New field.
(path_conv::check): Use 'isdevice' to determine if just-parsed entity is a
device rather than relying on non-zero major/minor.
(symlink_info::parse_device): Set isdevice to true if we've discovered a
device.
(symlink_info::check): Clear isdevice field prior to processing. Use isdevice
to control debugging output.
(symlink_info::set): Set isdevice to false.
* path.h (path_conv::is_fs_special): New function.
* devices.cc: Regenerate.
Diffstat (limited to 'winsup/cygwin/path.cc')
-rw-r--r-- | winsup/cygwin/path.cc | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 6f0f95015..21c3b92bf 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -88,10 +88,11 @@ struct symlink_info int extn; unsigned pflags; DWORD fileattr; - int is_symlink; + int issymlink; bool ext_tacked_on; int error; bool case_clash; + bool isdevice; _major_t major; _minor_t minor; _mode_t mode; @@ -749,7 +750,7 @@ path_conv::check (const char *src, unsigned opt, is_virtual_symlink: - if (sym.minor || sym.major) + if (sym.isdevice) { dev.parse (sym.major, sym.minor); dev.setfs (1); @@ -797,7 +798,7 @@ is_virtual_symlink: /* If symlink.check found an existing non-symlink file, then it sets the appropriate flag. It also sets any suffix found into `ext_here'. */ - if (!sym.is_symlink && sym.fileattr != INVALID_FILE_ATTRIBUTES) + if (!sym.issymlink && sym.fileattr != INVALID_FILE_ATTRIBUTES) { error = sym.error; if (component == 0) @@ -3152,36 +3153,28 @@ symlink_info::parse_device (const char *contents) mymajor = strtol (contents += 2, &endptr, 16); if (endptr == contents) - return false; + return isdevice = false; contents = endptr; myminor = strtol (++contents, &endptr, 16); if (endptr == contents) - return false; + return isdevice = false; contents = endptr; mymode = strtol (++contents, &endptr, 16); if (endptr == contents) - return false; + return isdevice = false; - switch (mymode & S_IFMT) + if ((mymode & S_IFMT) == S_IFIFO) { - case S_IFIFO: mymajor = _major (FH_FIFO); myminor = _minor (FH_FIFO); - break; - case S_IFBLK: - case S_IFCHR: - if (mymajor || myminor) - break; - default: - return false; } major = mymajor; minor = myminor; mode = mymode; - return true; + return isdevice = true; } /* Check if PATH is a symlink. PATH must be a valid Win32 path name. @@ -3209,11 +3202,13 @@ symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt) suffix_scan suffix; contents[0] = '\0'; - is_symlink = true; + issymlink = true; + isdevice = false; ext_here = suffix.has (path, suffixes); extn = ext_here - path; major = 0; minor = 0; + mode = 0; pflags &= ~(PATH_SYMLINK | PATH_LNK); unsigned pflags_or = pflags & PATH_NO_ACCESS_CHECK; @@ -3323,8 +3318,8 @@ symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt) break; file_not_symlink: - is_symlink = false; - syscall_printf ("%s", (major || minor) ? "is a device" : "not a symlink"); + issymlink = false; + syscall_printf ("%s", isdevice ? "is a device" : "not a symlink"); res = 0; break; } @@ -3343,7 +3338,8 @@ symlink_info::set (char *path) pflags = PATH_SYMLINK; fileattr = FILE_ATTRIBUTE_NORMAL; error = 0; - is_symlink = true; + issymlink = true; + isdevice = false; ext_tacked_on = case_clash = false; ext_here = NULL; extn = major = minor = mode = 0; |