* dir.cc (readdir_workdir): Only fill out d_ino when linked into older app.

* include/cygwin/version.h: Bump api minor number to 147, reflecting
obsolescence of d_ino.
(CYGWIN_VERSION_USER_API_VERSION_COMBINED): New convenience macro.
(CYGWIN_VERSION_CHECK_FOR_NEEDS_D_INO): New convenience macro.
This commit is contained in:
Christopher Faylor
2005-12-05 21:02:53 +00:00
parent 4535b5961f
commit c34aee9b23
4 changed files with 69 additions and 56 deletions

View File

@@ -24,6 +24,8 @@ details. */
#include "dtable.h"
#include "cygheap.h"
#include "cygtls.h"
#include "perprocess.h"
#include "cygwin/version.h"
extern "C" int
dirfd (DIR *dir)
@@ -99,43 +101,49 @@ readdir_worker (DIR *dir, dirent *de)
}
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 (de->d_name[0] == '.')
{
if (de->d_name[1] == '\0')
{
de->d_ino = dir->__d_dirhash;
dir->__flags |= dirent_saw_dot;
}
else if (de->d_name[1] != '.' || de->d_name[2] != '\0')
goto hashit;
else
{
dir->__flags |= dirent_saw_dot_dot;
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, '\\')))
de->d_ino = hash_path_name (0, ".");
else
{
*p = '\0';
de->d_ino = hash_path_name (0, up);
}
}
}
else
{
hashit:
__ino64_t dino = hash_path_name (dir->__d_dirhash, "\\");
de->d_ino = hash_path_name (dino, de->d_name);
}
de->__ino32 = de->d_ino; // for legacy applications
}
if (!CYGWIN_VERSION_CHECK_FOR_NEEDS_D_INO)
{
de->__deprecated_d_ino = 0;
de->__ino32 = 0;
}
else
{
/* Compute __deprecated_d_ino by combining filename hash with the directory hash
(which was stored in dir->__d_dirhash when opendir was called). */
if (de->d_name[0] == '.')
{
if (de->d_name[1] == '\0')
{
de->__deprecated_d_ino = dir->__d_dirhash;
dir->__flags |= dirent_saw_dot;
}
else if (de->d_name[1] != '.' || de->d_name[2] != '\0')
goto hashit;
else
{
dir->__flags |= dirent_saw_dot_dot;
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, '\\')))
de->__deprecated_d_ino = hash_path_name (0, ".");
else
{
*p = '\0';
de->__deprecated_d_ino = hash_path_name (0, up);
}
}
}
else
{
hashit:
__ino64_t dino = hash_path_name (dir->__d_dirhash, "\\");
de->__deprecated_d_ino = hash_path_name (dino, de->d_name);
}
de->__ino32 = de->__deprecated_d_ino; // for legacy applications
}
return res;
}