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);