summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2003-09-10 20:16:00 +0000
committerChristopher Faylor <me@cgf.cx>2003-09-10 20:16:00 +0000
commit1aa76ad568b4dc7b0a68137fc7f2b6dedbcae492 (patch)
tree5d82ec3e3ac6e5c159dfacbddbd0257a98c9108c
parent932a40e86b8472fb8881a71ef8f139a6ba9d0e42 (diff)
downloadcygnal-1aa76ad568b4dc7b0a68137fc7f2b6dedbcae492.tar.gz
cygnal-1aa76ad568b4dc7b0a68137fc7f2b6dedbcae492.tar.bz2
cygnal-1aa76ad568b4dc7b0a68137fc7f2b6dedbcae492.zip
* 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.
-rw-r--r--winsup/cygwin/ChangeLog8
-rw-r--r--winsup/cygwin/dir.cc2
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc27
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 <cgf@redhat.com>
+
+ * 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 <corinna@vinschen.de>
* 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,