Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2007-06-29 19:13:01 +0400
committerCorinna Vinschen <corinna@vinschen.de>2007-06-29 19:13:01 +0400
commit40570a828e0ed00cf570a2d7fa41ddae887c1367 (patch)
tree86f1a9e5322b57c1b2567a1e85b308e0ff932816 /winsup/cygwin/fhandler_virtual.cc
parent8931495a1417c7dc1b6c56d0120efb40a1fa030b (diff)
* cygwin.din: Export fdopendir.
* dir.cc (opendir): Call fhandler's opendir with fd set to -1. (fdopendir): New function. (seekdir64): Use dirent_info_mask. (rewinddir): Ditto. (closedir): Only release underlying file descriptor if it has been reserved by opendir itself. * fhandler.cc (fhandler_base::opendir): Accommodate new parameter. * fhandler.h (dirent_states): Add dirent_valid_fd and dirent_info_mask. (fhander_XXX::opendir): Add file descriptor parameter. Use regparms. (fhandler_procnet::opendir): Drop declaration. * fhandler_disk_file.cc (fhandler_disk_file::opendir): Ditto. If called from fdopendir, use existing handle to re-open directory with valid flags. Rename fd to cfd. Use only if no valid incoming fd. (fhandler_cygdrive::opendir): Accommodate new parameter. * fhandler_process.cc (fhandler_process::opendir): Ditto. * fhandler_procnet.cc (fhandler_procnet::opendir): Drop definition. * fhandler_virtual.cc (fhandler_virtual::opendir): Accommodate new parameter. Only create new file descriptor entry if called from opendir. Remove duplicated setting of dir->__flags. * posix.sgml: Add fdopendir to list of implemented Solaris functions. * include/cygwin/version.h: Bump API minor number. * include/sys/dirent.h: Declare fdopendir.
Diffstat (limited to 'winsup/cygwin/fhandler_virtual.cc')
-rw-r--r--winsup/cygwin/fhandler_virtual.cc32
1 files changed, 21 insertions, 11 deletions
diff --git a/winsup/cygwin/fhandler_virtual.cc b/winsup/cygwin/fhandler_virtual.cc
index 13f8e1fd4..4045c2d5e 100644
--- a/winsup/cygwin/fhandler_virtual.cc
+++ b/winsup/cygwin/fhandler_virtual.cc
@@ -46,7 +46,7 @@ fhandler_virtual::fixup_after_exec ()
}
DIR *
-fhandler_virtual::opendir ()
+fhandler_virtual::opendir (int fd)
{
DIR *dir;
DIR *res = NULL;
@@ -73,20 +73,30 @@ fhandler_virtual::opendir ()
{
strcpy (dir->__d_dirname, get_name ());
dir->__d_dirent->__d_version = __DIRENT_VERSION;
- cygheap_fdnew fd;
+ dir->__d_cookie = __DIRENT_COOKIE;
+ dir->__handle = INVALID_HANDLE_VALUE;
+ dir->__d_position = 0;
+ dir->__flags = 0;
+
if (fd >= 0)
- {
- fd = this;
- fd->nohandle (true);
+ {
+ dir->__flags |= dirent_valid_fd;
dir->__d_fd = fd;
+ res = dir;
dir->__fh = this;
- dir->__d_cookie = __DIRENT_COOKIE;
- dir->__handle = INVALID_HANDLE_VALUE;
- dir->__d_position = 0;
- // dir->__d_dirhash = get_namehash ();
- dir->__flags = dirent_saw_dot | dirent_saw_dot_dot;
res = dir;
- res->__flags = 0;
+ }
+ else
+ {
+ cygheap_fdnew cfd;
+ if (cfd >= 0)
+ {
+ cfd = this;
+ cfd->nohandle (true);
+ dir->__d_fd = cfd;
+ dir->__fh = this;
+ res = dir;
+ }
}
}