All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: marcandre.lureau@redhat.com
Cc: qemu-devel@nongnu.org,  Konstantin Kostiuk <kkostiuk@redhat.com>,
	Michael Roth <michael.roth@amd.com>
Subject: Re: [PATCH v3 01/15] include: move qemu_*_exec_dir() to cutils
Date: Mon, 23 May 2022 14:23:44 +0200	[thread overview]
Message-ID: <87h75g8mjz.fsf@pond.sub.org> (raw)
In-Reply-To: <20220513180821.905149-2-marcandre.lureau@redhat.com> (marcandre lureau's message of "Fri, 13 May 2022 20:08:07 +0200")

marcandre.lureau@redhat.com writes:

> From: Marc-André Lureau <marcandre.lureau@redhat.com>
>
> The function is required by get_relocated_path() (already in cutils),
> and used by qemu-ga and may be generally useful.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  include/qemu/cutils.h                |   7 ++
>  include/qemu/osdep.h                 |   8 --
>  qemu-io.c                            |   1 +
>  storage-daemon/qemu-storage-daemon.c |   1 +
>  tests/qtest/fuzz/fuzz.c              |   1 +
>  util/cutils.c                        | 108 +++++++++++++++++++++++++++
>  util/oslib-posix.c                   |  81 --------------------
>  util/oslib-win32.c                   |  36 ---------
>  8 files changed, 118 insertions(+), 125 deletions(-)
>
> diff --git a/include/qemu/cutils.h b/include/qemu/cutils.h
> index 5c6572d444..40e10e19a7 100644
> --- a/include/qemu/cutils.h
> +++ b/include/qemu/cutils.h
> @@ -193,6 +193,13 @@ int uleb128_decode_small(const uint8_t *in, uint32_t *n);
>   */
>  int qemu_pstrcmp0(const char **str1, const char **str2);
>  
> +/* Find program directory, and save it for later usage with
> + * qemu_get_exec_dir().
> + * Try OS specific API first, if not working, parse from argv0. */
> +void qemu_init_exec_dir(const char *argv0);
> +
> +/* Get the saved exec dir.  */
> +const char *qemu_get_exec_dir(void);
>  
>  /**
>   * get_relocated_path:
> diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
> index 1c1e7eca98..67cc465416 100644
> --- a/include/qemu/osdep.h
> +++ b/include/qemu/osdep.h
> @@ -557,14 +557,6 @@ void qemu_set_cloexec(int fd);
>   */
>  char *qemu_get_local_state_dir(void);
>  
> -/* Find program directory, and save it for later usage with
> - * qemu_get_exec_dir().
> - * Try OS specific API first, if not working, parse from argv0. */
> -void qemu_init_exec_dir(const char *argv0);
> -
> -/* Get the saved exec dir.  */
> -const char *qemu_get_exec_dir(void);
> -
>  /**
>   * qemu_getauxval:
>   * @type: the auxiliary vector key to lookup
> diff --git a/qemu-io.c b/qemu-io.c
> index d70d3dd4fd..2bd7bfb650 100644
> --- a/qemu-io.c
> +++ b/qemu-io.c
> @@ -16,6 +16,7 @@
>  #endif
>  
>  #include "qemu/help-texts.h"
> +#include "qemu/cutils.h"
>  #include "qapi/error.h"
>  #include "qemu-io.h"
>  #include "qemu/error-report.h"
> diff --git a/storage-daemon/qemu-storage-daemon.c b/storage-daemon/qemu-storage-daemon.c
> index 9b8b17f52e..c104817cdd 100644
> --- a/storage-daemon/qemu-storage-daemon.c
> +++ b/storage-daemon/qemu-storage-daemon.c
> @@ -44,6 +44,7 @@
>  
>  #include "qemu/help-texts.h"
>  #include "qemu-version.h"
> +#include "qemu/cutils.h"
>  #include "qemu/config-file.h"
>  #include "qemu/error-report.h"
>  #include "qemu/help_option.h"
> diff --git a/tests/qtest/fuzz/fuzz.c b/tests/qtest/fuzz/fuzz.c
> index a7a5e14fa3..0ad4ba9e94 100644
> --- a/tests/qtest/fuzz/fuzz.c
> +++ b/tests/qtest/fuzz/fuzz.c
> @@ -15,6 +15,7 @@
>  
>  #include <wordexp.h>
>  
> +#include "qemu/cutils.h"
>  #include "qemu/datadir.h"
>  #include "sysemu/sysemu.h"
>  #include "sysemu/qtest.h"
> diff --git a/util/cutils.c b/util/cutils.c
> index b2777210e7..6cc7cc8cde 100644
> --- a/util/cutils.c
> +++ b/util/cutils.c
> @@ -931,6 +931,114 @@ static inline const char *next_component(const char *dir, int *p_len)
>      return dir;
>  }
>  
> +static const char *exec_dir;
> +
> +void qemu_init_exec_dir(const char *argv0)
> +{
> +#ifdef G_OS_WIN32
> +    char *p;
> +    char buf[MAX_PATH];
> +    DWORD len;
> +
> +    if (exec_dir) {
> +        return;
> +    }
> +
> +    len = GetModuleFileName(NULL, buf, sizeof(buf) - 1);
> +    if (len == 0) {
> +        return;
> +    }
> +
> +    buf[len] = 0;
> +    p = buf + len - 1;
> +    while (p != buf && *p != '\\') {
> +        p--;
> +    }
> +    *p = 0;
> +    if (access(buf, R_OK) == 0) {
> +        exec_dir = g_strdup(buf);
> +    } else {
> +        exec_dir = CONFIG_BINDIR;
> +    }
> +#else
> +    char *p = NULL;
> +    char buf[PATH_MAX];
> +
> +    if (exec_dir) {
> +        return;
> +    }
> +
> +#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__) \
> +      || (defined(__NetBSD__) && defined(KERN_PROC_PATHNAME))
> +    {
> +#if defined(__FreeBSD__)
> +        static int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1};
> +#else
> +        static int mib[4] = {CTL_KERN, KERN_PROC_ARGS, -1, KERN_PROC_PATHNAME};
> +#endif
> +        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;
> +        }
> +    }
> +#elif defined(__APPLE__)
> +    {
> +        char fpath[PATH_MAX];
> +        uint32_t len = sizeof(fpath);
> +        if (_NSGetExecutablePath(fpath, &len) == 0) {
> +            p = realpath(fpath, buf);
> +            if (!p) {
> +                return;
> +            }
> +        }
> +    }
> +#elif defined(__HAIKU__)
> +    {
> +        image_info ii;
> +        int32_t c = 0;
> +
> +        *buf = '\0';
> +        while (get_next_image_info(0, &c, &ii) == B_OK) {
> +            if (ii.type == B_APP_IMAGE) {
> +                strncpy(buf, ii.name, sizeof(buf));
> +                buf[sizeof(buf) - 1] = 0;
> +                p = buf;
> +                break;
> +            }
> +        }
> +    }
> +#endif
> +    /* If we don't have any way of figuring out the actual executable
> +       location then try argv[0].  */
> +    if (!p && argv0) {
> +        p = realpath(argv0, buf);
> +    }
> +    if (p) {
> +        exec_dir = g_path_get_dirname(p);
> +    } else {
> +        exec_dir = CONFIG_BINDIR;
> +    }
> +#endif
> +}

