]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] let binfmt_misc optionally preserve argv[1]
authorDavid Mosberger <davidm@napali.hpl.hp.com>
Fri, 8 Nov 2002 03:23:22 +0000 (19:23 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Fri, 8 Nov 2002 03:23:22 +0000 (19:23 -0800)
This makes it possible for binfmt_misc to optionally preserve the
contents of argv[1].  This is needed for building accurate simulators
which are invoked via binfmt_misc.  I had brought up this patch a while
ago (see URL below) and there was no negative feedback (OK, there was no
feedback at all...  ;-).

The patch is trivial and the new behavior is triggered only if the
letter "P" (for "preserve") is appended to the binfmt_misc registration
string, so it shold be completely safe.

fs/binfmt_misc.c

index 37f9a71851e44fc2cfc6111f39641b293e35e8bc..2816abdc53dc9f963ad822738e34a95c476502fd 100644 (file)
@@ -36,6 +36,7 @@ static LIST_HEAD(entries);
 static int enabled = 1;
 
 enum {Enabled, Magic};
+#define MISC_FMT_PRESERVE_ARGV0 (1<<31)
 
 typedef struct {
        struct list_head list;
@@ -124,7 +125,9 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs)
        bprm->file = NULL;
 
        /* Build args for interpreter */
-       remove_arg_zero(bprm);
+       if (!(fmt->flags & MISC_FMT_PRESERVE_ARGV0)) {
+               remove_arg_zero(bprm);
+       }
        retval = copy_strings_kernel(1, &bprm->filename, bprm);
        if (retval < 0) goto _ret; 
        bprm->argc++;
@@ -290,6 +293,11 @@ static Node *create_entry(const char *buffer, size_t count)
        if (!e->interpreter[0])
                goto Einval;
 
+       if (*p == 'P') {
+               p++;
+               e->flags |= MISC_FMT_PRESERVE_ARGV0;
+       }
+
        if (*p == '\n')
                p++;
        if (p != buf + count)