From c0123b3b1118419210879e935620eb2ad987c2f1 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Thu, 1 Mar 2018 09:04:41 -0300 Subject: [PATCH] Consolidate scandir{at}{64} implementation This patch consolidates scandir{at}{64} implementation on just the default dirent/scandir{at}{64}{_r}.c ones. It changes the logic to follow the conventions used on other code consolidation: * scandir{at} is only built for _DIRENT_MATCHES_DIRENT64 being 0. * scandir{at}{64} is always built and aliased to getdents for ABIs that define _DIRENT_MATCHES_DIRENT64 to 1. Also on Linux the compat symbol for old non-LFS dirent64 definition requires a platform-specific scandir64.c. Checked on aarch64-linux-gnu, x86_64-linux-gnu, i686-linux-gnu, sparcv9-linux-gnu, sparc64-linux-gnu, powerpc-linux-gnu, and powerpc64le-linux-gnu. * dirent/scandir-tail-common.c: New file. * dirent/scandir-tail.c: Use scandir-tail-common.c. (__scandir_tail): Build iff _DIRENT_MATCHES_DIRENT64 is not defined. * dirent/scandir.c: Use scandir-tail-common.c. * dirent/scandirat.c: Likewise. * dirent/scandir64-tail.c: Use scandir-tail-common.c. * dirent/scandir64.c (scandir64): Always build and alias to scandir if _DIRENT_MATCHES_DIRENT64 is defined. * dirent/scandirat64.c (scandirat64): Likewise. * include/dirent.h (__scandir_tail): Only define iff _DIRENT_MATCHES_DIRENT64 is not defined. (__scandir64_tail): Define regardless. (__scandirat, scandirat64): Remove libc_hidden_proto. * sysdeps/unix/sysv/linux/arm/scandir64.c: Remove file. * sysdeps/unix/sysv/linux/m68k/scandir64.c: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/scandir64.c: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/scandir64.c: Likewise. * sysdeps/unix/sysv/linux/i386/scandir64.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/scandir64.c: Likewise. * sysdeps/unix/sysv/linux/scandir64.c: New file. --- ChangeLog | 23 ++++++++++++++ dirent/{scandir-tail.c => scandir-tail-common.c} | 15 ++------- dirent/{scandir64-tail.c => scandir-tail.c} | 15 +++++---- dirent/{scandir64.c => scandir.c} | 17 +++++----- dirent/scandir64-tail.c | 10 +++--- dirent/scandir64.c | 23 ++++++++------ dirent/{scandir64.c => scandirat.c} | 18 +++++------ dirent/scandirat64.c | 23 ++++++++------ include/dirent.h | 18 +++++------ sysdeps/unix/sysv/linux/arm/scandir64.c | 1 - sysdeps/unix/sysv/linux/m68k/scandir64.c | 1 - .../unix/sysv/linux/powerpc/powerpc32/scandir64.c | 1 - sysdeps/unix/sysv/linux/s390/s390-32/scandir64.c | 1 - sysdeps/unix/sysv/linux/{i386 => }/scandir64.c | 37 ++++++++++++---------- sysdeps/unix/sysv/linux/sparc/sparc32/scandir64.c | 1 - 15 files changed, 110 insertions(+), 94 deletions(-) rename dirent/{scandir-tail.c => scandir-tail-common.c} (91%) copy dirent/{scandir64-tail.c => scandir-tail.c} (76%) copy dirent/{scandir64.c => scandir.c} (73%) copy dirent/{scandir64.c => scandirat.c} (69%) delete mode 100644 sysdeps/unix/sysv/linux/arm/scandir64.c delete mode 100644 sysdeps/unix/sysv/linux/m68k/scandir64.c delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/scandir64.c delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-32/scandir64.c rename sysdeps/unix/sysv/linux/{i386 => }/scandir64.c (81%) delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/scandir64.c diff --git a/ChangeLog b/ChangeLog index 3cac21d194..3f2c533acd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2018-04-20 Adhemerval Zanella + + * dirent/scandir-tail-common.c: New file. + * dirent/scandir-tail.c: Use scandir-tail-common.c. + (__scandir_tail): Build iff _DIRENT_MATCHES_DIRENT64 is not defined. + * dirent/scandir.c: Use scandir-tail-common.c. + * dirent/scandirat.c: Likewise. + * dirent/scandir64-tail.c: Use scandir-tail-common.c. + * dirent/scandir64.c (scandir64): Always build and alias to scandir + if _DIRENT_MATCHES_DIRENT64 is defined. + * dirent/scandirat64.c (scandirat64): Likewise. + * include/dirent.h (__scandir_tail): Only define iff + _DIRENT_MATCHES_DIRENT64 is not defined. + (__scandir64_tail): Define regardless. + (__scandirat, scandirat64): Remove libc_hidden_proto. + * sysdeps/unix/sysv/linux/arm/scandir64.c: Remove file. + * sysdeps/unix/sysv/linux/m68k/scandir64.c: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/scandir64.c: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/scandir64.c: Likewise. + * sysdeps/unix/sysv/linux/i386/scandir64.c: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/scandir64.c: Likewise. + * sysdeps/unix/sysv/linux/scandir64.c: New file. + 2018-04-20 Joseph Myers * sysdeps/unix/sysv/linux/aarch64/bits/hwcap.h (HWCAP_ASIMDFHM): diff --git a/dirent/scandir-tail.c b/dirent/scandir-tail-common.c similarity index 91% rename from dirent/scandir-tail.c rename to dirent/scandir-tail-common.c index 67c9c92d65..f89cf77b56 100644 --- a/dirent/scandir-tail.c +++ b/dirent/scandir-tail-common.c @@ -1,5 +1,5 @@ -/* Logic guts of scandir*. - Copyright (C) 1992-2018 Free Software Foundation, Inc. +/* Common implementation for scandir{at}. + Copyright (C) 2018 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,17 +16,8 @@ License along with the GNU C Library; if not, see . */ -#include -#include -#include #include -#include - -#ifndef SCANDIR_TAIL -# define SCANDIR_TAIL __scandir_tail -# define READDIR __readdir -# define DIRENT_TYPE struct dirent -#endif +#include int SCANDIR_TAIL (DIR *dp, diff --git a/dirent/scandir64-tail.c b/dirent/scandir-tail.c similarity index 76% copy from dirent/scandir64-tail.c copy to dirent/scandir-tail.c index 8d5cc07748..7395dc4a26 100644 --- a/dirent/scandir64-tail.c +++ b/dirent/scandir-tail.c @@ -1,5 +1,5 @@ -/* Logic guts of scandir*64. - Copyright (C) 2015-2018 Free Software Foundation, Inc. +/* Logic guts of scandir*. + Copyright (C) 1992-2018 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -19,8 +19,11 @@ #include #if !_DIRENT_MATCHES_DIRENT64 -# define SCANDIR_TAIL __scandir64_tail -# define READDIR __readdir64 -# define DIRENT_TYPE struct dirent64 -# include + +# define SCANDIR_TAIL __scandir_tail +# define READDIR __readdir +# define DIRENT_TYPE struct dirent + +# include + #endif diff --git a/dirent/scandir64.c b/dirent/scandir.c similarity index 73% copy from dirent/scandir64.c copy to dirent/scandir.c index 0c63fa97ef..6d8352dc9c 100644 --- a/dirent/scandir64.c +++ b/dirent/scandir.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2018 Free Software Foundation, Inc. +/* Copyright (C) 1992-2018 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -17,13 +17,12 @@ #include -/* scandir.c defines scandir64 as an alias if _DIRENT_MATCHES_DIRENT64. */ #if !_DIRENT_MATCHES_DIRENT64 - -# define SCANDIR scandir64 -# define SCANDIR_TAIL __scandir64_tail -# define DIRENT_TYPE struct dirent64 - -# include - +int +scandir (const char *dir, struct dirent ***namelist, + int (*select) (const struct dirent *), + int (*cmp) (const struct dirent **, const struct dirent **)) +{ + return __scandir_tail (__opendir (dir), namelist, select, cmp); +} #endif diff --git a/dirent/scandir64-tail.c b/dirent/scandir64-tail.c index 8d5cc07748..4e873d47d6 100644 --- a/dirent/scandir64-tail.c +++ b/dirent/scandir64-tail.c @@ -18,9 +18,7 @@ #include -#if !_DIRENT_MATCHES_DIRENT64 -# define SCANDIR_TAIL __scandir64_tail -# define READDIR __readdir64 -# define DIRENT_TYPE struct dirent64 -# include -#endif +#define SCANDIR_TAIL __scandir64_tail +#define READDIR __readdir64 +#define DIRENT_TYPE struct dirent64 +#include diff --git a/dirent/scandir64.c b/dirent/scandir64.c index 0c63fa97ef..6bdd4628ad 100644 --- a/dirent/scandir64.c +++ b/dirent/scandir64.c @@ -15,15 +15,18 @@ License along with the GNU C Library; if not, see . */ +#define scandir __no_scandir_decl #include - -/* scandir.c defines scandir64 as an alias if _DIRENT_MATCHES_DIRENT64. */ -#if !_DIRENT_MATCHES_DIRENT64 - -# define SCANDIR scandir64 -# define SCANDIR_TAIL __scandir64_tail -# define DIRENT_TYPE struct dirent64 - -# include - +#undef scandir + +int +scandir64 (const char *dir, struct dirent64 ***namelist, + int (*select) (const struct dirent64 *), + int (*cmp) (const struct dirent64 **, const struct dirent64 **)) +{ + return __scandir64_tail (__opendir (dir), namelist, select, cmp); +} + +#if _DIRENT_MATCHES_DIRENT64 +weak_alias (scandir64, scandir) #endif diff --git a/dirent/scandir64.c b/dirent/scandirat.c similarity index 69% copy from dirent/scandir64.c copy to dirent/scandirat.c index 0c63fa97ef..8dad1e8a21 100644 --- a/dirent/scandir64.c +++ b/dirent/scandirat.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000-2018 Free Software Foundation, Inc. +/* Copyright (C) 1992-2018 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -17,13 +17,13 @@ #include -/* scandir.c defines scandir64 as an alias if _DIRENT_MATCHES_DIRENT64. */ #if !_DIRENT_MATCHES_DIRENT64 - -# define SCANDIR scandir64 -# define SCANDIR_TAIL __scandir64_tail -# define DIRENT_TYPE struct dirent64 - -# include - +int +__scandirat (int dfd, const char *dir, struct dirent ***namelist, + int (*select) (const struct dirent *), + int (*cmp) (const struct dirent **, const struct dirent **)) +{ + return __scandir_tail (__opendirat (dfd, dir), namelist, select, cmp); +} +weak_alias (__scandirat, scandirat) #endif diff --git a/dirent/scandirat64.c b/dirent/scandirat64.c index 520ae7cad7..7e5e209cdf 100644 --- a/dirent/scandirat64.c +++ b/dirent/scandirat64.c @@ -15,15 +15,18 @@ License along with the GNU C Library; if not, see . */ +#define scandirat __no_scandirat_decl #include - -/* scandirat.c defines scandirat64 as an alias if _DIRENT_MATCHES_DIRENT64. */ -#if !_DIRENT_MATCHES_DIRENT64 - -# define SCANDIRAT scandirat64 -# define SCANDIR_TAIL __scandir64_tail -# define DIRENT_TYPE struct dirent64 - -# include - +#undef scandirat + +int +scandirat64 (int dfd, const char *dir, struct dirent64 ***namelist, + int (*select) (const struct dirent64 *), + int (*cmp) (const struct dirent64 **, const struct dirent64 **)) +{ + return __scandir64_tail (__opendirat (dfd, dir), namelist, select, cmp); +} + +#if _DIRENT_MATCHES_DIRENT64 +weak_alias (scandirat64, scandirat) #endif diff --git a/include/dirent.h b/include/dirent.h index e533b0b59d..400835eefe 100644 --- a/include/dirent.h +++ b/include/dirent.h @@ -58,25 +58,23 @@ extern int __scandir_tail (DIR *dp, int (*cmp) (const struct dirent **, const struct dirent **)) attribute_hidden; -# if _DIRENT_MATCHES_DIRENT64 -# define __scandir64_tail (dp, namelist, select, cmp) \ - __scandir_tail (dp, (struct dirent ***) (namelist), \ - (int (*) (const struct dirent *)) (select), \ - (int (*) (const struct dirent **, \ - const struct dirent **)) (cmp)) -# else +# if !_DIRENT_MATCHES_DIRENT64 +extern int __scandir_tail (DIR *dp, + struct dirent ***namelist, + int (*select) (const struct dirent *), + int (*cmp) (const struct dirent **, + const struct dirent **)) + attribute_hidden; +# endif extern int __scandir64_tail (DIR *dp, struct dirent64 ***namelist, int (*select) (const struct dirent64 *), int (*cmp) (const struct dirent64 **, const struct dirent64 **)) attribute_hidden; -# endif libc_hidden_proto (__rewinddir) extern __typeof (scandirat) __scandirat; -libc_hidden_proto (__scandirat) -libc_hidden_proto (scandirat64) # if IS_IN (rtld) && !defined NO_RTLD_HIDDEN extern __typeof (__rewinddir) __rewinddir attribute_hidden; diff --git a/sysdeps/unix/sysv/linux/arm/scandir64.c b/sysdeps/unix/sysv/linux/arm/scandir64.c deleted file mode 100644 index 506fd8877c..0000000000 --- a/sysdeps/unix/sysv/linux/arm/scandir64.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/unix/sysv/linux/m68k/scandir64.c b/sysdeps/unix/sysv/linux/m68k/scandir64.c deleted file mode 100644 index 506fd8877c..0000000000 --- a/sysdeps/unix/sysv/linux/m68k/scandir64.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/scandir64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/scandir64.c deleted file mode 100644 index 506fd8877c..0000000000 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/scandir64.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/scandir64.c b/sysdeps/unix/sysv/linux/s390/s390-32/scandir64.c deleted file mode 100644 index 506fd8877c..0000000000 --- a/sysdeps/unix/sysv/linux/s390/s390-32/scandir64.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/unix/sysv/linux/i386/scandir64.c b/sysdeps/unix/sysv/linux/scandir64.c similarity index 81% rename from sysdeps/unix/sysv/linux/i386/scandir64.c rename to sysdeps/unix/sysv/linux/scandir64.c index 50590c3f74..efb502f6e4 100644 --- a/sysdeps/unix/sysv/linux/i386/scandir64.c +++ b/sysdeps/unix/sysv/linux/scandir64.c @@ -15,26 +15,28 @@ License along with the GNU C Library; if not, see . */ +#define scandir __no_scandir_decl #include +#undef scandir -#define SCANDIR __scandir64 -#define SCANDIR_TAIL __scandir64_tail -#define DIRENT_TYPE struct dirent64 - -#include - -#undef SCANDIR -#undef SCANDIR_TAIL -#undef DIRENT_TYPE - -#include +int +__scandir64 (const char *dir, struct dirent64 ***namelist, + int (*select) (const struct dirent64 *), + int (*cmp) (const struct dirent64 **, const struct dirent64 **)) +{ + return __scandir64_tail (__opendir (dir), namelist, select, cmp); +} +#if _DIRENT_MATCHES_DIRENT64 +weak_alias (__scandir64, scandir64) +weak_alias (__scandir64, scandir) +#else +# include versioned_symbol (libc, __scandir64, scandir64, GLIBC_2_2); - -#if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_2) -# include -# include -# include "olddirent.h" +# if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_2) +# include +# include +# include "olddirent.h" int __old_scandir64 (const char *dir, struct __old_dirent64 ***namelist, @@ -133,4 +135,5 @@ __old_scandir64 (const char *dir, struct __old_dirent64 ***namelist, } compat_symbol (libc, __old_scandir64, scandir64, GLIBC_2_1); -#endif +# endif /* SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_2) */ +#endif /* _DIRENT_MATCHES_DIRENT64 */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/scandir64.c b/sysdeps/unix/sysv/linux/sparc/sparc32/scandir64.c deleted file mode 100644 index 506fd8877c..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/scandir64.c +++ /dev/null @@ -1 +0,0 @@ -#include -- 2.11.4.GIT