diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2000-04-25 16:31:14 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2000-04-25 16:31:14 +0000 |
commit | d6581f44d4471b942692c1bf91624656991a11bd (patch) | |
tree | f8915a8b2e0aeeb23627b97027381994ec8a50ca /winsup/cygwin/syscalls.cc | |
parent | efadc1c1522a22cee1faca0e6532e0c7f06f768f (diff) | |
download | cygnal-d6581f44d4471b942692c1bf91624656991a11bd.tar.gz cygnal-d6581f44d4471b942692c1bf91624656991a11bd.tar.bz2 cygnal-d6581f44d4471b942692c1bf91624656991a11bd.zip |
* fhandler.cc (fhandler_disk_file::open): Check for allow_ntsec
when determining exec flag.
* path.cc (symlink_info::check): Remove call to get_file_attribute().
* security.cc (read_sd): Rename, ditto for variables to conform
to common naming convention. Use GetFileSecurity() instead of
BackupRead() to avoid permission problems when reading ACLs.
(write_sd): Same renaming as for read_sd().
(alloc_sd): Change default permissions according to Linux permissions
for group and world when write permission is set.
* syscalls.cc (stat_worker): Avoid different permission problems
when requesting file informations.
Diffstat (limited to 'winsup/cygwin/syscalls.cc')
-rw-r--r-- | winsup/cygwin/syscalls.cc | 95 |
1 files changed, 56 insertions, 39 deletions
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 45978bc91..1200d3642 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -982,6 +982,8 @@ stat_worker (const char *caller, const char *name, struct stat *buf, char *win32_name; char root[MAX_PATH]; UINT dtype; + fhandler_disk_file fh (NULL); + MALLOC_CHECK; debug_printf ("%s (%s, %p)", caller, name, buf); @@ -1009,28 +1011,15 @@ stat_worker (const char *caller, const char *name, struct stat *buf, strcpy (root, win32_name); dtype = GetDriveType (rootdir (root)); - if (atts == -1 || !(atts & FILE_ATTRIBUTE_DIRECTORY) || - (os_being_run == winNT - && dtype != DRIVE_NO_ROOT_DIR - && dtype != DRIVE_UNKNOWN)) + if ((atts == -1 || !(atts & FILE_ATTRIBUTE_DIRECTORY) || + (os_being_run == winNT + && dtype != DRIVE_NO_ROOT_DIR + && dtype != DRIVE_UNKNOWN)) + && fh.open (real_path, O_RDONLY | O_BINARY | O_DIROPEN | + (nofollow ? O_NOSYMLINK : 0), 0)) { - fhandler_disk_file fh (NULL); - - if (fh.open (real_path, O_RDONLY | O_BINARY | O_DIROPEN | - (nofollow ? O_NOSYMLINK : 0), 0)) - { - res = fh.fstat (buf); - fh.close (); - /* See the comment 10 lines below */ - if (atts != -1 && (atts & FILE_ATTRIBUTE_DIRECTORY)) - buf->st_nlink = - (dtype == DRIVE_REMOTE ? 1 : num_entries (win32_name)); - } - } - else - { - WIN32_FIND_DATA wfd; - HANDLE handle; + res = fh.fstat (buf); + fh.close (); /* The number of links to a directory includes the number of subdirectories in the directory, since all those subdirectories point to it. @@ -1038,26 +1027,54 @@ stat_worker (const char *caller, const char *name, struct stat *buf, set the number of links to 2. */ /* Unfortunately the count of 2 confuses `find(1)' command. So let's try it with `1' as link count. */ - buf->st_nlink = (dtype == DRIVE_REMOTE ? 1 : num_entries (win32_name)); + if (atts != -1 && (atts & FILE_ATTRIBUTE_DIRECTORY)) + buf->st_nlink = + (dtype == DRIVE_REMOTE ? 1 : num_entries (win32_name)); + } + else if (atts != -1 || GetLastError () != ERROR_FILE_NOT_FOUND) + { + /* Unfortunately, the above open may fail. So we have + to care for this case here, too. */ + WIN32_FIND_DATA wfd; + HANDLE handle; + buf->st_nlink = 1; + if (atts != -1 + && (atts & FILE_ATTRIBUTE_DIRECTORY) + && dtype != DRIVE_REMOTE) + buf->st_nlink = num_entries (win32_name); buf->st_dev = FHDEVN(FH_DISK) << 8; buf->st_ino = hash_path_name (0, real_path.get_win32 ()); - buf->st_mode = S_IFDIR | STD_RBITS | STD_XBITS; - if ((atts & FILE_ATTRIBUTE_READONLY) == 0) - buf->st_mode |= STD_WBITS; - - get_file_attribute (real_path.has_acls (), real_path.get_win32 (), - NULL, &buf->st_uid, &buf->st_gid); - - if ((handle = FindFirstFile (real_path.get_win32(), &wfd)) != INVALID_HANDLE_VALUE) - { - buf->st_atime = to_time_t (&wfd.ftLastAccessTime); - buf->st_mtime = to_time_t (&wfd.ftLastWriteTime); - buf->st_ctime = to_time_t (&wfd.ftCreationTime); - buf->st_size = wfd.nFileSizeLow; - buf->st_blksize = S_BLKSIZE; - buf->st_blocks = (buf->st_size + S_BLKSIZE-1) / S_BLKSIZE; - FindClose (handle); - } + if (atts != -1 && (atts & FILE_ATTRIBUTE_DIRECTORY)) + buf->st_mode = S_IFDIR; + else if (real_path.issymlink ()) + buf->st_mode = S_IFLNK; + else if (real_path.issocket ()) + buf->st_mode = S_IFSOCK; + else + buf->st_mode = S_IFREG; + if (!real_path.has_acls () + || get_file_attribute (real_path.has_acls (), real_path.get_win32 (), + &buf->st_mode, &buf->st_uid, &buf->st_gid)) + { + buf->st_mode |= STD_RBITS | STD_XBITS; + if ((atts & FILE_ATTRIBUTE_READONLY) == 0) + buf->st_mode |= STD_WBITS; + get_file_attribute (FALSE, real_path.get_win32 (), + NULL, &buf->st_uid, &buf->st_gid); + } + if ((handle = FindFirstFile (real_path.get_win32(), &wfd)) + == INVALID_HANDLE_VALUE) + { + __seterrno (); + goto done; + } + buf->st_atime = to_time_t (&wfd.ftLastAccessTime); + buf->st_mtime = to_time_t (&wfd.ftLastWriteTime); + buf->st_ctime = to_time_t (&wfd.ftCreationTime); + buf->st_size = wfd.nFileSizeLow; + buf->st_blksize = S_BLKSIZE; + buf->st_blocks = (buf->st_size + S_BLKSIZE-1) / S_BLKSIZE; + FindClose (handle); res = 0; } |