From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 60075 invoked by alias); 20 Apr 2018 13:50:51 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 60061 invoked by uid 89); 20 Apr 2018 13:50:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.2 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.2 spammy=cv, Common, UD:v X-HELO: mail-qt0-f194.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:references:openpgp:autocrypt :message-id:date:user-agent:mime-version:in-reply-to :content-language:content-transfer-encoding; bh=pZJIDI/6Z4Y+Hgk5mb6ZJ5GE7xO4gU1VYm8halfaKlY=; b=Lz7qmxyN0PD90WA0Ypb5ceNeg9ELWk6cCKbKpotGNaoAfUnYWsLhIUkgrdwSBNdrB6 KTsp2rADf0bFKDXUQibUem4IUjU5iQquHAuXbr9XVhG+vqYHVzcXEhW6pNKqq+E6iq+r UJLnvItxNoQj9IIg8xXmSdOemUTgOJx+t0+u0jf/Fj2+befEIQbqWyV4745CcYNfDjrz zUmO42cktotKlTw0m4hWdajsnotGw9xJDcuHakady3bpRER4ftekADq6dX7qyI8YJjak bz/SD6VFSRIkMUwo6QOfbrtHMET9pSrfMSJP0QXstOcJe5k1cPp9wLG47mJfkE7BrzFa 0MqQ== X-Gm-Message-State: ALQs6tBl4NIcG7UFPyO/PIOMrT23DER8ctxxsb6B7SEdJoorSd0AEonu hAK1EIv64dt2AYEieJ2wrRdAaEDe43Q= X-Google-Smtp-Source: AB8JxZprDGyNGoOMQZHGWxuZOwsjB97YX789Xt2dAVcOU5rdXq5iNaL1nJ+Q8RlYscuYjH29GnvCPw== X-Received: by 2002:aed:2027:: with SMTP id 36-v6mr10903743qta.275.1524232243924; Fri, 20 Apr 2018 06:50:43 -0700 (PDT) Subject: Re: [PATCH 5/7] Consolidate scandir{at}{64} implementation From: Adhemerval Zanella To: libc-alpha@sourceware.org References: <1520017165-15830-1-git-send-email-adhemerval.zanella@linaro.org> <1520017165-15830-5-git-send-email-adhemerval.zanella@linaro.org> Openpgp: preference=signencrypt Autocrypt: addr=adhemerval.zanella@linaro.org; prefer-encrypt=mutual; keydata= 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 Message-ID: <0c28c0d7-7bb5-20e8-8773-b43302aa1535@linaro.org> Date: Fri, 20 Apr 2018 13:50:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 In-Reply-To: <1520017165-15830-5-git-send-email-adhemerval.zanella@linaro.org> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-SW-Source: 2018-04/txt/msg00453.txt.bz2 I will commit this shortly if no one opposes it. On 02/03/2018 15:59, Adhemerval Zanella wrote: > 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 | 21 +++++ > dirent/scandir-tail-common.c | 103 +++++++++++++++++++++ > dirent/scandir-tail.c | 95 ++----------------- > dirent/scandir.c | 27 +----- > dirent/scandir64-tail.c | 10 +- > dirent/scandir64.c | 23 +++-- > dirent/scandirat.c | 30 +----- > 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, 198 insertions(+), 194 deletions(-) > create mode 100644 dirent/scandir-tail-common.c > 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/dirent/scandir-tail-common.c b/dirent/scandir-tail-common.c > new file mode 100644 > index 0000000..f89cf77 > --- /dev/null > +++ b/dirent/scandir-tail-common.c > @@ -0,0 +1,103 @@ > +/* 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 > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > +#include > + > +int > +SCANDIR_TAIL (DIR *dp, > + DIRENT_TYPE ***namelist, > + int (*select) (const DIRENT_TYPE *), > + int (*cmp) (const DIRENT_TYPE **, const DIRENT_TYPE **)) > +{ > + if (dp == NULL) > + return -1; > + > + int save = errno; > + __set_errno (0); > + > + int result; > + struct scandir_cancel_struct c = { .dp = dp }; > + __libc_cleanup_push (&__scandir_cancel_handler, &c); > + > + DIRENT_TYPE **v = NULL; > + size_t vsize = 0; > + DIRENT_TYPE *d; > + while ((d = READDIR (dp)) != NULL) > + { > + if (select != NULL) > + { > + int selected = (*select) (d); > + > + /* The SELECT function might have set errno to non-zero on > + success. It was zero before and it needs to be again to > + make the later tests work. */ > + __set_errno (0); > + > + if (!selected) > + continue; > + } > + > + if (__glibc_unlikely (c.cnt == vsize)) > + { > + if (vsize == 0) > + vsize = 10; > + else > + vsize *= 2; > + DIRENT_TYPE **new = realloc (v, vsize * sizeof *v); > + if (new == NULL) > + break; > + c.v = v = new; > + } > + > + size_t dsize = &d->d_name[_D_ALLOC_NAMLEN (d)] - (char *) d; > + DIRENT_TYPE *vnew = malloc (dsize); > + if (vnew == NULL) > + break; > + v[c.cnt++] = (DIRENT_TYPE *) memcpy (vnew, d, dsize); > + > + /* Ignore errors from readdir, malloc or realloc. These functions > + might have set errno to non-zero on success. It was zero before > + and it needs to be again to make the latter tests work. */ > + __set_errno (0); > + } > + > + if (__glibc_likely (errno == 0)) > + { > + __closedir (dp); > + > + /* Sort the list if we have a comparison function to sort with. */ > + if (cmp != NULL) > + qsort (v, c.cnt, sizeof *v, (__compar_fn_t) cmp); > + > + *namelist = v; > + result = c.cnt; > + } > + else > + { > + /* This frees everything and calls closedir. */ > + __scandir_cancel_handler (&c); > + result = -1; > + } > + > + __libc_cleanup_pop (0); > + > + if (result >= 0) > + __set_errno (save); > + return result; > +} > diff --git a/dirent/scandir-tail.c b/dirent/scandir-tail.c > index 67c9c92..7395dc4 100644 > --- a/dirent/scandir-tail.c > +++ b/dirent/scandir-tail.c > @@ -17,96 +17,13 @@ > . */ > > #include > -#include > -#include > -#include > -#include > > -#ifndef SCANDIR_TAIL > -# define SCANDIR_TAIL __scandir_tail > -# define READDIR __readdir > -# define DIRENT_TYPE struct dirent > -#endif > - > -int > -SCANDIR_TAIL (DIR *dp, > - DIRENT_TYPE ***namelist, > - int (*select) (const DIRENT_TYPE *), > - int (*cmp) (const DIRENT_TYPE **, const DIRENT_TYPE **)) > -{ > - if (dp == NULL) > - return -1; > - > - int save = errno; > - __set_errno (0); > - > - int result; > - struct scandir_cancel_struct c = { .dp = dp }; > - __libc_cleanup_push (&__scandir_cancel_handler, &c); > - > - DIRENT_TYPE **v = NULL; > - size_t vsize = 0; > - DIRENT_TYPE *d; > - while ((d = READDIR (dp)) != NULL) > - { > - if (select != NULL) > - { > - int selected = (*select) (d); > - > - /* The SELECT function might have set errno to non-zero on > - success. It was zero before and it needs to be again to > - make the later tests work. */ > - __set_errno (0); > - > - if (!selected) > - continue; > - } > +#if !_DIRENT_MATCHES_DIRENT64 > > - if (__glibc_unlikely (c.cnt == vsize)) > - { > - if (vsize == 0) > - vsize = 10; > - else > - vsize *= 2; > - DIRENT_TYPE **new = realloc (v, vsize * sizeof *v); > - if (new == NULL) > - break; > - c.v = v = new; > - } > +# define SCANDIR_TAIL __scandir_tail > +# define READDIR __readdir > +# define DIRENT_TYPE struct dirent > > - size_t dsize = &d->d_name[_D_ALLOC_NAMLEN (d)] - (char *) d; > - DIRENT_TYPE *vnew = malloc (dsize); > - if (vnew == NULL) > - break; > - v[c.cnt++] = (DIRENT_TYPE *) memcpy (vnew, d, dsize); > +# include > > - /* Ignore errors from readdir, malloc or realloc. These functions > - might have set errno to non-zero on success. It was zero before > - and it needs to be again to make the latter tests work. */ > - __set_errno (0); > - } > - > - if (__glibc_likely (errno == 0)) > - { > - __closedir (dp); > - > - /* Sort the list if we have a comparison function to sort with. */ > - if (cmp != NULL) > - qsort (v, c.cnt, sizeof *v, (__compar_fn_t) cmp); > - > - *namelist = v; > - result = c.cnt; > - } > - else > - { > - /* This frees everything and calls closedir. */ > - __scandir_cancel_handler (&c); > - result = -1; > - } > - > - __libc_cleanup_pop (0); > - > - if (result >= 0) > - __set_errno (save); > - return result; > -} > +#endif > diff --git a/dirent/scandir.c b/dirent/scandir.c > index b24e157..6d8352d 100644 > --- a/dirent/scandir.c > +++ b/dirent/scandir.c > @@ -15,31 +15,14 @@ > License along with the GNU C Library; if not, see > . */ > > -/* We need to avoid the header declaration of scandir64, because > - the types don't match scandir and then the compiler will > - complain about the mismatch when we do the alias below. */ > -#define scandir64 __renamed_scandir64 > - > #include > > -#undef scandir64 > - > -#ifndef SCANDIR > -# define SCANDIR scandir > -# define SCANDIR_TAIL __scandir_tail > -# define DIRENT_TYPE struct dirent > -#endif > - > - > +#if !_DIRENT_MATCHES_DIRENT64 > int > -SCANDIR (const char *dir, > - DIRENT_TYPE ***namelist, > - int (*select) (const DIRENT_TYPE *), > - int (*cmp) (const DIRENT_TYPE **, const DIRENT_TYPE **)) > +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); > + return __scandir_tail (__opendir (dir), namelist, select, cmp); > } > - > -#if _DIRENT_MATCHES_DIRENT64 > -weak_alias (scandir, scandir64) > #endif > diff --git a/dirent/scandir64-tail.c b/dirent/scandir64-tail.c > index 8d5cc07..4e873d4 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 0c63fa9..6bdd462 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/scandirat.c b/dirent/scandirat.c > index 96a1b0e..8dad1e8 100644 > --- a/dirent/scandirat.c > +++ b/dirent/scandirat.c > @@ -15,35 +15,15 @@ > License along with the GNU C Library; if not, see > . */ > > -/* We need to avoid the header declaration of scandir64, because > - the types don't match scandir and then the compiler will > - complain about the mismatch when we do the alias below. */ > -#define scandirat64 __renamed_scandirat64 > - > #include > > -#undef scandirat64 > - > -#ifndef SCANDIRAT > -# define SCANDIRAT __scandirat > -# define SCANDIR_TAIL __scandir_tail > -# define DIRENT_TYPE struct dirent > -# define SCANDIRAT_WEAK_ALIAS > -#endif > - > +#if !_DIRENT_MATCHES_DIRENT64 > int > -SCANDIRAT (int dfd, const char *dir, > - DIRENT_TYPE ***namelist, > - int (*select) (const DIRENT_TYPE *), > - int (*cmp) (const DIRENT_TYPE **, const DIRENT_TYPE **)) > +__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); > + return __scandir_tail (__opendirat (dfd, dir), namelist, select, cmp); > } > -libc_hidden_def (SCANDIRAT) > -#ifdef SCANDIRAT_WEAK_ALIAS > weak_alias (__scandirat, scandirat) > #endif > - > -#if _DIRENT_MATCHES_DIRENT64 > -weak_alias (scandirat, scandirat64) > -#endif > diff --git a/dirent/scandirat64.c b/dirent/scandirat64.c > index 520ae7c..7e5e209 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 cc8f189..f8f1942 100644 > --- a/include/dirent.h > +++ b/include/dirent.h > @@ -57,25 +57,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 506fd88..0000000 > --- 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 506fd88..0000000 > --- 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 506fd88..0000000 > --- 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 506fd88..0000000 > --- 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 50590c3..efb502f 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 506fd88..0000000 > --- a/sysdeps/unix/sysv/linux/sparc/sparc32/scandir64.c > +++ /dev/null > @@ -1 +0,0 @@ > -#include >