From 8711eddd80efc5f05f19da613ce3ad7ebc66aa35 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Sun, 26 Dec 2004 02:10:30 +0000 Subject: [PATCH] * fhandler.cc (fhandler_base::fchmod): Do the right thing when changing an "on disk" device or fifo. (fhandler_base::fchown): Ditto for changing ownership. * fhandler_disk_file.cc (fhandler_base::fstat_helper): Accommodate device files on ntfs partitions. * path.cc (path_conv::check): Use isfs function to figure out if a path exists on a filesystem to make sure that device files are caught. --- winsup/cygwin/ChangeLog | 10 ++++++++++ winsup/cygwin/fhandler.cc | 5 +++++ winsup/cygwin/fhandler_disk_file.cc | 9 ++++++++- winsup/cygwin/path.cc | 2 +- winsup/cygwin/pinfo.cc | 1 - 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 4e341a9fd..4ae5c13df 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,13 @@ +2004-12-25 Christopher Faylor + + * fhandler.cc (fhandler_base::fchmod): Do the right thing when changing + an "on disk" device or fifo. + (fhandler_base::fchown): Ditto for changing ownership. + * fhandler_disk_file.cc (fhandler_base::fstat_helper): Accommodate + device files on ntfs partitions. + * path.cc (path_conv::check): Use isfs function to figure out if a path + exists on a filesystem to make sure that device files are caught. + 2004-12-24 Christopher Faylor * child_info.h (CURR_CHILD_INFO_MAGIC): Update. diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc index 2507f322e..61f9cc01f 100644 --- a/winsup/cygwin/fhandler.cc +++ b/winsup/cygwin/fhandler.cc @@ -1520,6 +1520,9 @@ fhandler_base::closedir (DIR *) int fhandler_base::fchmod (mode_t mode) { + extern int chmod_device (path_conv& pc, mode_t mode); + if (pc.is_fs_special ()) + return chmod_device (pc, mode); /* By default, just succeeds. */ return 0; } @@ -1527,6 +1530,8 @@ fhandler_base::fchmod (mode_t mode) int fhandler_base::fchown (__uid32_t uid, __gid32_t gid) { + if (pc.is_fs_special ()) + return ((fhandler_disk_file *) this)->fhandler_disk_file::fchown (uid, gid); /* By default, just succeeds. */ return 0; } diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index ebf92772a..7fc6a14a9 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -300,8 +300,15 @@ fhandler_base::fstat_helper (struct __stat64 *buf, if (pc.has_attribute (FILE_ATTRIBUTE_READONLY) && !pc.issymlink ()) buf->st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH); - if (!(buf->st_mode & S_IFMT)) + if (buf->st_mode & S_IFMT) + /* nothing */; + else if (!is_fs_special ()) buf->st_mode |= S_IFREG; + else + { + buf->st_dev = dev (); + buf->st_mode = dev ().mode; + } } else { diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 7716f0282..0e8aa9737 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -816,7 +816,7 @@ out: return; } - if (dev.devn == FH_FS) + if (dev.isfs ()) { if (strncmp (path, "\\\\.\\", 4)) { diff --git a/winsup/cygwin/pinfo.cc b/winsup/cygwin/pinfo.cc index 69a43808a..1bf6b5ea3 100644 --- a/winsup/cygwin/pinfo.cc +++ b/winsup/cygwin/pinfo.cc @@ -71,7 +71,6 @@ set_myself (HANDLE h) ForceCloseHandle (cygheap->pid_handle); cygheap->pid_handle = NULL; } - return; } /* Initialize the process table entry for the current task.