From c57b13f9f85c50332dab29642d910769ead51255 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Thu, 1 Dec 2005 17:33:59 +0000 Subject: [PATCH] * 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. --- winsup/cygwin/ChangeLog | 33 ++++++++++++++++++++++---- winsup/cygwin/devices.h | 5 ++-- winsup/cygwin/fhandler_disk_file.cc | 4 +++- winsup/cygwin/path.cc | 36 +++++++++++++---------------- winsup/cygwin/path.h | 2 +- 5 files changed, 51 insertions(+), 29 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 9c25ad5c4..6f11fc822 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,26 @@ +2005-12-01 Christopher Faylor + + * 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. + 2005-11-30 Christopher Faylor * times.cc (hires_ms::prime): Remove debugging stuff. @@ -46,19 +69,19 @@ (mmap_record::autogrow): Call global autogrow function. (list::anonymous): New method. Use throughout were appropriate. (mmap_record::compatible_flags): Drop now useless ifdef. - (mmap_record::alloc_page_map): Accomodate private anonymous maps. - (mmap_record::map_pages): Accomodate MAP_NORESERVE mappings. - (mmap_record::unmap_pages): Accomodate private anonymous maps. + (mmap_record::alloc_page_map): Accommodate private anonymous maps. + (mmap_record::map_pages): Accommodate MAP_NORESERVE mappings. + (mmap_record::unmap_pages): Accommodate private anonymous maps. (mmap64): Simplify argument check. Don't remove the MAP_PRIVATE flag for anonymous mappings on 9x anymore since that's now handled gracefully. - (mprotect): Accomodate MAP_NORESERVE mappings. Fix case when + (mprotect): Accommodate MAP_NORESERVE mappings. Fix case when non-mmap areas are just MEM_RESERVEd. (fhandler_dev_zero::mmap): Implement anonymous mapping here. (fhandler_dev_zero::munmap): Ditto. (fhandler_dev_zero::msyn): Ditto. (fhandler_dev_zero::fixup_mmap_after_fork): Ditto. - (fixup_mmaps_after_fork): Accomodate private anonymous maps. Enhance + (fixup_mmaps_after_fork): Accommodate private anonymous maps. Enhance debug output in case VirtualProtect fails. * include/sys/mman.h: Really define MAP_NORESERVE now. diff --git a/winsup/cygwin/devices.h b/winsup/cygwin/devices.h index b21f8f6a0..c885fb09d 100644 --- a/winsup/cygwin/devices.h +++ b/winsup/cygwin/devices.h @@ -14,8 +14,8 @@ typedef mode_t _mode_t; typedef __dev32_t _dev_t; #define FHDEV(maj, min) ((((unsigned) (maj)) << (sizeof (_major_t) * 8)) | (unsigned) (min)) -#define _minor(dev) ((dev) & ((1 << (sizeof (_minor_t) * 8)) - 1)) -#define _major(dev) ((dev) >> (sizeof (_major_t) * 8)) +#define _minor(dev) (((_minor_t) dev) & ((1 << (sizeof (_minor_t) * 8)) - 1)) +#define _major(dev) (((_major_t) dev) >> (sizeof (_major_t) * 8)) enum fh_devices { @@ -149,6 +149,7 @@ struct device inline operator int () const {return devn;} inline void setfs (bool x) {dev_on_fs = x;} inline bool isfs () const {return dev_on_fs || devn == FH_FS;} + inline bool is_fs_special () const {return dev_on_fs && devn != FH_FS;} }; extern const device *console_dev; diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index 82bd120c2..51c4972ae 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -394,6 +394,7 @@ fhandler_base::fstat_helper (struct __stat64 *buf, { buf->st_dev = dev (); buf->st_mode = dev ().mode; + buf->st_size = 0; } } else @@ -413,6 +414,7 @@ fhandler_base::fstat_helper (struct __stat64 *buf, { buf->st_dev = dev (); buf->st_mode = dev ().mode; + buf->st_size = 0; } else { @@ -1458,7 +1460,7 @@ fhandler_disk_file::readdir (DIR *dir, dirent *de) strcpy (fbuf, dir->__d_dirname); strcpy (fbuf + strlen (fbuf) - 1, c); path_conv fpath (fbuf, PC_SYM_NOFOLLOW); - if (fpath.issymlink () || fpath.isspecial ()) + if (fpath.issymlink () || fpath.is_fs_special ()) c[len - 4] = '\0'; } } 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; diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h index e2fa22498..27c21496f 100644 --- a/winsup/cygwin/path.h +++ b/winsup/cygwin/path.h @@ -153,7 +153,7 @@ class path_conv int isspecial () const {return dev.devn && dev.devn != FH_FS;} int is_auto_device () const {return isdevice () && !is_fs_special ();} int is_fs_device () const {return isdevice () && is_fs_special ();} - int is_fs_special () const {return isspecial () && dev.isfs ();} + int is_fs_special () const {return dev.is_fs_special ();} int is_lnk_special () const {return is_fs_device () || isfifo () || is_lnk_symlink ();} int issocket () const {return dev.devn == FH_UNIX;} int iscygexec () const {return path_flags & PATH_CYGWIN_EXEC;}