aboutsummaryrefslogtreecommitdiff
path: root/posix/glob.c
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2021-03-02 20:17:07 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2021-06-15 10:42:11 -0300
commit84f7ce84474c1648ce96884f1c91ca7b97ca3fc2 (patch)
tree4a19687d260d69a380414d41a592fb261841e5cd /posix/glob.c
parent47f24c21ee38701ae275aa9e451f70fa3e77478c (diff)
downloadglibc-84f7ce84474c1648ce96884f1c91ca7b97ca3fc2.tar
glibc-84f7ce84474c1648ce96884f1c91ca7b97ca3fc2.tar.gz
glibc-84f7ce84474c1648ce96884f1c91ca7b97ca3fc2.tar.bz2
glibc-84f7ce84474c1648ce96884f1c91ca7b97ca3fc2.zip
posix: Add glob64 with 64-bit time_t support
The glob might pass a different stat struct for gl_stat and gl_lstat when GLOB_ALTDIRFUNC is used. This requires add a new 64-bit time version that also uses 64-bit time stat functions. Checked on i686-linux-gnu and x86_64-linux-gnu. Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'posix/glob.c')
-rw-r--r--posix/glob.c46
1 files changed, 25 insertions, 21 deletions
diff --git a/posix/glob.c b/posix/glob.c
index 32c88e5d15..593a4c358f 100644
--- a/posix/glob.c
+++ b/posix/glob.c
@@ -59,25 +59,37 @@
# define readdir(str) __readdir64 (str)
# define getpwnam_r(name, bufp, buf, len, res) \
__getpwnam_r (name, bufp, buf, len, res)
-# define struct_stat64 struct stat64
# define FLEXIBLE_ARRAY_MEMBER
+# ifndef struct_stat
+# define struct_stat struct stat
+# endif
+# ifndef struct_stat64
+# define struct_stat64 struct stat64
+# endif
+# ifndef GLOB_LSTAT
+# define GLOB_LSTAT gl_lstat
+# endif
+# ifndef GLOB_STAT64
+# define GLOB_STAT64 __stat64
+# endif
+# ifndef GLOB_LSTAT64
+# define GLOB_LSTAT64 __lstat64
+# endif
# include <shlib-compat.h>
#else /* !_LIBC */
# define __glob glob
# define __getlogin_r(buf, len) getlogin_r (buf, len)
-# define __lstat64(fname, buf) lstat (fname, buf)
-# if defined _WIN32 && !defined __CYGWIN__
- /* Avoid GCC or clang warning. The original __stat64 macro is unused. */
-# undef __stat64
-# endif
-# define __stat64(fname, buf) stat (fname, buf)
# define __fxstatat64(_, d, f, st, flag) fstatat (d, f, st, flag)
-# define struct_stat64 struct stat
# ifndef __MVS__
# define __alloca alloca
# endif
# define __readdir readdir
# define COMPILE_GLOB64
+# define struct_stat struct stat
+# define struct_stat64 struct stat
+# define GLOB_LSTAT gl_lstat
+# define GLOB_STAT64 stat
+# define GLOB_LSTAT64 lstat
#endif /* _LIBC */
#include <fnmatch.h>
@@ -196,22 +208,14 @@ glob_lstat (glob_t *pglob, int flags, const char *fullname)
{
/* Use on glob-lstat-compat.c to provide a compat symbol which does not
use lstat / gl_lstat. */
-#ifdef GLOB_NO_LSTAT
-# define GL_LSTAT gl_stat
-# define LSTAT64 __stat64
-#else
-# define GL_LSTAT gl_lstat
-# define LSTAT64 __lstat64
-#endif
-
union
{
- struct stat st;
+ struct_stat st;
struct_stat64 st64;
} ust;
return (__glibc_unlikely (flags & GLOB_ALTDIRFUNC)
- ? pglob->GL_LSTAT (fullname, &ust.st)
- : LSTAT64 (fullname, &ust.st64));
+ ? pglob->GLOB_LSTAT (fullname, &ust.st)
+ : GLOB_LSTAT64 (fullname, &ust.st64));
}
/* Set *R = A + B. Return true if the answer is mathematically
@@ -249,11 +253,11 @@ static int collated_compare (const void *, const void *) __THROWNL;
static bool
is_dir (char const *filename, int flags, glob_t const *pglob)
{
- struct stat st;
+ struct_stat st;
struct_stat64 st64;
return (__glibc_unlikely (flags & GLOB_ALTDIRFUNC)
? pglob->gl_stat (filename, &st) == 0 && S_ISDIR (st.st_mode)
- : __stat64 (filename, &st64) == 0 && S_ISDIR (st64.st_mode));
+ : GLOB_STAT64 (filename, &st64) == 0 && S_ISDIR (st64.st_mode));
}
/* Find the end of the sub-pattern in a brace expression. */