[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [Qemu-devel] [PULL 01/12] util: Split out exec_dir from os_find_datadir,
Andreas Färber <=