Am 20.02.2014 13:28, schrieb Paolo Bonzini: > From: Fam Zheng <f...@redhat.com> > > With this change, main() calls qemu_init_exec_dir and uses argv[0] to > init exec_dir. The saved value can be retrieved with > qemu_get_exec_dir later. It will be reused by module loading. > > Signed-off-by: Fam Zheng <f...@redhat.com> > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> [...] > diff --git a/os-posix.c b/os-posix.c > index d39261d..6187301 100644 > --- a/os-posix.c > +++ b/os-posix.c > @@ -84,46 +84,17 @@ void os_setup_signal_handling(void) > running from the build tree this will be "$bindir/../pc-bios". */ > #define SHARE_SUFFIX "/share/qemu" > #define BUILD_SUFFIX "/pc-bios" > -char *os_find_datadir(const char *argv0) > +char *os_find_datadir(void) > { > - char *dir; > - char *p = NULL; > + char *dir, *exec_dir; > char *res; > - char buf[PATH_MAX]; > size_t max_len; > > -#if defined(__linux__) > - { > - int len; > - len = readlink("/proc/self/exe", buf, sizeof(buf) - 1); > - if (len > 0) { > - buf[len] = 0; > - p = buf; > - } > - } > -#elif defined(__FreeBSD__) > - { > - static int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1}; > - size_t len = sizeof(buf) - 1; > - > - *buf = '\0'; > - if (!sysctl(mib, ARRAY_SIZE(mib), buf, &len, NULL, 0) && > - *buf) { > - buf[sizeof(buf) - 1] = '\0'; > - p = buf; > - } > - } > -#endif > - /* If we don't have any way of figuring out the actual executable > - location then try argv[0]. */ > - if (!p) { > - p = realpath(argv0, buf); > - if (!p) { > - return NULL; > - } > + exec_dir = qemu_get_exec_dir(); > + if (exec_dir == NULL) { > + return NULL; > } > - dir = dirname(p); > - dir = dirname(dir); > + dir = dirname(exec_dir); > > max_len = strlen(dir) + > MAX(strlen(SHARE_SUFFIX), strlen(BUILD_SUFFIX)) + 1; > @@ -137,6 +108,7 @@ char *os_find_datadir(const char *argv0) > } > } > > + g_free(exec_dir); > return res; > } > #undef SHARE_SUFFIX [...] > diff --git a/util/oslib-posix.c b/util/oslib-posix.c > index d5dca47..c2eeb4f 100644 > --- a/util/oslib-posix.c > +++ b/util/oslib-posix.c > @@ -57,6 +57,7 @@ extern int daemon(int, int); > #include "trace.h" > #include "qemu/sockets.h" > #include <sys/mman.h> > +#include <libgen.h> > > #ifdef CONFIG_LINUX > #include <sys/syscall.h> > @@ -274,3 +275,56 @@ void qemu_set_tty_echo(int fd, bool echo) > > tcsetattr(fd, TCSANOW, &tty); > } > + > +static char exec_dir[PATH_MAX]; > + > +void qemu_init_exec_dir(const char *argv0) > +{ > + char *dir; > + char *p = NULL; > + char buf[PATH_MAX]; > + > + assert(!exec_dir[0]); > + > +#if defined(__linux__) > + { > + int len; > + len = readlink("/proc/self/exe", buf, sizeof(buf) - 1); > + if (len > 0) { > + buf[len] = 0; > + p = buf; > + } > + } > +#elif defined(__FreeBSD__) > + { > + static int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1};
This code movement broke the build on FreeBSD, CTL_KERN undeclared. :( Probably some #include missing? Regards, Andreas > + size_t len = sizeof(buf) - 1; > + > + *buf = '\0'; > + if (!sysctl(mib, ARRAY_SIZE(mib), buf, &len, NULL, 0) && > + *buf) { > + buf[sizeof(buf) - 1] = '\0'; > + p = buf; > + } > + } > +#endif > + /* If we don't have any way of figuring out the actual executable > + location then try argv[0]. */ > + if (!p) { > + if (!argv0) { > + return; > + } > + p = realpath(argv0, buf); > + if (!p) { > + return; > + } > + } > + dir = dirname(p); > + > + pstrcpy(exec_dir, sizeof(exec_dir), dir); > +} > + > +char *qemu_get_exec_dir(void) > +{ > + return g_strdup(exec_dir); > +} [snip] -- SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg