From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Lu7k6-0002Av-CL for qemu-devel@nongnu.org; Wed, 15 Apr 2009 12:13:42 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Lu7k5-0002AC-Q2 for qemu-devel@nongnu.org; Wed, 15 Apr 2009 12:13:42 -0400 Received: from [199.232.76.173] (port=48896 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Lu7k5-0002A4-Mf for qemu-devel@nongnu.org; Wed, 15 Apr 2009 12:13:41 -0400 Received: from hall.aurel32.net ([88.191.82.174]:39110) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Lu7k5-0003g9-82 for qemu-devel@nongnu.org; Wed, 15 Apr 2009 12:13:41 -0400 Date: Wed, 15 Apr 2009 18:13:40 +0200 From: Aurelien Jarno Subject: Re: [Qemu-devel] [PATCH 06/10] Add support for passing contents of argv0 Message-ID: <20090415161340.GD26206@hall.aurel32.net> References: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline In-Reply-To: Sender: Aurelien Jarno Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Riku Voipio Cc: qemu-devel@nongnu.org On Sun, Apr 05, 2009 at 11:59:22PM +0300, riku.voipio@iki.fi wrote: > From: Riku Voipio > > 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. > > From: Mika Westerberg > > Signed-off-by: Riku Voipio > --- > linux-user/main.c | 38 +++++++++++++++++++++++++++++++++++++- > 1 files changed, 37 insertions(+), 1 deletions(-) Thanks, applied. > 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 > > > > -- Aurelien Jarno GPG: 1024D/F1BCDB73 aurelien@aurel32.net http://www.aurel32.net