mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-26 21:10:42 +00:00
include: move qemu_*_exec_dir() to cutils
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>
This commit is contained in:
parent
2417cbd591
commit
06680b15b4
@ -193,6 +193,13 @@ int uleb128_decode_small(const uint8_t *in, uint32_t *n);
|
|||||||
*/
|
*/
|
||||||
int qemu_pstrcmp0(const char **str1, const char **str2);
|
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:
|
* get_relocated_path:
|
||||||
|
@ -557,14 +557,6 @@ void qemu_set_cloexec(int fd);
|
|||||||
*/
|
*/
|
||||||
char *qemu_get_local_state_dir(void);
|
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:
|
* qemu_getauxval:
|
||||||
* @type: the auxiliary vector key to lookup
|
* @type: the auxiliary vector key to lookup
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "qemu/help-texts.h"
|
#include "qemu/help-texts.h"
|
||||||
|
#include "qemu/cutils.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "qemu-io.h"
|
#include "qemu-io.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
|
|
||||||
#include "qemu/help-texts.h"
|
#include "qemu/help-texts.h"
|
||||||
#include "qemu-version.h"
|
#include "qemu-version.h"
|
||||||
|
#include "qemu/cutils.h"
|
||||||
#include "qemu/config-file.h"
|
#include "qemu/config-file.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
#include "qemu/help_option.h"
|
#include "qemu/help_option.h"
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
#include <wordexp.h>
|
#include <wordexp.h>
|
||||||
|
|
||||||
|
#include "qemu/cutils.h"
|
||||||
#include "qemu/datadir.h"
|
#include "qemu/datadir.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "sysemu/qtest.h"
|
#include "sysemu/qtest.h"
|
||||||
|
117
util/cutils.c
117
util/cutils.c
@ -26,6 +26,15 @@
|
|||||||
#include "qemu/host-utils.h"
|
#include "qemu/host-utils.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
#include <sys/sysctl.h>
|
||||||
|
#include <sys/user.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
#include <sys/sysctl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "qemu/ctype.h"
|
#include "qemu/ctype.h"
|
||||||
#include "qemu/cutils.h"
|
#include "qemu/cutils.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
@ -931,6 +940,114 @@ static inline const char *next_component(const char *dir, int *p_len)
|
|||||||
return dir;
|
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)
|
char *get_relocated_path(const char *dir)
|
||||||
{
|
{
|
||||||
size_t prefix_len = strlen(CONFIG_PREFIX);
|
size_t prefix_len = strlen(CONFIG_PREFIX);
|
||||||
|
@ -48,14 +48,13 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
#include <sys/sysctl.h>
|
|
||||||
#include <sys/user.h>
|
|
||||||
#include <sys/thr.h>
|
#include <sys/thr.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/user.h>
|
||||||
#include <libutil.h>
|
#include <libutil.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __NetBSD__
|
#ifdef __NetBSD__
|
||||||
#include <sys/sysctl.h>
|
|
||||||
#include <lwp.h>
|
#include <lwp.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -283,87 +282,6 @@ void qemu_set_tty_echo(int fd, bool echo)
|
|||||||
tcsetattr(fd, TCSANOW, &tty);
|
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
|
#ifdef CONFIG_LINUX
|
||||||
static void sigbus_handler(int signal, siginfo_t *siginfo, void *ctx)
|
static void sigbus_handler(int signal, siginfo_t *siginfo, void *ctx)
|
||||||
#else /* CONFIG_LINUX */
|
#else /* CONFIG_LINUX */
|
||||||
|
@ -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)
|
int getpagesize(void)
|
||||||
{
|
{
|
||||||
SYSTEM_INFO system_info;
|
SYSTEM_INFO system_info;
|
||||||
|
Loading…
Reference in New Issue
Block a user