* 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.
This commit is contained in:
Christopher Faylor 2003-09-10 20:16:00 +00:00
parent 932a40e86b
commit 1aa76ad568
3 changed files with 23 additions and 14 deletions

View File

@ -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> 2003-09-10 Corinna Vinschen <corinna@vinschen.de>
* Makefile.in (DLL_OFILES): Add getopt.o and iruserok.o. * Makefile.in (DLL_OFILES): Add getopt.o and iruserok.o.

View File

@ -129,12 +129,14 @@ readdir (DIR *dir)
res = dir->__d_dirent; res = dir->__d_dirent;
strcpy (res->d_name, "."); strcpy (res->d_name, ".");
dir->__flags |= opendir_saw_dot; dir->__flags |= opendir_saw_dot;
dir->__d_position++;
} }
else if (!(dir->__flags & opendir_saw_dot_dot)) else if (!(dir->__flags & opendir_saw_dot_dot))
{ {
res = dir->__d_dirent; res = dir->__d_dirent;
strcpy (res->d_name, ".."); strcpy (res->d_name, "..");
dir->__flags |= opendir_saw_dot_dot; dir->__flags |= opendir_saw_dot_dot;
dir->__d_position++;
} }
} }

View File

@ -48,14 +48,18 @@ num_entries (const char *win32_name)
if (handle == INVALID_HANDLE_VALUE) if (handle == INVALID_HANDLE_VALUE)
return 2; /* 2 is the minimum number of links to a dir, so... */ return 2; /* 2 is the minimum number of links to a dir, so... */
count ++; int saw_dot = 2;
while (FindNextFileA (handle, &buf)) while (FindNextFileA (handle, &buf))
{ {
if ((buf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) if (buf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
count ++; count++;
if (buf.cFileName[0] == '.'
&& (buf.cFileName[1] == '\0'
|| (buf.cFileName[1] == '.' && buf.cFileName[2] == '\0')))
saw_dot--;
} }
FindClose (handle); FindClose (handle);
return count; return count + saw_dot;
} }
int __stdcall int __stdcall
@ -743,7 +747,7 @@ fhandler_cygdrive::fstat (struct __stat64 *buf, path_conv *pc)
buf->st_mode = S_IFDIR | 0555; buf->st_mode = S_IFDIR | 0555;
if (!ndrives) if (!ndrives)
set_drives (); set_drives ();
buf->st_nlink = ndrives; buf->st_nlink = ndrives + 2;
return 0; return 0;
} }
@ -766,19 +770,14 @@ fhandler_cygdrive::readdir (DIR *dir)
return fhandler_disk_file::readdir (dir); return fhandler_disk_file::readdir (dir);
if (!pdrive || !*pdrive) if (!pdrive || !*pdrive)
return NULL; return NULL;
else if (dir->__d_position > 1 if (GetFileAttributes (pdrive) == INVALID_FILE_ATTRIBUTES)
&& GetFileAttributes (pdrive) == INVALID_FILE_ATTRIBUTES)
{ {
pdrive = strchr (pdrive, '\0') + 1; pdrive = strchr (pdrive, '\0') + 1;
return readdir (dir); 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 = cyg_tolower (*pdrive);
dir->__d_dirent->d_name[1] = '\0'; dir->__d_dirent->d_name[1] = '\0';
}
dir->__d_position++; dir->__d_position++;
pdrive = strchr (pdrive, '\0') + 1; pdrive = strchr (pdrive, '\0') + 1;
syscall_printf ("%p = readdir (%p) (%s)", &dir->__d_dirent, dir, syscall_printf ("%p = readdir (%p) (%s)", &dir->__d_dirent, dir,