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
next prev parent 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).