From 1aa76ad568b4dc7b0a68137fc7f2b6dedbcae492 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Wed, 10 Sep 2003 20:16:00 +0000 Subject: [PATCH] * fhandler_disk_file.cc (num_entries): Take . and .. into account if they do not exist since cygwin simulates them. (fhandler_cygdrive::fstat): Ditto. (fhandler_cygdrive::readdir): Don't do any specific tests on __d_position when seeing if a drive exists. --- winsup/cygwin/ChangeLog | 8 ++++++++ winsup/cygwin/dir.cc | 2 ++ winsup/cygwin/fhandler_disk_file.cc | 27 +++++++++++++-------------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 023e63883..ad7010b14 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +2003-09-10 Christopher Faylor + + * fhandler_disk_file.cc (num_entries): Take . and .. into account if + they do not exist since cygwin simulates them. + (fhandler_cygdrive::fstat): Ditto. + (fhandler_cygdrive::readdir): Don't do any specific tests on + __d_position when seeing if a drive exists. + 2003-09-10 Corinna Vinschen * Makefile.in (DLL_OFILES): Add getopt.o and iruserok.o. diff --git a/winsup/cygwin/dir.cc b/winsup/cygwin/dir.cc index c7edd8871..96ab1f282 100644 --- a/winsup/cygwin/dir.cc +++ b/winsup/cygwin/dir.cc @@ -129,12 +129,14 @@ readdir (DIR *dir) res = dir->__d_dirent; strcpy (res->d_name, "."); dir->__flags |= opendir_saw_dot; + dir->__d_position++; } else if (!(dir->__flags & opendir_saw_dot_dot)) { res = dir->__d_dirent; strcpy (res->d_name, ".."); dir->__flags |= opendir_saw_dot_dot; + dir->__d_position++; } } diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index e687efc63..5dbfa457b 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -48,14 +48,18 @@ num_entries (const char *win32_name) if (handle == INVALID_HANDLE_VALUE) return 2; /* 2 is the minimum number of links to a dir, so... */ - count ++; + int saw_dot = 2; while (FindNextFileA (handle, &buf)) { - if ((buf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) - count ++; + if (buf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + count++; + if (buf.cFileName[0] == '.' + && (buf.cFileName[1] == '\0' + || (buf.cFileName[1] == '.' && buf.cFileName[2] == '\0'))) + saw_dot--; } FindClose (handle); - return count; + return count + saw_dot; } int __stdcall @@ -743,7 +747,7 @@ fhandler_cygdrive::fstat (struct __stat64 *buf, path_conv *pc) buf->st_mode = S_IFDIR | 0555; if (!ndrives) set_drives (); - buf->st_nlink = ndrives; + buf->st_nlink = ndrives + 2; return 0; } @@ -766,19 +770,14 @@ fhandler_cygdrive::readdir (DIR *dir) return fhandler_disk_file::readdir (dir); if (!pdrive || !*pdrive) return NULL; - else if (dir->__d_position > 1 - && GetFileAttributes (pdrive) == INVALID_FILE_ATTRIBUTES) + if (GetFileAttributes (pdrive) == INVALID_FILE_ATTRIBUTES) { pdrive = strchr (pdrive, '\0') + 1; return readdir (dir); } - else if (*pdrive == '.') - strcpy (dir->__d_dirent->d_name, pdrive); - else - { - *dir->__d_dirent->d_name = cyg_tolower (*pdrive); - dir->__d_dirent->d_name[1] = '\0'; - } + + *dir->__d_dirent->d_name = cyg_tolower (*pdrive); + dir->__d_dirent->d_name[1] = '\0'; dir->__d_position++; pdrive = strchr (pdrive, '\0') + 1; syscall_printf ("%p = readdir (%p) (%s)", &dir->__d_dirent, dir,