mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 23:33:54 -06: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
8 changed files with 129 additions and 128 deletions
|
@ -48,14 +48,13 @@
|
|||
#endif
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/thr.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/user.h>
|
||||
#include <libutil.h>
|
||||
#endif
|
||||
|
||||
#ifdef __NetBSD__
|
||||
#include <sys/sysctl.h>
|
||||
#include <lwp.h>
|
||||
#endif
|
||||
|
||||
|
@ -283,87 +282,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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue