* dir.cc (closedir): Revert change from 2007-06-29.
* fhandler.h (dirent_valid_fd): Drop. * fhandler_disk_file.cc (fhandler_disk_file::opendir): If opening a real dir, use the underlying fhandler to keep track of the directory handle. In fdopendir case use original io_handle from fhandler. Use fhandler's io_handle in subsequent directory functions throughout. Create handle non-inheritable and set close-on-exec flag. (readdir_get_ino): Drop dirent_isroot case. (fhandler_disk_file::readdir): Handle dirent_isroot case here. (fhandler_disk_file::rewinddir): Revert change from 2007-07-05. Use NtClose instead of CloseHandle. * fhandler_virtual.cc (fhandler_virtual::opendir): Drop adding dirent_valid_fd flag. Set close-on-exec flag.
This commit is contained in:
parent
bffcbe34be
commit
281bd334ac
|
@ -1,3 +1,19 @@
|
||||||
|
2007-07-09 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* dir.cc (closedir): Revert change from 2007-06-29.
|
||||||
|
* fhandler.h (dirent_valid_fd): Drop.
|
||||||
|
* fhandler_disk_file.cc (fhandler_disk_file::opendir): If opening a
|
||||||
|
real dir, use the underlying fhandler to keep track of the directory
|
||||||
|
handle. In fdopendir case use original io_handle from fhandler. Use
|
||||||
|
fhandler's io_handle in subsequent directory functions throughout.
|
||||||
|
Create handle non-inheritable and set close-on-exec flag.
|
||||||
|
(readdir_get_ino): Drop dirent_isroot case.
|
||||||
|
(fhandler_disk_file::readdir): Handle dirent_isroot case here.
|
||||||
|
(fhandler_disk_file::rewinddir): Revert change from 2007-07-05. Use
|
||||||
|
NtClose instead of CloseHandle.
|
||||||
|
* fhandler_virtual.cc (fhandler_virtual::opendir): Drop adding
|
||||||
|
dirent_valid_fd flag. Set close-on-exec flag.
|
||||||
|
|
||||||
2007-07-08 Christopher Faylor <me+cygwin@cgf.cx>
|
2007-07-08 Christopher Faylor <me+cygwin@cgf.cx>
|
||||||
|
|
||||||
* Makefile.in (DLL_OFILES): Add newly-imported random.o. Eliminate
|
* Makefile.in (DLL_OFILES): Add newly-imported random.o. Eliminate
|
||||||
|
|
|
@ -260,11 +260,7 @@ closedir (DIR *dir)
|
||||||
|
|
||||||
int res = ((fhandler_base *) dir->__fh)->closedir (dir);
|
int res = ((fhandler_base *) dir->__fh)->closedir (dir);
|
||||||
|
|
||||||
/* If the directory has been opened by fdopendir, the descriptor
|
cygheap->fdtab.release (dir->__d_fd);
|
||||||
entry is used elsewhere in the application and must not be removed
|
|
||||||
from the descriptor table. */
|
|
||||||
if (!(dir->__flags & dirent_valid_fd))
|
|
||||||
cygheap->fdtab.release (dir->__d_fd);
|
|
||||||
|
|
||||||
free (dir->__d_dirname);
|
free (dir->__d_dirname);
|
||||||
free (dir->__d_dirent);
|
free (dir->__d_dirent);
|
||||||
|
|
|
@ -52,10 +52,9 @@ enum dirent_states
|
||||||
dirent_isroot = 0x0008,
|
dirent_isroot = 0x0008,
|
||||||
dirent_set_d_ino = 0x0010,
|
dirent_set_d_ino = 0x0010,
|
||||||
dirent_get_d_ino = 0x0020,
|
dirent_get_d_ino = 0x0020,
|
||||||
dirent_valid_fd = 0x0040,
|
|
||||||
|
|
||||||
/* Global flags which must not be deleted on rewinddir or seekdir. */
|
/* Global flags which must not be deleted on rewinddir or seekdir. */
|
||||||
dirent_info_mask = 0x0078
|
dirent_info_mask = 0x0038
|
||||||
};
|
};
|
||||||
|
|
||||||
enum conn_state
|
enum conn_state
|
||||||
|
|
|
@ -1566,42 +1566,35 @@ fhandler_disk_file::opendir (int fd)
|
||||||
dir->__d_internal = (unsigned) new __DIR_mounts (pc.normalized_path);
|
dir->__d_internal = (unsigned) new __DIR_mounts (pc.normalized_path);
|
||||||
d_cachepos (dir) = 0;
|
d_cachepos (dir) = 0;
|
||||||
|
|
||||||
if (!pc.iscygdrive ())
|
if (pc.iscygdrive ())
|
||||||
|
cfd->nohandle (true);
|
||||||
|
else
|
||||||
{
|
{
|
||||||
OBJECT_ATTRIBUTES attr;
|
if (fd < 0)
|
||||||
NTSTATUS status;
|
|
||||||
IO_STATUS_BLOCK io;
|
|
||||||
WCHAR wpath[CYG_MAX_PATH + 10] = { 0 };
|
|
||||||
UNICODE_STRING upath = {0, sizeof (wpath), wpath};
|
|
||||||
SECURITY_ATTRIBUTES sa = sec_none;
|
|
||||||
|
|
||||||
if (fd >= 0 && get_handle ())
|
|
||||||
{
|
|
||||||
/* fdopendir() case. Just initialize with the emtpy upath
|
|
||||||
and reuse the exisiting handle. */
|
|
||||||
InitializeObjectAttributes (&attr, &upath,
|
|
||||||
OBJ_CASE_INSENSITIVE | OBJ_INHERIT,
|
|
||||||
get_handle (), NULL);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
/* opendir() case. Initialize with given directory name and
|
/* opendir() case. Initialize with given directory name and
|
||||||
NULL directory handle. */
|
NULL directory handle. */
|
||||||
|
OBJECT_ATTRIBUTES attr;
|
||||||
|
NTSTATUS status;
|
||||||
|
IO_STATUS_BLOCK io;
|
||||||
|
WCHAR wpath[CYG_MAX_PATH + 10] = { 0 };
|
||||||
|
UNICODE_STRING upath = {0, sizeof (wpath), wpath};
|
||||||
|
SECURITY_ATTRIBUTES sa = sec_none;
|
||||||
|
|
||||||
pc.get_nt_native_path (upath);
|
pc.get_nt_native_path (upath);
|
||||||
InitializeObjectAttributes (&attr, &upath,
|
InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE,
|
||||||
OBJ_CASE_INSENSITIVE | OBJ_INHERIT,
|
|
||||||
NULL, sa.lpSecurityDescriptor);
|
NULL, sa.lpSecurityDescriptor);
|
||||||
}
|
status = NtOpenFile (&get_handle (),
|
||||||
status = NtOpenFile (&dir->__handle,
|
SYNCHRONIZE | FILE_LIST_DIRECTORY,
|
||||||
SYNCHRONIZE | FILE_LIST_DIRECTORY,
|
&attr, &io, FILE_SHARE_VALID_FLAGS,
|
||||||
&attr, &io, FILE_SHARE_VALID_FLAGS,
|
FILE_SYNCHRONOUS_IO_NONALERT
|
||||||
FILE_SYNCHRONOUS_IO_NONALERT
|
| FILE_OPEN_FOR_BACKUP_INTENT
|
||||||
| FILE_OPEN_FOR_BACKUP_INTENT
|
| FILE_DIRECTORY_FILE);
|
||||||
| FILE_DIRECTORY_FILE);
|
if (!NT_SUCCESS (status))
|
||||||
if (!NT_SUCCESS (status))
|
{
|
||||||
{
|
__seterrno_from_nt_status (status);
|
||||||
__seterrno_from_nt_status (status);
|
goto free_mounts;
|
||||||
goto free_mounts;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FileIdBothDirectoryInformation is apparently unsupported on
|
/* FileIdBothDirectoryInformation is apparently unsupported on
|
||||||
|
@ -1620,10 +1613,7 @@ fhandler_disk_file::opendir (int fd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fd >= 0)
|
if (fd >= 0)
|
||||||
{
|
dir->__d_fd = fd;
|
||||||
dir->__flags |= dirent_valid_fd;
|
|
||||||
dir->__d_fd = fd;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Filling cfd with `this' (aka storing this in the file
|
/* Filling cfd with `this' (aka storing this in the file
|
||||||
|
@ -1632,9 +1622,9 @@ fhandler_disk_file::opendir (int fd)
|
||||||
fhandler twice, once in opendir() in dir.cc, the second
|
fhandler twice, once in opendir() in dir.cc, the second
|
||||||
time on exit. Nasty, nasty... */
|
time on exit. Nasty, nasty... */
|
||||||
cfd = this;
|
cfd = this;
|
||||||
cfd->nohandle (true);
|
|
||||||
dir->__d_fd = cfd;
|
dir->__d_fd = cfd;
|
||||||
}
|
}
|
||||||
|
set_close_on_exec (true);
|
||||||
dir->__fh = this;
|
dir->__fh = this;
|
||||||
res = dir;
|
res = dir;
|
||||||
}
|
}
|
||||||
|
@ -1717,31 +1707,26 @@ readdir_get_ino (DIR *dir, const char *path, bool dot_dot)
|
||||||
HANDLE hdl;
|
HANDLE hdl;
|
||||||
__ino64_t ino = 0;
|
__ino64_t ino = 0;
|
||||||
|
|
||||||
if (!(dir->__flags & dirent_isroot))
|
strcpy (fname, path);
|
||||||
|
if (dot_dot)
|
||||||
|
strcat (fname, (*fname && fname[strlen (fname) - 1] == '/')
|
||||||
|
? ".." : "/..");
|
||||||
|
path_conv pc (fname, PC_SYM_NOFOLLOW);
|
||||||
|
if (pc.isspecial ())
|
||||||
{
|
{
|
||||||
strcpy (fname, path);
|
if (!lstat64 (fname, &st))
|
||||||
if (dot_dot)
|
ino = st.st_ino;
|
||||||
strcat (fname, (*fname && fname[strlen (fname) - 1] == '/')
|
}
|
||||||
? ".." : "/..");
|
else if (!pc.hasgood_inode ())
|
||||||
path_conv pc (fname, PC_SYM_NOFOLLOW);
|
ino = hash_path_name (0, pc);
|
||||||
if (pc.isspecial ())
|
else if ((hdl = CreateFile (pc, GENERIC_READ, FILE_SHARE_VALID_FLAGS,
|
||||||
{
|
NULL, OPEN_EXISTING,
|
||||||
if (!lstat64 (fname, &st))
|
FILE_FLAG_BACKUP_SEMANTICS, NULL))
|
||||||
ino = st.st_ino;
|
!= INVALID_HANDLE_VALUE)
|
||||||
}
|
{
|
||||||
else if (!pc.hasgood_inode ())
|
ino = readdir_get_ino_by_handle (hdl);
|
||||||
ino = hash_path_name (0, pc);
|
CloseHandle (hdl);
|
||||||
else if ((hdl = CreateFile (pc, GENERIC_READ, FILE_SHARE_VALID_FLAGS,
|
|
||||||
NULL, OPEN_EXISTING,
|
|
||||||
FILE_FLAG_BACKUP_SEMANTICS, NULL))
|
|
||||||
!= INVALID_HANDLE_VALUE)
|
|
||||||
{
|
|
||||||
ino = readdir_get_ino_by_handle (hdl);
|
|
||||||
CloseHandle (hdl);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
ino = readdir_get_ino_by_handle (dir->__handle);
|
|
||||||
return ino;
|
return ino;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1761,7 +1746,7 @@ fhandler_disk_file::readdir (DIR *dir, dirent *de)
|
||||||
{
|
{
|
||||||
if ((dir->__flags & dirent_get_d_ino))
|
if ((dir->__flags & dirent_get_d_ino))
|
||||||
{
|
{
|
||||||
status = NtQueryDirectoryFile (dir->__handle, NULL, NULL, 0, &io,
|
status = NtQueryDirectoryFile (get_handle (), NULL, NULL, 0, &io,
|
||||||
d_cache (dir), DIR_BUF_SIZE,
|
d_cache (dir), DIR_BUF_SIZE,
|
||||||
FileIdBothDirectoryInformation,
|
FileIdBothDirectoryInformation,
|
||||||
FALSE, NULL, dir->__d_position == 0);
|
FALSE, NULL, dir->__d_position == 0);
|
||||||
|
@ -1804,7 +1789,7 @@ fhandler_disk_file::readdir (DIR *dir, dirent *de)
|
||||||
{
|
{
|
||||||
if (d_cachepos (dir) == 0)
|
if (d_cachepos (dir) == 0)
|
||||||
{
|
{
|
||||||
status = NtQueryDirectoryFile (dir->__handle, NULL, NULL,
|
status = NtQueryDirectoryFile (get_handle (), NULL, NULL,
|
||||||
0, &io, d_cache (dir), DIR_BUF_SIZE,
|
0, &io, d_cache (dir), DIR_BUF_SIZE,
|
||||||
FileBothDirectoryInformation,
|
FileBothDirectoryInformation,
|
||||||
FALSE, NULL, cnt == 0);
|
FALSE, NULL, cnt == 0);
|
||||||
|
@ -1822,7 +1807,7 @@ fhandler_disk_file::readdir (DIR *dir, dirent *de)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!(dir->__flags & dirent_get_d_ino))
|
if (!(dir->__flags & dirent_get_d_ino))
|
||||||
status = NtQueryDirectoryFile (dir->__handle, NULL, NULL, 0, &io,
|
status = NtQueryDirectoryFile (get_handle (), NULL, NULL, 0, &io,
|
||||||
d_cache (dir), DIR_BUF_SIZE,
|
d_cache (dir), DIR_BUF_SIZE,
|
||||||
FileBothDirectoryInformation,
|
FileBothDirectoryInformation,
|
||||||
FALSE, NULL, dir->__d_position == 0);
|
FALSE, NULL, dir->__d_position == 0);
|
||||||
|
@ -1857,17 +1842,20 @@ go_ahead:
|
||||||
|
|
||||||
if (dir->__d_position == 0 && buf->FileNameLength == 2
|
if (dir->__d_position == 0 && buf->FileNameLength == 2
|
||||||
&& FileName[0] == '.')
|
&& FileName[0] == '.')
|
||||||
de->d_ino = readdir_get_ino_by_handle (dir->__handle);
|
de->d_ino = readdir_get_ino_by_handle (get_handle ());
|
||||||
else if (dir->__d_position == 1 && buf->FileNameLength == 4
|
else if (dir->__d_position == 1 && buf->FileNameLength == 4
|
||||||
&& FileName[0] == '.' && FileName[1] == '.')
|
&& FileName[0] == '.' && FileName[1] == '.')
|
||||||
de->d_ino = readdir_get_ino (dir, pc.normalized_path, true);
|
if (!(dir->__flags & dirent_isroot))
|
||||||
|
de->d_ino = readdir_get_ino (dir, pc.normalized_path, true);
|
||||||
|
else
|
||||||
|
de->d_ino = readdir_get_ino_by_handle (get_handle ());
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HANDLE hdl;
|
HANDLE hdl;
|
||||||
UNICODE_STRING upath = {buf->FileNameLength, CYG_MAX_PATH * 2,
|
UNICODE_STRING upath = {buf->FileNameLength, CYG_MAX_PATH * 2,
|
||||||
FileName};
|
FileName};
|
||||||
InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE,
|
InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE,
|
||||||
dir->__handle , NULL);
|
get_handle () , NULL);
|
||||||
if (!NtOpenFile (&hdl, READ_CONTROL, &attr, &io,
|
if (!NtOpenFile (&hdl, READ_CONTROL, &attr, &io,
|
||||||
FILE_SHARE_VALID_FLAGS,
|
FILE_SHARE_VALID_FLAGS,
|
||||||
FILE_OPEN_FOR_BACKUP_INTENT))
|
FILE_OPEN_FOR_BACKUP_INTENT))
|
||||||
|
@ -1891,7 +1879,7 @@ go_ahead:
|
||||||
else if (!(dir->__flags & dirent_saw_dot))
|
else if (!(dir->__flags & dirent_saw_dot))
|
||||||
{
|
{
|
||||||
strcpy (de->d_name , ".");
|
strcpy (de->d_name , ".");
|
||||||
de->d_ino = readdir_get_ino_by_handle (dir->__handle);
|
de->d_ino = readdir_get_ino_by_handle (get_handle ());
|
||||||
dir->__d_position++;
|
dir->__d_position++;
|
||||||
dir->__flags |= dirent_saw_dot;
|
dir->__flags |= dirent_saw_dot;
|
||||||
res = 0;
|
res = 0;
|
||||||
|
@ -1899,7 +1887,10 @@ go_ahead:
|
||||||
else if (!(dir->__flags & dirent_saw_dot_dot))
|
else if (!(dir->__flags & dirent_saw_dot_dot))
|
||||||
{
|
{
|
||||||
strcpy (de->d_name , "..");
|
strcpy (de->d_name , "..");
|
||||||
de->d_ino = readdir_get_ino (dir, pc.normalized_path, true);
|
if (!(dir->__flags & dirent_isroot))
|
||||||
|
de->d_ino = readdir_get_ino (dir, pc.normalized_path, true);
|
||||||
|
else
|
||||||
|
de->d_ino = readdir_get_ino_by_handle (get_handle ());
|
||||||
dir->__d_position++;
|
dir->__d_position++;
|
||||||
dir->__flags |= dirent_saw_dot_dot;
|
dir->__flags |= dirent_saw_dot_dot;
|
||||||
res = 0;
|
res = 0;
|
||||||
|
@ -1940,9 +1931,8 @@ fhandler_disk_file::rewinddir (DIR *dir)
|
||||||
IO_STATUS_BLOCK io;
|
IO_STATUS_BLOCK io;
|
||||||
HANDLE new_dir;
|
HANDLE new_dir;
|
||||||
|
|
||||||
InitializeObjectAttributes (&attr, &fname,
|
InitializeObjectAttributes (&attr, &fname, OBJ_CASE_INSENSITIVE,
|
||||||
OBJ_CASE_INSENSITIVE | OBJ_INHERIT,
|
get_handle (), NULL);
|
||||||
dir->__handle, NULL);
|
|
||||||
status = NtOpenFile (&new_dir, SYNCHRONIZE | FILE_LIST_DIRECTORY,
|
status = NtOpenFile (&new_dir, SYNCHRONIZE | FILE_LIST_DIRECTORY,
|
||||||
&attr, &io, FILE_SHARE_VALID_FLAGS,
|
&attr, &io, FILE_SHARE_VALID_FLAGS,
|
||||||
FILE_SYNCHRONOUS_IO_NONALERT
|
FILE_SYNCHRONOUS_IO_NONALERT
|
||||||
|
@ -1954,8 +1944,8 @@ fhandler_disk_file::rewinddir (DIR *dir)
|
||||||
RtlNtStatusToDosError (status));
|
RtlNtStatusToDosError (status));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CloseHandle (dir->__handle);
|
NtClose (get_handle ());
|
||||||
dir->__handle = new_dir;
|
set_io_handle (new_dir);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dir->__d_position = 0;
|
dir->__d_position = 0;
|
||||||
|
@ -1969,14 +1959,14 @@ fhandler_disk_file::closedir (DIR *dir)
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
|
|
||||||
delete d_mounts (dir);
|
delete d_mounts (dir);
|
||||||
if (!dir->__handle)
|
if (!get_handle ())
|
||||||
/* ignore */;
|
/* ignore */;
|
||||||
else if (dir->__handle == INVALID_HANDLE_VALUE)
|
else if (get_handle () == INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
set_errno (EBADF);
|
set_errno (EBADF);
|
||||||
res = -1;
|
res = -1;
|
||||||
}
|
}
|
||||||
else if (!NT_SUCCESS (status = NtClose (dir->__handle)))
|
else if (!NT_SUCCESS (status = NtClose (get_handle ())))
|
||||||
{
|
{
|
||||||
__seterrno_from_nt_status (status);
|
__seterrno_from_nt_status (status);
|
||||||
res = -1;
|
res = -1;
|
||||||
|
|
|
@ -80,7 +80,6 @@ fhandler_virtual::opendir (int fd)
|
||||||
|
|
||||||
if (fd >= 0)
|
if (fd >= 0)
|
||||||
{
|
{
|
||||||
dir->__flags |= dirent_valid_fd;
|
|
||||||
dir->__d_fd = fd;
|
dir->__d_fd = fd;
|
||||||
res = dir;
|
res = dir;
|
||||||
dir->__fh = this;
|
dir->__fh = this;
|
||||||
|
@ -98,6 +97,7 @@ fhandler_virtual::opendir (int fd)
|
||||||
res = dir;
|
res = dir;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
close_on_exec (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
syscall_printf ("%p = opendir (%s)", res, get_name ());
|
syscall_printf ("%p = opendir (%s)", res, get_name ());
|
||||||
|
|
Loading…
Reference in New Issue