qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PULL 01/12] util: Split out exec_dir from os_find_data


From: Andreas Färber
Subject: Re: [Qemu-devel] [PULL 01/12] util: Split out exec_dir from os_find_datadir
Date: Thu, 13 Mar 2014 14:08:46 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0

Am 20.02.2014 13:28, schrieb Paolo Bonzini:
> From: Fam Zheng <address@hidden>
> 
> 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 <address@hidden>
> Signed-off-by: Paolo Bonzini <address@hidden>
[...]
> 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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]