ksh/ksh93-fs3d.dif
2013-10-18 10:46:51 +00:00

66 lines
1.9 KiB
Plaintext

2013-10-17 10:30:20 - werner@suse.de
Found by debugging with valgrind and environment variable LD_LIBRARY_PATH that
the mount() system call function from the glibc is used instead of a fs3d_mount()
function. To avoid this make fs3d_mount() a weak symbol to be overloadable by
a shared library function and make the stub function return -1 for not configured
file system type.
--- src/lib/libast/misc/fs3d.c
+++ src/lib/libast/misc/fs3d.c 2013-10-17 10:30:20.000000000 +0000
@@ -28,6 +28,20 @@
* only active for non-shared 3d library
*/
+#if defined(__linux__) && defined(__GNUC__)
+# if defined __USE_ISOC99
+# define _cat_pragma(exp) _Pragma(#exp)
+# define _weak_pragma(exp) _cat_pragma(weak name)
+# else
+# define _weak_pragma(exp)
+# endif
+# define _declare(name,sym) __extension__ extern __typeof__(sym) name
+# define weak_symbol(sym) _weak_pragma(name) _declare(sym,sym) __attribute__((__weak__))
+# include <error.h>
+#else
+# define weak_symbol(sym)
+#endif
+
#define mount ______mount
#include <ast.h>
@@ -35,6 +49,7 @@
#undef mount
#include <fs3d.h>
+weak_symbol(fs3d_mount);
int
fs3d(register int op)
@@ -102,11 +117,18 @@ fs3d(register int op)
* user code that includes <fs3d.h> will have mount() mapped to fs3d_mount()
* this restricts the various "standard" mount prototype conflicts to this spot
* this means that code that includes <fs3d.h> cannot access the real mount
- * (at least without some additional macro hackery
+ * (at least without some additional macro hackery)
*/
#undef mount
-
+#if defined(__linux__) && defined(__GNUC__)
+int __attribute__((__noinline__))
+fs3d_mount(const char* source, char* target, int flags, void* data)
+{
+ errno = ENODEV;
+ return -1;
+}
+#else
extern int mount(const char*, char*, int, void*);
int
@@ -114,3 +136,4 @@ fs3d_mount(const char* source, char* tar
{
return mount(source, target, flags, data);
}
+#endif