Skip to content

Commit

Permalink
include: move qemu_*_exec_dir() to cutils
Browse files Browse the repository at this point in the history
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>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20220525144140.591926-2-marcandre.lureau@redhat.com>
  • Loading branch information
elmarco committed May 27, 2022
1 parent 2417cbd commit 3dd698b
Show file tree
Hide file tree
Showing 8 changed files with 118 additions and 125 deletions.
7 changes: 7 additions & 0 deletions include/qemu/cutils.h
Expand Up @@ -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:
Expand Down
8 changes: 0 additions & 8 deletions include/qemu/osdep.h
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions qemu-io.c
Expand Up @@ -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"
Expand Down
1 change: 1 addition & 0 deletions storage-daemon/qemu-storage-daemon.c
Expand Up @@ -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"
Expand Down
1 change: 1 addition & 0 deletions tests/qtest/fuzz/fuzz.c
Expand Up @@ -15,6 +15,7 @@

#include <wordexp.h>

#include "qemu/cutils.h"
#include "qemu/datadir.h"
#include "sysemu/sysemu.h"
#include "sysemu/qtest.h"
Expand Down
108 changes: 108 additions & 0 deletions util/cutils.c
Expand Up @@ -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
}

const char *qemu_get_exec_dir(void)
{
return exec_dir;
}

char *get_relocated_path(const char *dir)
{
size_t prefix_len = strlen(CONFIG_PREFIX);
Expand Down
81 changes: 0 additions & 81 deletions util/oslib-posix.c
Expand Up @@ -283,87 +283,6 @@ void qemu_set_tty_echo(int fd, bool echo)
tcsetattr(fd, TCSANOW, &tty);
}

static const char *exec_dir;

void qemu_init_exec_dir(const char *argv0)
{
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;
}
}

const char *qemu_get_exec_dir(void)
{
return exec_dir;
}

#ifdef CONFIG_LINUX
static void sigbus_handler(int signal, siginfo_t *siginfo, void *ctx)
#else /* CONFIG_LINUX */
Expand Down
36 changes: 0 additions & 36 deletions util/oslib-win32.c
Expand Up @@ -269,42 +269,6 @@ void qemu_set_tty_echo(int fd, bool echo)
}
}

static const char *exec_dir;

void qemu_init_exec_dir(const char *argv0)
{

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;
}
}

const char *qemu_get_exec_dir(void)
{
return exec_dir;
}

int getpagesize(void)
{
SYSTEM_INFO system_info;
Expand Down

0 comments on commit 3dd698b

Please sign in to comment.