Thank you for all your comments.
Please find a new version attached.
2016-02-01 18:15 GMT+01:00 Mike Frysinger <[email protected]>:
> On 01 Feb 2016 18:00, Nicolas CARRIER wrote:
>> When launched as PID 1 and after parsing it's arguments, init wipes all
>
> you'll want to run s/it's/its/ on the commit message and docs you added
> to the help string. "it's" is short for "it is" while "its" is what you
> want here -- the possessive form. because english!
>
>> +//config: retrieved in /proc/1/cmdline on Linux, for example.
>> +
>>
>
> these's no need to add this extra blank line
>
>> +#if !ENABLE_FEATURE_PRESERVE_CMDLINE
>> /* 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);
>> +#endif
>
> we strongly prefer to *not* use CPP when we can do it in C.
> write the code like i posted in the patch to you earlier.
> if (!ENABLE_FEATURE_PRESERVE_CMDLINE) {
> ...
> }
>
> the compiler will optimize it the same way.
> -mike
From 96a7dee821ee6ca3c0ef02dcbfedf3a068144030 Mon Sep 17 00:00:00 2001
From: Nicolas Carrier <[email protected]>
Date: Mon, 1 Feb 2016 18:28:37 +0100
Subject: init: allow to preserve init's command-line
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_PRESERVE_CMDLINE which, if set to Y, 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.
---
init/init.c | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)
diff --git a/init/init.c b/init/init.c
index 2040a59..2424dd7 100644
--- a/init/init.c
+++ b/init/init.c
@@ -102,6 +102,21 @@
//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_PRESERVE_CMDLINE
+//config: bool "Prevent init from altering its command-line after parsing"
+//config: default n
+//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 you set this option to Y, all the arguments including argv[0]
+//config: will be preserved, 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_PRESERVE_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) {
--
2.7.0
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox