qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 06/10] Add support for passing contents of argv0


From: Aurelien Jarno
Subject: Re: [Qemu-devel] [PATCH 06/10] Add support for passing contents of argv0
Date: Wed, 15 Apr 2009 18:13:40 +0200
User-agent: Mutt/1.5.18 (2008-05-17)

On Sun, Apr 05, 2009 at 11:59:22PM +0300, address@hidden wrote:
> From: Riku Voipio <address@hidden>
> 
> 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 <address@hidden>
> ---
>  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
address@hidden                 http://www.aurel32.net




reply via email to

[Prev in Thread] Current Thread [Next in Thread]