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:
authorChristopher Faylor <me@cgf.cx>2006-02-05 10:03:24 +0300
committerChristopher Faylor <me@cgf.cx>2006-02-05 10:03:24 +0300
commitc6e665bb95e4d8652ef17d89de627867fe961e71 (patch)
tree7b0e199de93ef595073e13519e28ccca4b85a3c7 /winsup/cygwin
parentdcbaac9b8cc15fff4e59ffc286275fa5f5192a7e (diff)
* fhandler_disk_file.cc (fhandler_disk_file::readdir): Don't close dir handle
when we hit EOF since rewwindir may reactivate it. (fhandler_disk_file::readdir_9x): Eliminate superfluous temporary variable. (fhandler_disk_file::closedir): Return EBADF when trying to close unopened DIR. Reorganize slightly. Return actual derived error value rather than always returning 0.
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog10
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc36
2 files changed, 31 insertions, 15 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index b064f20a8..16dc7d6bf 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,13 @@
+2006-02-05 Christopher Faylor <cgf@timesys.com>
+
+ * fhandler_disk_file.cc (fhandler_disk_file::readdir): Don't close dir
+ handle when we hit EOF since rewwindir may reactivate it.
+ (fhandler_disk_file::readdir_9x): Eliminate superfluous temporary
+ variable.
+ (fhandler_disk_file::closedir): Return EBADF when trying to close
+ unopened DIR. Reorganize slightly. Return actual derived error value
+ rather than always returning 0.
+
2006-02-04 Christopher Faylor <cgf@timesys.com>
* dir.cc (rmdir): Reorganize check for trailing dot to return correct
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc
index be9d5128b..b86813ef0 100644
--- a/winsup/cygwin/fhandler_disk_file.cc
+++ b/winsup/cygwin/fhandler_disk_file.cc
@@ -1690,11 +1690,6 @@ fhandler_disk_file::readdir (DIR *dir, dirent *de)
dir->__flags |= dirent_saw_dot_dot;
res = 0;
}
- else
- {
- CloseHandle (dir->__handle);
- dir->__handle = NULL;
- }
out:
syscall_printf ("%d = readdir (%p) (%s)", dir, &de, de->d_name);
@@ -1705,7 +1700,6 @@ int
fhandler_disk_file::readdir_9x (DIR *dir, dirent *de)
{
WIN32_FIND_DATA buf;
- HANDLE handle;
int res = 0;
BOOL ret = TRUE;
@@ -1713,11 +1707,10 @@ fhandler_disk_file::readdir_9x (DIR *dir, dirent *de)
{
int len = strlen (dir->__d_dirname);
strcpy (dir->__d_dirname + len, "*");
- handle = FindFirstFileA (dir->__d_dirname, &buf);
+ dir->__handle = FindFirstFile (dir->__d_dirname, &buf);
dir->__d_dirname[len] = '\0';
DWORD lasterr = GetLastError ();
- dir->__handle = handle;
- if (handle == INVALID_HANDLE_VALUE && (lasterr != ERROR_NO_MORE_FILES))
+ if (dir->__handle == INVALID_HANDLE_VALUE && (lasterr != ERROR_NO_MORE_FILES))
{
res = geterrno_from_win_error ();
goto out;
@@ -1725,7 +1718,7 @@ fhandler_disk_file::readdir_9x (DIR *dir, dirent *de)
}
else if (dir->__handle == INVALID_HANDLE_VALUE)
{
- res = EBADF;
+ res = EBADF; /* FIXME: Isn't this just a case of repeated reading beyond EOF? */
goto out;
}
else
@@ -1778,15 +1771,28 @@ int
fhandler_disk_file::closedir (DIR *dir)
{
int res = 0;
- if (dir->__handle && dir->__handle != INVALID_HANDLE_VALUE
- && ((wincap.is_winnt () && !CloseHandle (dir->__handle))
- || (!wincap.is_winnt () && !FindClose (dir->__handle))))
+ if (!dir->__handle)
+ /* ignore */;
+ else if (dir->__handle == INVALID_HANDLE_VALUE)
{
- __seterrno ();
+ set_errno (EBADF);
res = -1;
}
+ else
+ {
+ BOOL winres;
+ if (wincap.is_winnt ())
+ winres = CloseHandle (dir->__handle);
+ else
+ winres = FindClose (dir->__handle);
+ if (!winres)
+ {
+ __seterrno ();
+ res = -1;
+ }
+ }
syscall_printf ("%d = closedir (%p)", res, dir);
- return 0;
+ return res;
}
fhandler_cygdrive::fhandler_cygdrive () :