qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Andreas Färber" <afaerber@suse.de>
To: Paolo Bonzini <pbonzini@redhat.com>,
	qemu-devel@nongnu.org, famz@redhat.com
Cc: peter.maydell@linaro.org, aliguori@amazon.com
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	[thread overview]
Message-ID: <5321ADDE.4030703@suse.de> (raw)
In-Reply-To: <1392899343-5226-2-git-send-email-pbonzini@redhat.com>

Am 20.02.2014 13:28, schrieb Paolo Bonzini:
> From: Fam Zheng <famz@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 <famz@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@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

  reply	other threads:[~2014-03-13 13:09 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-20 12:28 [Qemu-devel] [PULL respin 00/12] Build system changes for 2014-02-20 Paolo Bonzini
2014-02-20 12:28 ` [Qemu-devel] [PULL 01/12] util: Split out exec_dir from os_find_datadir Paolo Bonzini
2014-03-13 13:08   ` Andreas Färber [this message]
2014-02-20 12:28 ` [Qemu-devel] [PULL 02/12] rules.mak: fix $(obj) to a real relative path Paolo Bonzini
2014-02-20 12:28 ` [Qemu-devel] [PULL 03/12] rules.mak: allow per object cflags and libs Paolo Bonzini
2014-02-20 12:28 ` [Qemu-devel] [PULL 04/12] block: use per-object " Paolo Bonzini
2014-02-20 12:28 ` [Qemu-devel] [PULL 05/12] darwin: do not use -mdynamic-no-pic Paolo Bonzini
2014-02-20 12:28 ` [Qemu-devel] [PULL 06/12] rules.mak: introduce DSO rules Paolo Bonzini
2014-02-20 12:28 ` [Qemu-devel] [PULL 07/12] module: implement module loading Paolo Bonzini
2014-02-25 16:13   ` Peter Maydell
2014-02-20 12:28 ` [Qemu-devel] [PULL 08/12] Makefile: install modules with "make install" Paolo Bonzini
2014-02-20 12:29 ` [Qemu-devel] [PULL 09/12] Makefile: introduce common-obj-m and block-obj-m for DSO Paolo Bonzini
2014-02-20 12:29 ` [Qemu-devel] [PULL 10/12] block: convert block drivers linked with libs to modules Paolo Bonzini
2014-02-20 12:29 ` [Qemu-devel] [PULL 11/12] configure: Disable libtool if -fPIE does not work with it (bug #1257099) Paolo Bonzini
2014-02-20 12:29 ` [Qemu-devel] [PULL 12/12] build: softmmu targets do not have a "main.o" file Paolo Bonzini
2014-02-24 16:11 ` [Qemu-devel] [PULL respin 00/12] Build system changes for 2014-02-20 Peter Maydell
  -- strict thread matches above, loose matches on Subject: below --
2014-02-17 17:35 [Qemu-devel] [PULL 00/12] Build system changes for 2014-02-17 Paolo Bonzini
2014-02-17 17:35 ` [Qemu-devel] [PULL 01/12] util: Split out exec_dir from os_find_datadir Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5321ADDE.4030703@suse.de \
    --to=afaerber@suse.de \
    --cc=aliguori@amazon.com \
    --cc=famz@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).