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