mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-23 13:30:06 +00:00
Assume that _DIRENT_HAVE_D_TYPE is always defined.
References remain in io/fts.c, io/ftw.c, posix/glob.c, sysdeps/posix/getcwd.c. These files are (potentially) externally shared.
This commit is contained in:
parent
68fe16dd32
commit
4484b9e296
15
ChangeLog
15
ChangeLog
@ -1,3 +1,18 @@
|
|||||||
|
2017-10-30 Florian Weimer <fweimer@redhat.com>
|
||||||
|
|
||||||
|
* elf/ldconfig.c (search_dir): Assume that _DIRENT_HAVE_D_TYPE is
|
||||||
|
always defined.
|
||||||
|
* io/tst-mkdirat.c (do_test): Likewise.
|
||||||
|
* io/tst-mkfifoat.c (do_test): Likewise.
|
||||||
|
* io/tst-mknodat.c (do_test): Likewise.
|
||||||
|
* locale/programs/charmap-dir.c (charmap_readdir): Likewise.
|
||||||
|
* locale/programs/locale.c (select_dirs): Likewise.
|
||||||
|
* locale/programs/locarchive.c (add_locales_to_archive): Likewise.
|
||||||
|
* posix/bug-glob2.c (my_readdir): Likewise.
|
||||||
|
* posix/tst-dir.c (main): Likewise.
|
||||||
|
* posix/tst-glob_lstat_compat.c (my_readdir): Likewise.
|
||||||
|
* posix/tst-gnuglob-skeleton.c (my_readdir): Likewise.
|
||||||
|
|
||||||
2017-10-30 Florian Weimer <fweimer@redhat.com>
|
2017-10-30 Florian Weimer <fweimer@redhat.com>
|
||||||
|
|
||||||
* string/strings.h (ffsl, ffsll): Declare under __USE_MISC, not
|
* string/strings.h (ffsl, ffsll): Declare under __USE_MISC, not
|
||||||
|
@ -710,25 +710,20 @@ search_dir (const struct dir_entry *entry)
|
|||||||
while ((direntry = readdir64 (dir)) != NULL)
|
while ((direntry = readdir64 (dir)) != NULL)
|
||||||
{
|
{
|
||||||
int flag;
|
int flag;
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
/* We only look at links and regular files. */
|
/* We only look at links and regular files. */
|
||||||
if (direntry->d_type != DT_UNKNOWN
|
if (direntry->d_type != DT_UNKNOWN
|
||||||
&& direntry->d_type != DT_LNK
|
&& direntry->d_type != DT_LNK
|
||||||
&& direntry->d_type != DT_REG
|
&& direntry->d_type != DT_REG
|
||||||
&& direntry->d_type != DT_DIR)
|
&& direntry->d_type != DT_DIR)
|
||||||
continue;
|
continue;
|
||||||
#endif /* _DIRENT_HAVE_D_TYPE */
|
|
||||||
/* Does this file look like a shared library or is it a hwcap
|
/* Does this file look like a shared library or is it a hwcap
|
||||||
subdirectory? The dynamic linker is also considered as
|
subdirectory? The dynamic linker is also considered as
|
||||||
shared library. */
|
shared library. */
|
||||||
if (((strncmp (direntry->d_name, "lib", 3) != 0
|
if (((strncmp (direntry->d_name, "lib", 3) != 0
|
||||||
&& strncmp (direntry->d_name, "ld-", 3) != 0)
|
&& strncmp (direntry->d_name, "ld-", 3) != 0)
|
||||||
|| strstr (direntry->d_name, ".so") == NULL)
|
|| strstr (direntry->d_name, ".so") == NULL)
|
||||||
&& (
|
&& (direntry->d_type == DT_REG
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|| !is_hwcap_platform (direntry->d_name)))
|
||||||
direntry->d_type == DT_REG ||
|
|
||||||
#endif
|
|
||||||
!is_hwcap_platform (direntry->d_name)))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
size_t len = strlen (direntry->d_name);
|
size_t len = strlen (direntry->d_name);
|
||||||
@ -765,12 +760,10 @@ search_dir (const struct dir_entry *entry)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct stat64 lstat_buf;
|
struct stat64 lstat_buf;
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
/* We optimize and try to do the lstat call only if needed. */
|
/* We optimize and try to do the lstat call only if needed. */
|
||||||
if (direntry->d_type != DT_UNKNOWN)
|
if (direntry->d_type != DT_UNKNOWN)
|
||||||
lstat_buf.st_mode = DTTOIF (direntry->d_type);
|
lstat_buf.st_mode = DTTOIF (direntry->d_type);
|
||||||
else
|
else
|
||||||
#endif
|
|
||||||
if (__glibc_unlikely (lstat64 (real_file_name, &lstat_buf)))
|
if (__glibc_unlikely (lstat64 (real_file_name, &lstat_buf)))
|
||||||
{
|
{
|
||||||
error (0, errno, _("Cannot lstat %s"), file_name);
|
error (0, errno, _("Cannot lstat %s"), file_name);
|
||||||
@ -825,9 +818,6 @@ search_dir (const struct dir_entry *entry)
|
|||||||
new_entry->path = xstrdup (file_name);
|
new_entry->path = xstrdup (file_name);
|
||||||
new_entry->flag = entry->flag;
|
new_entry->flag = entry->flag;
|
||||||
new_entry->next = NULL;
|
new_entry->next = NULL;
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
/* We have filled in lstat only #ifndef
|
|
||||||
_DIRENT_HAVE_D_TYPE. Fill it in if needed. */
|
|
||||||
if (!is_link
|
if (!is_link
|
||||||
&& direntry->d_type != DT_UNKNOWN
|
&& direntry->d_type != DT_UNKNOWN
|
||||||
&& __builtin_expect (lstat64 (real_file_name, &lstat_buf), 0))
|
&& __builtin_expect (lstat64 (real_file_name, &lstat_buf), 0))
|
||||||
@ -837,7 +827,6 @@ search_dir (const struct dir_entry *entry)
|
|||||||
free (new_entry);
|
free (new_entry);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
new_entry->ino = lstat_buf.st_ino;
|
new_entry->ino = lstat_buf.st_ino;
|
||||||
new_entry->dev = lstat_buf.st_dev;
|
new_entry->dev = lstat_buf.st_dev;
|
||||||
add_single_dir (new_entry, 0);
|
add_single_dir (new_entry, 0);
|
||||||
@ -860,7 +849,6 @@ search_dir (const struct dir_entry *entry)
|
|||||||
else
|
else
|
||||||
real_name = real_file_name;
|
real_name = real_file_name;
|
||||||
|
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
/* Call lstat64 if not done yet. */
|
/* Call lstat64 if not done yet. */
|
||||||
if (!is_link
|
if (!is_link
|
||||||
&& direntry->d_type != DT_UNKNOWN
|
&& direntry->d_type != DT_UNKNOWN
|
||||||
@ -869,7 +857,6 @@ search_dir (const struct dir_entry *entry)
|
|||||||
error (0, errno, _("Cannot lstat %s"), file_name);
|
error (0, errno, _("Cannot lstat %s"), file_name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* First search whether the auxiliary cache contains this
|
/* First search whether the auxiliary cache contains this
|
||||||
library already and it's not changed. */
|
library already and it's not changed. */
|
||||||
|
@ -131,13 +131,11 @@ do_test (void)
|
|||||||
if (strcmp (d->d_name, "some-dir") == 0)
|
if (strcmp (d->d_name, "some-dir") == 0)
|
||||||
{
|
{
|
||||||
has_some_dir = true;
|
has_some_dir = true;
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
if (d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
|
if (d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
|
||||||
{
|
{
|
||||||
puts ("d_type for some-dir wrong");
|
puts ("d_type for some-dir wrong");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
|
else if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
|
||||||
{
|
{
|
||||||
|
@ -131,13 +131,11 @@ do_test (void)
|
|||||||
if (strcmp (d->d_name, "some-fifo") == 0)
|
if (strcmp (d->d_name, "some-fifo") == 0)
|
||||||
{
|
{
|
||||||
has_some_fifo = true;
|
has_some_fifo = true;
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
if (d->d_type != DT_UNKNOWN && d->d_type != DT_FIFO)
|
if (d->d_type != DT_UNKNOWN && d->d_type != DT_FIFO)
|
||||||
{
|
{
|
||||||
puts ("d_type for some-fifo wrong");
|
puts ("d_type for some-fifo wrong");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
|
else if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
|
||||||
{
|
{
|
||||||
|
@ -131,13 +131,11 @@ do_test (void)
|
|||||||
if (strcmp (d->d_name, "some-fifo") == 0)
|
if (strcmp (d->d_name, "some-fifo") == 0)
|
||||||
{
|
{
|
||||||
has_some_fifo = true;
|
has_some_fifo = true;
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
if (d->d_type != DT_UNKNOWN && d->d_type != DT_FIFO)
|
if (d->d_type != DT_UNKNOWN && d->d_type != DT_FIFO)
|
||||||
{
|
{
|
||||||
puts ("d_type for some-fifo wrong");
|
puts ("d_type for some-fifo wrong");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
|
else if (strcmp (d->d_name, ".") != 0 && strcmp (d->d_name, "..") != 0)
|
||||||
{
|
{
|
||||||
|
@ -115,11 +115,9 @@ charmap_readdir (CHARMAP_DIR *cdir)
|
|||||||
stpcpy (stpcpy (cdir->pathname, cdir->directory), dirent->d_name);
|
stpcpy (stpcpy (cdir->pathname, cdir->directory), dirent->d_name);
|
||||||
filename = cdir->pathname + cdir->directory_len;
|
filename = cdir->pathname + cdir->directory_len;
|
||||||
|
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
if (dirent->d_type != DT_UNKNOWN && dirent->d_type != DT_LNK)
|
if (dirent->d_type != DT_UNKNOWN && dirent->d_type != DT_LNK)
|
||||||
mode = DTTOIF (dirent->d_type);
|
mode = DTTOIF (dirent->d_type);
|
||||||
else
|
else
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
struct stat64 statbuf;
|
struct stat64 statbuf;
|
||||||
|
|
||||||
|
@ -316,11 +316,9 @@ select_dirs (const struct dirent *dirent)
|
|||||||
{
|
{
|
||||||
mode_t mode = 0;
|
mode_t mode = 0;
|
||||||
|
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
if (dirent->d_type != DT_UNKNOWN && dirent->d_type != DT_LNK)
|
if (dirent->d_type != DT_UNKNOWN && dirent->d_type != DT_LNK)
|
||||||
mode = DTTOIF (dirent->d_type);
|
mode = DTTOIF (dirent->d_type);
|
||||||
else
|
else
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
struct stat64 st;
|
struct stat64 st;
|
||||||
char buf[sizeof (COMPLOCALEDIR)
|
char buf[sizeof (COMPLOCALEDIR)
|
||||||
|
@ -1385,17 +1385,13 @@ add_locales_to_archive (size_t nlist, char *list[], bool replace)
|
|||||||
a directory we have to look at a file with the
|
a directory we have to look at a file with the
|
||||||
prefix "SYS_". Otherwise we have found what we
|
prefix "SYS_". Otherwise we have found what we
|
||||||
are looking for. */
|
are looking for. */
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
d_type = d->d_type;
|
d_type = d->d_type;
|
||||||
|
|
||||||
if (d_type != DT_REG)
|
if (d_type != DT_REG)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
char fullname[fnamelen + 2 * strlen (d->d_name) + 7];
|
char fullname[fnamelen + 2 * strlen (d->d_name) + 7];
|
||||||
|
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
if (d_type == DT_UNKNOWN)
|
if (d_type == DT_UNKNOWN)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
strcpy (stpcpy (stpcpy (fullname, fname), "/"),
|
strcpy (stpcpy (stpcpy (fullname, fname), "/"),
|
||||||
d->d_name);
|
d->d_name);
|
||||||
|
@ -207,21 +207,13 @@ my_readdir (void *gdir)
|
|||||||
|
|
||||||
dir->d.d_ino = 1; /* glob should not skip this entry. */
|
dir->d.d_ino = 1; /* glob should not skip this entry. */
|
||||||
|
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
dir->d.d_type = filesystem[dir->idx].type;
|
dir->d.d_type = filesystem[dir->idx].type;
|
||||||
#endif
|
|
||||||
|
|
||||||
strcpy (dir->d.d_name, filesystem[dir->idx].name);
|
strcpy (dir->d.d_name, filesystem[dir->idx].name);
|
||||||
|
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
PRINTF ("my_readdir ({ level: %d, idx: %ld }) = { d_ino: %ld, d_type: %d, d_name: \"%s\" }\n",
|
PRINTF ("my_readdir ({ level: %d, idx: %ld }) = { d_ino: %ld, d_type: %d, d_name: \"%s\" }\n",
|
||||||
dir->level, (long int) dir->idx, dir->d.d_ino, dir->d.d_type,
|
dir->level, (long int) dir->idx, dir->d.d_ino, dir->d.d_type,
|
||||||
dir->d.d_name);
|
dir->d.d_name);
|
||||||
#else
|
|
||||||
PRINTF ("my_readdir ({ level: %d, idx: %ld }) = { d_ino: %ld, d_name: \"%s\" }\n",
|
|
||||||
dir->level, (long int) dir->idx, dir->d.d_ino,
|
|
||||||
dir->d.d_name);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
++dir->idx;
|
++dir->idx;
|
||||||
|
|
||||||
|
@ -149,10 +149,8 @@ main (int argc, char *argv[])
|
|||||||
|
|
||||||
while ((d = readdir64 (dir1)) != NULL)
|
while ((d = readdir64 (dir1)) != NULL)
|
||||||
{
|
{
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
if (d->d_type != DT_UNKNOWN && d->d_type != DT_REG)
|
if (d->d_type != DT_UNKNOWN && d->d_type != DT_REG)
|
||||||
continue;
|
continue;
|
||||||
#endif
|
|
||||||
|
|
||||||
if (d->d_ino == st2.st_ino)
|
if (d->d_ino == st2.st_ino)
|
||||||
{
|
{
|
||||||
@ -234,10 +232,8 @@ main (int argc, char *argv[])
|
|||||||
|
|
||||||
while ((d = readdir64 (dir2)) != NULL)
|
while ((d = readdir64 (dir2)) != NULL)
|
||||||
{
|
{
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
if (d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
|
if (d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
|
||||||
continue;
|
continue;
|
||||||
#endif
|
|
||||||
|
|
||||||
if (d->d_ino == st2.st_ino)
|
if (d->d_ino == st2.st_ino)
|
||||||
{
|
{
|
||||||
@ -327,10 +323,8 @@ main (int argc, char *argv[])
|
|||||||
rewinddir (dir1);
|
rewinddir (dir1);
|
||||||
while (readdir64_r (dir1, &direntbuf.d, &d) == 0 && d != NULL)
|
while (readdir64_r (dir1, &direntbuf.d, &d) == 0 && d != NULL)
|
||||||
{
|
{
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
if (d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
|
if (d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
|
||||||
continue;
|
continue;
|
||||||
#endif
|
|
||||||
|
|
||||||
if (d->d_ino == st1.st_ino)
|
if (d->d_ino == st1.st_ino)
|
||||||
{
|
{
|
||||||
@ -457,13 +451,11 @@ main (int argc, char *argv[])
|
|||||||
|| strcmp (d->d_name, "..") == 0
|
|| strcmp (d->d_name, "..") == 0
|
||||||
|| strcmp (d->d_name, "another-dir") == 0)
|
|| strcmp (d->d_name, "another-dir") == 0)
|
||||||
{
|
{
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
if (d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
|
if (d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
|
||||||
{
|
{
|
||||||
printf ("d_type for \"%s\" is wrong\n", d->d_name);
|
printf ("d_type for \"%s\" is wrong\n", d->d_name);
|
||||||
result = 1;
|
result = 1;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
if (stat64 (d->d_name, &st3) < 0)
|
if (stat64 (d->d_name, &st3) < 0)
|
||||||
{
|
{
|
||||||
printf ("cannot stat \"%s\" is wrong\n", d->d_name);
|
printf ("cannot stat \"%s\" is wrong\n", d->d_name);
|
||||||
@ -477,13 +469,11 @@ main (int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
else if (strcmp (d->d_name, "and-a-file") == 0)
|
else if (strcmp (d->d_name, "and-a-file") == 0)
|
||||||
{
|
{
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
if (d->d_type != DT_UNKNOWN && d->d_type != DT_REG)
|
if (d->d_type != DT_UNKNOWN && d->d_type != DT_REG)
|
||||||
{
|
{
|
||||||
printf ("d_type for \"%s\" is wrong\n", d->d_name);
|
printf ("d_type for \"%s\" is wrong\n", d->d_name);
|
||||||
result = 1;
|
result = 1;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
if (stat64 (d->d_name, &st3) < 0)
|
if (stat64 (d->d_name, &st3) < 0)
|
||||||
{
|
{
|
||||||
printf ("cannot stat \"%s\" is wrong\n", d->d_name);
|
printf ("cannot stat \"%s\" is wrong\n", d->d_name);
|
||||||
|
@ -166,9 +166,7 @@ my_readdir (void *gdir)
|
|||||||
|
|
||||||
dir->d.d_ino = 1; /* glob should not skip this entry. */
|
dir->d.d_ino = 1; /* glob should not skip this entry. */
|
||||||
|
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
dir->d.d_type = filesystem[dir->idx].type;
|
dir->d.d_type = filesystem[dir->idx].type;
|
||||||
#endif
|
|
||||||
|
|
||||||
strcpy (dir->d.d_name, filesystem[dir->idx].name);
|
strcpy (dir->d.d_name, filesystem[dir->idx].name);
|
||||||
|
|
||||||
|
@ -221,27 +221,16 @@ my_readdir (void *gdir)
|
|||||||
|
|
||||||
dir->d.d_ino = 1; /* glob should not skip this entry. */
|
dir->d.d_ino = 1; /* glob should not skip this entry. */
|
||||||
|
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
dir->d.d_type = filesystem[dir->idx].type;
|
dir->d.d_type = filesystem[dir->idx].type;
|
||||||
#endif
|
|
||||||
|
|
||||||
strcpy (dir->d.d_name, filesystem[dir->idx].name);
|
strcpy (dir->d.d_name, filesystem[dir->idx].name);
|
||||||
|
|
||||||
#ifdef _DIRENT_HAVE_D_TYPE
|
|
||||||
if (test_verbose > 0)
|
if (test_verbose > 0)
|
||||||
printf ("info: my_readdir ({ level: %d, idx: %ld })"
|
printf ("info: my_readdir ({ level: %d, idx: %ld })"
|
||||||
" = { d_ino: %lld, d_type: %d, d_name: \"%s\" }\n",
|
" = { d_ino: %lld, d_type: %d, d_name: \"%s\" }\n",
|
||||||
dir->level, (long int) dir->idx,
|
dir->level, (long int) dir->idx,
|
||||||
(long long) dir->d.d_ino, dir->d.d_type,
|
(long long) dir->d.d_ino, dir->d.d_type,
|
||||||
dir->d.d_name);
|
dir->d.d_name);
|
||||||
#else
|
|
||||||
if (test_verbose > 0)
|
|
||||||
printf ("info: my_readdir ({ level: %d, idx: %ld })"
|
|
||||||
" = { d_ino: %lld, d_name: \"%s\" }\n",
|
|
||||||
dir->level, (long int) dir->idx,
|
|
||||||
(long long) dir->d.d_ino,
|
|
||||||
dir->d.d_name);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
++dir->idx;
|
++dir->idx;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user