Sophie

Sophie

distrib > Mageia > 3 > i586 > media > core-release-src > by-pkgid > d78a95337530a0922a6b5da9bf6c324a > files > 2

fakechroot-2.16-5.mga3.src.rpm

Workaround for glob* vs rpm glob*

glob/glob64 is also defined by rpm in librpmio, which breaks fakechroot.
This patch tries to find which library is defining the symbol
(using dladdr, which is gnu specific) and if found, check if the symbol
comes from libc. If it's not from libc, call it directly.

Signed-off-by: Arnaud Patard <arnaud.patard@rtp-net.org>
Index: fakechroot-2.16/src/glob64.c
===================================================================
--- fakechroot-2.16.orig/src/glob64.c
+++ fakechroot-2.16/src/glob64.c
@@ -23,6 +23,9 @@
 #ifdef HAVE_GLOB64
 
 #define _LARGEFILE64_SOURCE
+#define _GNU_SOURCE
+#include <dlfcn.h>
+#include <string.h>
 #include <glob.h>
 #include "libfakechroot.h"
 
@@ -32,6 +35,20 @@ wrapper(glob64, int, (const char * patte
     int rc, i;
     char tmp[FAKECHROOT_PATH_MAX], *tmpptr;
     char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_PATH_MAX];
+    void *ptr;
+
+    ptr = dlsym(RTLD_NEXT, "glob64");
+    if (ptr) {
+	Dl_info info;
+	memset(&info, 0, sizeof(Dl_info));
+	rc = dladdr(ptr, &info);
+	if (rc && info.dli_sname && !strcmp(info.dli_sname, "glob64")) {
+            if (!strstr(info.dli_fname, "libc.so")) {
+                debug("glob64: calling %s found in %s", info.dli_sname, info.dli_fname);
+		return nextcall(glob64)(pattern, flags, errfunc, pglob);
+            }
+	}
+    }
 
     debug("glob64(\"%s\", %d, &errfunc, &pglob)", pattern, flags);
     expand_chroot_path(pattern, fakechroot_path, fakechroot_buf);
Index: fakechroot-2.16/src/glob.c
===================================================================
--- fakechroot-2.16.orig/src/glob.c
+++ fakechroot-2.16/src/glob.c
@@ -20,6 +20,9 @@
 
 #include <config.h>
 
+#define _GNU_SOURCE
+#include <dlfcn.h>
+#include <string.h>
 #include <glob.h>
 #include "libfakechroot.h"
 
@@ -29,6 +32,20 @@ wrapper(glob, int, (const char * pattern
     int rc, i;
     char tmp[FAKECHROOT_PATH_MAX], *tmpptr;
     char *fakechroot_path, *fakechroot_ptr, fakechroot_buf[FAKECHROOT_PATH_MAX];
+    void *ptr;
+
+    ptr = dlsym(RTLD_NEXT, "glob");
+    if (ptr) {
+	Dl_info info;
+	memset(&info, 0, sizeof(Dl_info));
+	rc = dladdr(ptr, &info);
+	if (rc && info.dli_sname && !strcmp(info.dli_sname, "glob")) {
+            if (!strstr(info.dli_fname, "libc.so")) {
+                debug("glob: calling %s found in %s", info.dli_sname, info.dli_fname);
+		return nextcall(glob)(pattern, flags, errfunc, pglob);
+            }
+	}
+    }
 
     debug("glob(\"%s\", %d, &errfunc, &pglob)", pattern, flags);
     expand_chroot_path(pattern, fakechroot_path, fakechroot_buf);