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


Reply via email to