mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-28 21:03:54 -06:00
bsd-user: implement path searching
Use the PATH to find the executable given a bare argument. We need to do this so we can implement mixing native and emulated binaries (e.g., execing a x86 native binary from an emulated arm binary to optimize parts of the build). By finding the binary, we will know how to exec it. Signed-off-by: Stacey Son <sson@FreeBSD.org> Signed-off-by: Warner Losh <imp@bsdimp.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
223005f058
commit
1b50ff64a5
2 changed files with 37 additions and 2 deletions
|
@ -139,21 +139,55 @@ abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp,
|
||||||
return sp;
|
return sp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool is_there(const char *candidate)
|
||||||
|
{
|
||||||
|
struct stat fin;
|
||||||
|
|
||||||
|
/* XXX work around access(2) false positives for superuser */
|
||||||
|
if (access(candidate, X_OK) == 0 && stat(candidate, &fin) == 0 &&
|
||||||
|
S_ISREG(fin.st_mode) && (getuid() != 0 ||
|
||||||
|
(fin.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) != 0)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int loader_exec(const char *filename, char **argv, char **envp,
|
int loader_exec(const char *filename, char **argv, char **envp,
|
||||||
struct target_pt_regs *regs, struct image_info *infop,
|
struct target_pt_regs *regs, struct image_info *infop,
|
||||||
struct bsd_binprm *bprm)
|
struct bsd_binprm *bprm)
|
||||||
{
|
{
|
||||||
|
char *path, fullpath[PATH_MAX];
|
||||||
int retval, i;
|
int retval, i;
|
||||||
|
|
||||||
bprm->p = TARGET_PAGE_SIZE * MAX_ARG_PAGES;
|
bprm->p = TARGET_PAGE_SIZE * MAX_ARG_PAGES;
|
||||||
for (i = 0; i < MAX_ARG_PAGES; i++) { /* clear page-table */
|
for (i = 0; i < MAX_ARG_PAGES; i++) { /* clear page-table */
|
||||||
bprm->page[i] = NULL;
|
bprm->page[i] = NULL;
|
||||||
}
|
}
|
||||||
retval = open(filename, O_RDONLY);
|
|
||||||
|
if (strchr(filename, '/') != NULL) {
|
||||||
|
path = realpath(filename, fullpath);
|
||||||
|
if (path == NULL) {
|
||||||
|
/* Failed to resolve. */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!is_there(path)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
path = g_find_program_in_path(filename);
|
||||||
|
if (path == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = open(path, O_RDONLY);
|
||||||
if (retval < 0) {
|
if (retval < 0) {
|
||||||
|
g_free(path);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bprm->fullpath = path;
|
||||||
bprm->fd = retval;
|
bprm->fd = retval;
|
||||||
bprm->filename = (char *)filename;
|
bprm->filename = (char *)filename;
|
||||||
bprm->argc = count(argv);
|
bprm->argc = count(argv);
|
||||||
|
|
|
@ -124,7 +124,8 @@ struct bsd_binprm {
|
||||||
int argc, envc;
|
int argc, envc;
|
||||||
char **argv;
|
char **argv;
|
||||||
char **envp;
|
char **envp;
|
||||||
char *filename; /* Name of binary */
|
char *filename; /* (Given) Name of binary */
|
||||||
|
char *fullpath; /* Full path of binary */
|
||||||
};
|
};
|
||||||
|
|
||||||
void do_init_thread(struct target_pt_regs *regs, struct image_info *infop);
|
void do_init_thread(struct target_pt_regs *regs, struct image_info *infop);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue