From 6f1ec80f31164e08ffa048225a6c6142bfaf92b4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?P=C3=A1draig=20Brady?= Date: Wed, 2 Oct 2024 16:33:42 +0100 Subject: [PATCH] tests: fix skipping of mtab simulation tests 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 8bf8ce051a..f70c695f86 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 < +#include #include +#include #include #include +#include #include #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 cfac82dfd1..dd28aba3cd 100755 --- a/tests/df/skip-duplicates.sh +++ b/tests/df/skip-duplicates.sh @@ -43,38 +43,47 @@ cat > k.c < #include #include +#include #include #include +#include #include #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.47.2