* 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>
* Makefile.in (DLL_OFILES): Add getopt.o and iruserok.o.

View File

@ -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++;
}
}

View File

@ -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,