[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 11/17] Add support for passing contents of argv0
From: |
riku . voipio |
Subject: |
[Qemu-devel] [PATCH 11/17] Add support for passing contents of argv0 |
Date: |
Tue, 31 Mar 2009 23:40:43 +0300 |
From: Mika Westerberg <address@hidden>
From: Mika Westerberg
Added switch -0 (zero) which can be used to pass argv[0] to
target process. The main use is for a binfmt_misc wrapper when
the "P - preserve-argv[0]" setting is used.
Signed-off-by: Riku Voipio <address@hidden>
---
linux-user/main.c | 38 +++++++++++++++++++++++++++++++++++++-
1 files changed, 37 insertions(+), 1 deletions(-)
diff --git a/linux-user/main.c b/linux-user/main.c
index feb3036..40308aa 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -2213,6 +2213,7 @@ static void usage(void)
"-drop-ld-preload drop LD_PRELOAD for target process\n"
"-E var=value sets/modifies targets environment variable(s)\n"
"-U var unsets targets environment variable(s)\n"
+ "-0 argv0 forces target process argv[0] to be argv0\n"
"\n"
"Debug options:\n"
"-d options activate log (logfile=%s)\n"
@@ -2263,7 +2264,11 @@ int main(int argc, char **argv, char **envp)
const char *r;
int gdbstub_port = 0;
char **target_environ, **wrk;
+ char **target_argv;
+ int target_argc;
envlist_t *envlist = NULL;
+ const char *argv0 = NULL;
+ int i;
if (argc <= 1)
usage();
@@ -2320,6 +2325,9 @@ int main(int argc, char **argv, char **envp)
r = argv[optind++];
if (envlist_unsetenv(envlist, r) != 0)
usage();
+ } else if (!strcmp(r, "0")) {
+ r = argv[optind++];
+ argv0 = r;
} else if (!strcmp(r, "s")) {
if (optind >= argc)
break;
@@ -2430,11 +2438,39 @@ int main(int argc, char **argv, char **envp)
target_environ = envlist_to_environ(envlist, NULL);
envlist_free(envlist);
- if (loader_exec(filename, argv+optind, target_environ, regs, info) != 0) {
+ /*
+ * Prepare copy of argv vector for target.
+ */
+ target_argc = argc - optind;
+ target_argv = calloc(target_argc + 1, sizeof (char *));
+ if (target_argv == NULL) {
+ (void) fprintf(stderr, "Unable to allocate memory for target_argv\n");
+ exit(1);
+ }
+
+ /*
+ * If argv0 is specified (using '-0' switch) we replace
+ * argv[0] pointer with the given one.
+ */
+ i = 0;
+ if (argv0 != NULL) {
+ target_argv[i++] = strdup(argv0);
+ }
+ for (; i < target_argc; i++) {
+ target_argv[i] = strdup(argv[optind + i]);
+ }
+ target_argv[target_argc] = NULL;
+
+ if (loader_exec(filename, target_argv, target_environ, regs, info) != 0) {
printf("Error loading %s\n", filename);
_exit(1);
}
+ for (i = 0; i < target_argc; i++) {
+ free(target_argv[i]);
+ }
+ free(target_argv);
+
for (wrk = target_environ; *wrk; wrk++) {
free(*wrk);
}
--
1.6.2.1
- [Qemu-devel] [PATCH 00/17] linux-user patches in maemo, riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 05/17] Fix and cleanup IPCOP_shm* ipc calls handling, riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 01/17] Fix fstatat64()/newfstatat() syscall implementation, riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 04/17] Implement sem* syscalls, riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 02/17] Rewrite mmap_find_vma() to work fine on 64-bit hosts with 32-bit targets, riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 15/17] linux-user: removed unnecessary MAX_SOCK_ADDR checks for socket syscalls, riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 08/17] Added posix message queue syscalls except mq_notify, riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 10/17] More strace formatting for posix message queues syscalls, riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 09/17] Format mq_open strace arguments, riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 11/17] Add support for passing contents of argv0,
riku . voipio <=
- [Qemu-devel] [PATCH 14/17] Revived GUEST_BASE support for usermode emulation targets., riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 16/17] Prefer glibc over direct syscalls, riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 17/17] linux-user: Proper exit code for uncaught signals, riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 07/17] shmat(): use mmap_find_vma to find free memory area, riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 03/17] Fix and cleanup IPCOP_sem* ipc calls handling, riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 12/17] linux-user: unix sockets - fix running dbus, riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 06/17] Implement shm* syscalls, riku . voipio, 2009/03/31
- [Qemu-devel] [PATCH 13/17] Strace is now working again with GUEST_BASE support., riku . voipio, 2009/03/31