init: make the command-line rewrite optional
authorNicolas Carrier <nicolas.carrier@parrot.com>
Thu, 4 Feb 2016 11:18:01 +0000 (12:18 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 11 Feb 2016 13:23:33 +0000 (14:23 +0100)
When launched as PID 1 and after parsing its arguments, init wipes all
all of them except argv[0] and rewrites argv[0] to contain only "init",
so that its command-line appears solely as "init" in tools such as ps.

This patch adds the FEATURE_INIT_MODIFY_CMDLINE which, if set to n, will
make init preserve all its arguments including argv[0], be they parsed or
ignored.
The original command-line used to launch init can then be retrieved in
/proc/1/cmdline on Linux, for example.

Signed-off-by: Nicolas Carrier <nicolas.carrier@parrot.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
init/init.c

index 2040a59e83536e8949ca48c5c4f47ae5221a78f9..25bfaec8c65731df67c4348031cc8dc1206f1b01 100644 (file)
 //config:
 //config:        Note that on Linux, init attempts to detect serial terminal and
 //config:        sets TERM to "vt102" if one is found.
+//config:
+//config:config FEATURE_INIT_MODIFY_CMDLINE
+//config:      bool "Modify the command-line to \"init\""
+//config:      default y
+//config:      depends on INIT
+//config:      help
+//config:        When launched as PID 1 and after parsing its arguments, init
+//config:        wipes all the arguments but argv[0] and rewrites argv[0] to
+//config:        contain only "init", so that its command-line appears solely as
+//config:        "init" in tools such as ps.
+//config:        If this option is set to Y, init will keep its original behavior,
+//config:        otherwise, all the arguments including argv[0] will be preserved,
+//config:        be they parsed or ignored by init.
+//config:        The original command-line used to launch init can then be
+//config:        retrieved in /proc/1/cmdline on Linux, for example.
 
 //applet:IF_INIT(APPLET(init, BB_DIR_SBIN, BB_SUID_DROP))
 //applet:IF_FEATURE_INITRD(APPLET_ODDNAME(linuxrc, init, BB_DIR_ROOT, BB_SUID_DROP, linuxrc))
@@ -1138,11 +1153,13 @@ int init_main(int argc UNUSED_PARAM, char **argv)
        }
 #endif
 
-       /* Make the command line just say "init"  - thats all, nothing else */
-       strncpy(argv[0], "init", strlen(argv[0]));
-       /* Wipe argv[1]-argv[N] so they don't clutter the ps listing */
-       while (*++argv)
-               nuke_str(*argv);
+       if (ENABLE_FEATURE_INIT_MODIFY_CMDLINE) {
+               /* Make the command line just say "init"  - that's all, nothing else */
+               strncpy(argv[0], "init", strlen(argv[0]));
+               /* Wipe argv[1]-argv[N] so they don't clutter the ps listing */
+               while (*++argv)
+                       nuke_str(*argv);
+       }
 
        /* Set up signal handlers */
        if (!DEBUG_INIT) {