1 /* Copyright (C) 2000-2023 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <https://www.gnu.org/licenses/>. */
18 #define scandir __no_scandir_decl
23 __scandir64 (const char *dir
, struct dirent64
***namelist
,
24 int (*select
) (const struct dirent64
*),
25 int (*cmp
) (const struct dirent64
**, const struct dirent64
**))
27 return __scandir64_tail (__opendir (dir
), namelist
, select
, cmp
);
30 #if _DIRENT_MATCHES_DIRENT64
31 weak_alias (__scandir64
, scandir64
)
32 weak_alias (__scandir64
, scandir
)
34 # include <shlib-compat.h>
35 versioned_symbol (libc
, __scandir64
, scandir64
, GLIBC_2_2
);
36 # if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_2)
39 # include "olddirent.h"
42 __old_scandir64 (const char *dir
, struct __old_dirent64
***namelist
,
43 int (*select
) (const struct __old_dirent64
*),
44 int (*cmp
) (const struct __old_dirent64
**,
45 const struct __old_dirent64
**))
47 DIR *dp
= __opendir (dir
);
48 struct __old_dirent64
**v
= NULL
;
50 struct scandir_cancel_struct c
;
51 struct __old_dirent64
*d
;
63 __libc_cleanup_push (__scandir_cancel_handler
, &c
);
65 while ((d
= __old_readdir64 (dp
)) != NULL
)
67 int use_it
= select
== NULL
;
72 /* The select function might have changed errno. It was
73 zero before and it need to be again to make the latter
80 struct __old_dirent64
*vnew
;
83 /* Ignore errors from select or readdir */
86 if (__glibc_unlikely (c
.cnt
== vsize
))
88 struct __old_dirent64
**new;
93 new = (struct __old_dirent64
**) realloc (v
,
101 dsize
= &d
->d_name
[_D_ALLOC_NAMLEN (d
)] - (char *) d
;
102 vnew
= (struct __old_dirent64
*) malloc (dsize
);
106 v
[c
.cnt
++] = (struct __old_dirent64
*) memcpy (vnew
, d
, dsize
);
110 if (__builtin_expect (errno
, 0) != 0)
121 /* Sort the list if we have a comparison function to sort with. */
123 qsort (v
, c
.cnt
, sizeof (*v
),
124 (int (*) (const void *, const void *)) cmp
);
129 __libc_cleanup_pop (0);
131 (void) __closedir (dp
);
136 compat_symbol (libc
, __old_scandir64
, scandir64
, GLIBC_2_1
);
138 # endif /* SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_2) */
139 #endif /* _DIRENT_MATCHES_DIRENT64 */