Where rpl_fopen() is used rather than fopen(), wrapping fopen() is ineffective. Note rpl_fopen() is used as of glibc-2.39 at least (due to fflush and fclose being replaced).
* tests/df/no-mtab-status.sh: Wrap open() rather than fopen(). * tests/df/skip-duplicates.sh: Likewise. --- tests/df/no-mtab-status.sh | 32 +++++++++++++++++++++----------- tests/df/skip-duplicates.sh | 31 ++++++++++++++++++++----------- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/tests/df/no-mtab-status.sh b/tests/df/no-mtab-status.sh index 8bf8ce051..f70c695f8 100755 --- a/tests/df/no-mtab-status.sh +++ b/tests/df/no-mtab-status.sh @@ -31,39 +31,49 @@ grep '^#define HAVE_GETMNTENT 1' $CONFIG_HEADER > /dev/null \ cat > k.c <<EOF || framework_failure_ #define _GNU_SOURCE #include <stdio.h> +#include <stdlib.h> #include <errno.h> +#include <fcntl.h> #include <mntent.h> #include <string.h> +#include <stdarg.h> #include <dlfcn.h> #define STREQ(a, b) (strcmp (a, b) == 0) -FILE* fopen(const char *path, const char *mode) +int open(const char *path, int flags, ...) { - static FILE* (*fopen_func)(char const *, char const *); + static int (*open_func)(const char *, int, ...); - /* get reference to original (libc provided) fopen */ - if (!fopen_func) + /* get reference to original (libc provided) open */ + if (!open_func) { - fopen_func = (FILE*(*)(char const *, char const *)) - dlsym(RTLD_NEXT, "fopen"); - if (!fopen_func) + open_func = (int(*)(const char *, int, ...)) + dlsym(RTLD_NEXT, "open"); + if (!open_func) { - fprintf (stderr, "Failed to find fopen()\n"); + fprintf (stderr, "Failed to find open()\n"); errno = ESRCH; - return NULL; + return -1; } } + va_list ap; + va_start (ap, flags); + mode_t mode = (sizeof (mode_t) < sizeof (int) + ? va_arg (ap, int) + : va_arg (ap, mode_t)); + va_end (ap); + /* Returning ENOENT here will get read_file_system_list() to fall back to using getmntent() below. */ if (STREQ (path, "/proc/self/mountinfo")) { errno = ENOENT; - return NULL; + return -1; } else - return fopen_func(path, mode); + return open_func(path, flags, mode); } struct mntent *getmntent (FILE *fp) diff --git a/tests/df/skip-duplicates.sh b/tests/df/skip-duplicates.sh index cfac82dfd..dd28aba3c 100755 --- a/tests/df/skip-duplicates.sh +++ b/tests/df/skip-duplicates.sh @@ -43,38 +43,47 @@ cat > k.c <<EOF || framework_failure_ #include <stdio.h> #include <stdlib.h> #include <errno.h> +#include <fcntl.h> #include <mntent.h> #include <string.h> +#include <stdarg.h> #include <dlfcn.h> #define STREQ(a, b) (strcmp (a, b) == 0) -FILE* fopen(const char *path, const char *mode) +int open(const char *path, int flags, ...) { - static FILE* (*fopen_func)(char const *, char const *); + static int (*open_func)(const char *, int, ...); - /* get reference to original (libc provided) fopen */ - if (!fopen_func) + /* get reference to original (libc provided) open */ + if (!open_func) { - fopen_func = (FILE*(*)(char const *, char const *)) - dlsym(RTLD_NEXT, "fopen"); - if (!fopen_func) + open_func = (int(*)(const char *, int, ...)) + dlsym(RTLD_NEXT, "open"); + if (!open_func) { - fprintf (stderr, "Failed to find fopen()\n"); + fprintf (stderr, "Failed to find open()\n"); errno = ESRCH; - return NULL; + return -1; } } + va_list ap; + va_start (ap, flags); + mode_t mode = (sizeof (mode_t) < sizeof (int) + ? va_arg (ap, int) + : va_arg (ap, mode_t)); + va_end (ap); + /* Returning ENOENT here will get read_file_system_list() to fall back to using getmntent() below. */ if (STREQ (path, "/proc/self/mountinfo")) { errno = ENOENT; - return NULL; + return -1; } else - return fopen_func(path, mode); + return open_func(path, flags, mode); } #define STREQ(a, b) (strcmp (a, b) == 0) -- 2.46.0