Combines code moved from oslib-posix.c and oslib-win32.c with #if.
Sounds like a step backward, until you realize just how many #if there
already are.  Okay.

> +
> +const char *qemu_get_exec_dir(void)
> +{
> +    return exec_dir;
> +}
> +
>  char *get_relocated_path(const char *dir)
>  {
>      size_t prefix_len = strlen(CONFIG_PREFIX);

Keeping qemu_init_exec_dir() and qemu_get_exec_dir() next to
get_relocated_path() makes sense.  However, util/cutils.c is getting
rather long: almost 700 SLOC, and I feel the new code stretches its
"Simple C functions to supplement the C library" mandate.  Most of the
code there is string stuff.  Would you mind putting the file name stuff
into its own file?

Regardless,
Reviewed-by: Markus Armbruster <armbru@redhat.com>

[...]



  reply	other threads:[~2022-05-23 12:25 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-13 18:08 [PATCH v3 00/15] Misc cleanups marcandre.lureau
2022-05-13 18:08 ` [PATCH v3 01/15] include: move qemu_*_exec_dir() to cutils marcandre.lureau
2022-05-23 12:23   ` Markus Armbruster [this message]
2022-05-13 18:08 ` [PATCH v3 02/15] util/win32: simplify qemu_get_local_state_dir() marcandre.lureau
2022-05-13 18:08 ` [PATCH v3 03/15] tests: make libqmp buildable for win32 marcandre.lureau
2022-05-13 18:08 ` [PATCH v3 04/15] qga: flatten safe_open_or_create() marcandre.lureau
2022-05-16  7:19   ` Markus Armbruster
2022-05-13 18:08 ` [PATCH v3 05/15] osdep: export qemu_open_cloexec() marcandre.lureau
2022-05-23 12:01   ` Markus Armbruster
2022-05-23 12:29   ` Peter Maydell
2022-05-23 12:42   ` Daniel P. Berrangé
2022-05-23 17:30     ` Marc-André Lureau
2022-05-23 17:56       ` Daniel P. Berrangé
2022-05-23 18:02         ` Marc-André Lureau
2022-05-23 18:10           ` Daniel P. Berrangé
2022-05-23 19:11             ` Marc-André Lureau
2022-05-13 18:08 ` [PATCH v3 06/15] qga: use qemu_open_cloexec() for safe_open_or_create() marcandre.lureau
2022-05-16  7:24   ` Markus Armbruster
2022-05-13 18:08 ` [PATCH v3 07/15] qga: throw an Error in ga_channel_open() marcandre.lureau
2022-05-16  7:27   ` Markus Armbruster
2022-05-13 18:08 ` [PATCH v3 08/15] qga: replace qemu_open_old() with qemu_open_cloexec() marcandre.lureau
2022-05-20 13:39   ` Konstantin Kostiuk
2022-05-13 18:08 ` [PATCH v3 09/15] qga: make build_fs_mount_list() return a bool marcandre.lureau
2022-05-13 18:08 ` [PATCH v3 10/15] test/qga: use G_TEST_DIR to locate os-release test file marcandre.lureau
2022-05-20 13:43   ` Konstantin Kostiuk
2022-05-13 18:08 ` [PATCH v3 11/15] qga/wixl: prefer variables over environment marcandre.lureau
2022-05-13 18:08 ` [PATCH v3 12/15] qga/wixl: require Mingw_bin marcandre.lureau
2022-05-13 18:08 ` [PATCH v3 13/15] qga/wixl: simplify some pre-processing marcandre.lureau
2022-05-13 18:08 ` [PATCH v3 14/15] qga/wixl: replace QEMU_GA_MSI_MINGW_BIN_PATH with glib bindir marcandre.lureau
2022-05-13 18:08 ` [PATCH v3 15/15] test/qga: use g_auto wherever sensible marcandre.lureau
2022-05-19 17:05 ` [PATCH v3 00/15] Misc cleanups Marc-André Lureau

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=87h75g8mjz.fsf@pond.sub.org \
    --to=armbru@redhat.com \
    --cc=kkostiuk@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=michael.roth@amd.com \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.