From 28af03faed3f79e2d8e284f1fc83adb6a0c4f193 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Sat, 1 Jun 2002 02:45:38 +0000 Subject: [PATCH] * fhandler_disk_file.cc (readdir): Move inode calculation into caller. (fhandler_cygdrive::readdir): Add "." and "..". * dir.cc (readdir): Move inode calculation here so that fhandler readdirs can benefit. --- winsup/cygwin/ChangeLog | 7 ++++ winsup/cygwin/dir.cc | 37 ++++++++++++++++++++- winsup/cygwin/fhandler_disk_file.cc | 50 +++++++++-------------------- 3 files changed, 59 insertions(+), 35 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 02fedb852..13d79a7ab 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2002-05-31 Christopher Faylor + + * fhandler_disk_file.cc (readdir): Move inode calculation into caller. + (fhandler_cygdrive::readdir): Add "." and "..". + * dir.cc (readdir): Move inode calculation here so that fhandler + readdirs can benefit. + 2002-05-31 Christopher Faylor * fhandler_console.cc (fhandler_console::open): Reinstate setting of diff --git a/winsup/cygwin/dir.cc b/winsup/cygwin/dir.cc index ef8b67d5b..94e2802cb 100644 --- a/winsup/cygwin/dir.cc +++ b/winsup/cygwin/dir.cc @@ -113,7 +113,42 @@ readdir (DIR *dir) return NULL; } - return ((fhandler_base *) dir->__d_u.__d_data.__fh)->readdir (dir); + dirent *res = ((fhandler_base *) dir->__d_u.__d_data.__fh)->readdir (dir); + + if (res) + { + /* Compute d_ino by combining filename hash with the directory hash + (which was stored in dir->__d_dirhash when opendir was called). */ + if (res->d_name[0] == '.') + { + if (res->d_name[1] == '\0') + dir->__d_dirent->d_ino = dir->__d_dirhash; + else if (res->d_name[1] != '.' || res->d_name[2] != '\0') + goto hashit; + else + { + char *p, up[strlen (dir->__d_dirname) + 1]; + strcpy (up, dir->__d_dirname); + if (!(p = strrchr (up, '\\'))) + goto hashit; + *p = '\0'; + if (!(p = strrchr (up, '\\'))) + dir->__d_dirent->d_ino = hash_path_name (0, "."); + else + { + *p = '\0'; + dir->__d_dirent->d_ino = hash_path_name (0, up); + } + } + } + else + { + hashit: + ino_t dino = hash_path_name (dir->__d_dirhash, "\\"); + dir->__d_dirent->d_ino = hash_path_name (dino, res->d_name); + } + } + return res; } extern "C" __off64_t diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index 2548ce6f0..54c08ec4e 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -656,37 +656,6 @@ fhandler_disk_file::readdir (DIR *dir) } } - /* Compute d_ino by combining filename hash with the directory hash - (which was stored in dir->__d_dirhash when opendir was called). */ - if (buf.cFileName[0] == '.') - { - if (buf.cFileName[1] == '\0') - dir->__d_dirent->d_ino = dir->__d_dirhash; - else if (buf.cFileName[1] != '.' || buf.cFileName[2] != '\0') - goto hashit; - else - { - char *p, up[strlen (dir->__d_dirname) + 1]; - strcpy (up, dir->__d_dirname); - if (!(p = strrchr (up, '\\'))) - goto hashit; - *p = '\0'; - if (!(p = strrchr (up, '\\'))) - dir->__d_dirent->d_ino = hash_path_name (0, "."); - else - { - *p = '\0'; - dir->__d_dirent->d_ino = hash_path_name (0, up); - } - } - } - else - { - hashit: - ino_t dino = hash_path_name (dir->__d_dirhash, "\\"); - dir->__d_dirent->d_ino = hash_path_name (dino, buf.cFileName); - } - dir->__d_position++; res = dir->__d_dirent; syscall_printf ("%p = readdir (%p) (%s)", @@ -784,13 +753,26 @@ fhandler_cygdrive::readdir (DIR *dir) set_errno (ENMFILE); return NULL; } - if (GetFileAttributes (pdrive) == INVALID_FILE_ATTRIBUTES) + if (dir->__d_position == 0) + { + *dir->__d_dirent->d_name = '.'; + dir->__d_dirent->d_name[1] = '\0'; + } + else if (dir->__d_position == 1) + { + dir->__d_dirent->d_name[0] = dir->__d_dirent->d_name[1] = '.'; + dir->__d_dirent->d_name[2] = '\0'; + } + else if (GetFileAttributes (pdrive) == INVALID_FILE_ATTRIBUTES) { pdrive += DRVSZ; return readdir (dir); } - *dir->__d_dirent->d_name = cyg_tolower (*pdrive); - dir->__d_dirent->d_name[1] = '\0'; + else + { + *dir->__d_dirent->d_name = cyg_tolower (*pdrive); + dir->__d_dirent->d_name[1] = '\0'; + } dir->__d_position++; pdrive += DRVSZ; syscall_printf ("%p = readdir (%p) (%s)", &dir->__d_dirent, dir,