@@ -, +, @@ --- configure.ac | 1 + src/Makefile.am | 1 + src/statx.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+) create mode 100644 src/statx.c --- a/configure.ac +++ a/configure.ac @@ -277,6 +277,7 @@ AC_CHECK_FUNCS(m4_normalize([ statfs64 statvfs statvfs64 + statx stpcpy strchrnul strlcpy --- a/src/Makefile.am +++ a/src/Makefile.am @@ -152,6 +152,7 @@ libfakechroot_la_SOURCES = \ statfs64.c \ statvfs.c \ statvfs64.c \ + statx.c \ stpcpy.c \ strchrnul.c \ strchrnul.h \ --- a/src/statx.c +++ a/src/statx.c @@ -0,0 +1,44 @@ +/* + libfakechroot -- fake chroot environment + Copyright (c) 2010-2020 Piotr Roszatycki + + This 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. + + This 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 this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include + +#ifdef HAVE_STATX + +#define _GNU_SOURCE +#include +#include +#include + +#include "libfakechroot.h" + + +wrapper(statx, int, (int dirfd, const char * pathname, int flags, unsigned int mask, struct statx * statxbuf)) +{ + char fakechroot_abspath[FAKECHROOT_PATH_MAX]; + char fakechroot_buf[FAKECHROOT_PATH_MAX]; + debug("statx(%d, \"%s\", %d, %u, &statxbuf)", dirfd, pathname, flags, mask); + expand_chroot_path_at(dirfd, pathname); + return nextcall(statx)(dirfd, pathname, flags, mask, statxbuf); +} + +#else +typedef int empty_translation_unit; +#endif --- src/tmpnam.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) --- a/src/tmpnam.c +++ a/src/tmpnam.c @@ -42,7 +42,7 @@ wrapper(tmpnam, char *, (char * s)) expand_chroot_path(ptr); - ptr2 = malloc(strlen(ptr)); + ptr2 = malloc(strlen(ptr) + 1); if (ptr2 == NULL) return NULL; strcpy(ptr2, ptr); --- src/lstat.c | 8 +++++--- src/lstat.h | 2 +- src/mknod.c | 2 ++ src/stat.c | 2 ++ src/stat64.c | 2 ++ 5 files changed, 12 insertions(+), 4 deletions(-) --- a/src/lstat.c +++ a/src/lstat.c @@ -28,9 +28,11 @@ #include "lstat.h" -wrapper(lstat, int, (int ver, const char * filename, struct stat * buf)) +wrapper(lstat, int, (const char * filename, struct stat * buf)) { - debug("lstat(%d, \"%s\", &buf)", ver, filename); + char fakechroot_abspath[FAKECHROOT_PATH_MAX]; + char fakechroot_buf[FAKECHROOT_PATH_MAX]; + debug("lstat(\"%s\", &buf)", filename); if (!fakechroot_localdir(filename)) { if (filename != NULL) { @@ -40,7 +42,7 @@ wrapper(lstat, int, (int ver, const char * filename, struct stat * buf)) } } - return lstat_rel(ver, filename, buf); + return lstat_rel(filename, buf); } --- a/src/lstat.h +++ a/src/lstat.h @@ -26,7 +26,7 @@ #ifndef HAVE___LXSTAT -wrapper_proto(lstat, int, (int, const char *, struct stat *)); +wrapper_proto(lstat, int, (const char *, struct stat *)); int lstat_rel(const char *, struct stat *); --- a/src/mknod.c +++ a/src/mknod.c @@ -28,6 +28,8 @@ wrapper(mknod, int, (const char * pathname, mode_t mode, dev_t dev)) { + char fakechroot_abspath[FAKECHROOT_PATH_MAX]; + char fakechroot_buf[FAKECHROOT_PATH_MAX]; debug("mknod(\"%s\", 0%o, %ld)", pathname, mode, dev); expand_chroot_path(pathname); return nextcall(mknod)(pathname, mode, dev); --- a/src/stat.c +++ a/src/stat.c @@ -33,6 +33,8 @@ wrapper(stat, int, (const char * file_name, struct stat * buf)) { + char fakechroot_abspath[FAKECHROOT_PATH_MAX]; + char fakechroot_buf[FAKECHROOT_PATH_MAX]; debug("stat(\"%s\", &buf)", file_name); expand_chroot_path(file_name); return nextcall(stat)(file_name, buf); --- a/src/stat64.c +++ a/src/stat64.c @@ -34,6 +34,8 @@ wrapper(stat64, int, (const char * file_name, struct stat64 * buf)) { + char fakechroot_abspath[FAKECHROOT_PATH_MAX]; + char fakechroot_buf[FAKECHROOT_PATH_MAX]; debug("stat64(\"%s\", &buf)", file_name); expand_chroot_path(file_name); return nextcall(stat64)(file_name, buf); --- configure.ac | 20 ++++++++++++++++++++ src/ftw.c | 2 +- src/ftw64.c | 14 +++++++++++--- src/libfakechroot.h | 15 +++++++++++++++ src/lstat.c | 2 +- src/lstat.h | 2 +- src/lstat64.c | 2 +- src/mknod.c | 2 +- src/mknodat.c | 2 +- src/stat.c | 2 +- src/stat64.c | 2 +- 11 files changed, 54 insertions(+), 11 deletions(-) --- a/configure.ac +++ a/configure.ac @@ -75,6 +75,26 @@ ACX_CHECK_C_ATTRIBUTE_VISIBILITY # Checks for libraries. AC_CHECK_LIB([dl], [dlsym]) +AH_TEMPLATE([NEW_GLIBC], [glibc >= 2.33]) +AC_MSG_CHECKING([for glibc 2.33+]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + ]], [[ +#ifdef __GLIBC__ +#if !__GLIBC_PREREQ(2,33) +#error glibc<2.33 +#endif +#else +#error not glibc +#endif + ]])],[ + AC_DEFINE(NEW_GLIBC,1) + AC_MSG_RESULT([yes]) + ],[ + AC_DEFINE(NEW_GLIBC,0) + AC_MSG_RESULT([no]) + ]) + # Checks for header files. AC_HEADER_DIRENT AC_HEADER_STDC --- a/src/ftw.c +++ a/src/ftw.c @@ -185,7 +185,7 @@ int rpl_lstat (const char *, struct stat *); # define NFTW_NEW_NAME __new_nftw # define INO_T ino_t # define STAT stat -# ifdef _LIBC +# if defined(_LIBC) && !NEW_GLIBC # define LXSTAT __lxstat # define XSTAT __xstat # define FXSTATAT __fxstatat --- a/src/ftw64.c +++ a/src/ftw64.c @@ -18,6 +18,8 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include "config.h" + #define __FTW64_C #define FTW_NAME ftw64 #define NFTW_NAME nftw64 @@ -25,9 +27,15 @@ #define NFTW_NEW_NAME __new_nftw64 #define INO_T ino64_t #define STAT stat64 -#define LXSTAT __lxstat64 -#define XSTAT __xstat64 -#define FXSTATAT __fxstatat64 +#if NEW_GLIBC +# define LXSTAT(V,f,sb) lstat64 (f,sb) +# define XSTAT(V,f,sb) stat64 (f,sb) +# define FXSTATAT(V,d,f,sb,m) fstatat64 (d, f, sb, m) +#else +# define LXSTAT __lxstat64 +# define XSTAT __xstat64 +# define FXSTATAT __fxstatat64 +#endif #define FTW_FUNC_T __ftw64_func_t #define NFTW_FUNC_T __nftw64_func_t --- a/src/libfakechroot.h +++ a/src/libfakechroot.h @@ -200,6 +200,21 @@ # endif #endif +#ifndef _STAT_VER + #if defined (__aarch64__) + #define _STAT_VER 0 + #elif defined (__powerpc__) && __WORDSIZE == 64 + #define _STAT_VER 1 + #elif defined (__riscv) && __riscv_xlen==64 + #define _STAT_VER 0 + #elif defined (__s390x__) + #define _STAT_VER 1 + #elif defined (__x86_64__) + #define _STAT_VER 1 + #else + #define _STAT_VER 3 + #endif +#endif typedef void (*fakechroot_wrapperfn_t)(void); --- a/src/lstat.c +++ a/src/lstat.c @@ -20,7 +20,7 @@ #include -#ifndef HAVE___LXSTAT +#if !defined(HAVE___LXSTAT) || NEW_GLIBC #include #include --- a/src/lstat.h +++ a/src/lstat.h @@ -24,7 +24,7 @@ #include #include "libfakechroot.h" -#ifndef HAVE___LXSTAT +#if !defined(HAVE___LXSTAT) || NEW_GLIBC wrapper_proto(lstat, int, (const char *, struct stat *)); --- a/src/lstat64.c +++ a/src/lstat64.c @@ -20,7 +20,7 @@ #include -#if defined(HAVE_LSTAT64) && !defined(HAVE___LXSTAT64) +#if defined(HAVE_LSTAT64) && (!defined(HAVE___LXSTAT64) || NEW_GLIBC) #define _LARGEFILE64_SOURCE #define _BSD_SOURCE --- a/src/mknod.c +++ a/src/mknod.c @@ -20,7 +20,7 @@ #include -#ifndef HAVE___XMKNOD +#if !defined(HAVE___XMKNOD) || NEW_GLIBC #include #include "libfakechroot.h" --- a/src/mknodat.c +++ a/src/mknodat.c @@ -20,7 +20,7 @@ #include -#if defined(HAVE_MKNODAT) && !defined(HAVE___XMKNODAT) +#if defined(HAVE_MKNODAT) && (!defined(HAVE___XMKNODAT) || NEW_GLIBC) #define _ATFILE_SOURCE #include --- a/src/stat.c +++ a/src/stat.c @@ -20,7 +20,7 @@ #include -#ifndef HAVE___XSTAT +#if !defined(HAVE___XSTAT) || NEW_GLIBC #define _BSD_SOURCE #define _DEFAULT_SOURCE --- a/src/stat64.c +++ a/src/stat64.c @@ -20,7 +20,7 @@ #include -#if defined(HAVE_STAT64) && !defined(HAVE___XSTAT64) +#if defined(HAVE_STAT64) && (!defined(HAVE___XSTAT64) || NEW_GLIBC) #define _BSD_SOURCE #define _LARGEFILE64_SOURCE --- configure.ac | 2 ++ src/Makefile.am | 2 ++ src/fstatat.c | 42 ++++++++++++++++++++++++++++++++++++++++++ src/fstatat64.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 src/fstatat.c create mode 100644 src/fstatat64.c --- a/configure.ac +++ a/configure.ac @@ -218,6 +218,8 @@ AC_CHECK_FUNCS(m4_normalize([ freopen64 fstat fstat64 + fstatat + fstatat64 fts_children fts_open fts_read --- a/src/Makefile.am +++ a/src/Makefile.am @@ -61,6 +61,8 @@ libfakechroot_la_SOURCES = \ fopen64.c \ freopen.c \ freopen64.c \ + fstatat.c \ + fstatat64.c \ fts.c \ fts64.c \ ftw.c \ --- a/src/fstatat.c +++ a/src/fstatat.c @@ -0,0 +1,42 @@ +/* + libfakechroot -- fake chroot environment + Copyright (c) 2010, 2021 Piotr Roszatycki + + This 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. + + This 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 this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include + +#ifdef HAVE_FSTATAT + +#define _ATFILE_SOURCE +#define _POSIX_C_SOURCE 200809L +#include +#include +#include "libfakechroot.h" + +wrapper(fstatat, int, (int dirfd, const char *pathname, struct stat *buf, int flags)) +{ + char fakechroot_abspath[FAKECHROOT_PATH_MAX]; + char fakechroot_buf[FAKECHROOT_PATH_MAX]; + debug("fstatat(%d, \"%s\", &buf, %d)", dirfd, pathname, flags); + expand_chroot_path_at(dirfd, pathname); + return nextcall(fstatat)(dirfd, pathname, buf, flags); +} + +#else +typedef int empty_translation_unit; +#endif --- a/src/fstatat64.c +++ a/src/fstatat64.c @@ -0,0 +1,43 @@ +/* + libfakechroot -- fake chroot environment + Copyright (c) 2010, 2021 Piotr Roszatycki + + This 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. + + This 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 this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include + +#ifdef HAVE_FSTATAT64 + +#define _ATFILE_SOURCE +#define _POSIX_C_SOURCE 200809L +#define _LARGEFILE64_SOURCE +#include +#include +#include "libfakechroot.h" + +wrapper(fstatat64, int, (int dirfd, const char *pathname, struct stat64 *buf, int flags)) +{ + char fakechroot_abspath[FAKECHROOT_PATH_MAX]; + char fakechroot_buf[FAKECHROOT_PATH_MAX]; + debug("fstatat64(%d, \"%s\", &buf, %d)", dirfd, pathname, flags); + expand_chroot_path_at(dirfd, pathname); + return nextcall(fstatat64)(dirfd, pathname, buf, flags); +} + +#else +typedef int empty_translation_unit; +#endif