diff options
author | Andy Whitcroft <apw@canonical.com> | 2010-06-17 10:46:47 +0100 |
---|---|---|
committer | John Rigby <john.rigby@linaro.org> | 2012-06-20 12:32:49 -0600 |
commit | 11dd4dae2f2f04d92263c22b294c1a3a8b7a24d3 (patch) | |
tree | e9345aeaf92dbefbc65845697c6c03e0cc2b1a04 /kernel | |
parent | 62f864b20c1d0a82534cc0cb39439da3237d8e20 (diff) |
UBUNTU: SAUCE: add option to hand off all kernel parameters to init
BugLink: http://bugs.launchpad.net/bugs/586386
Some init packages such as upstart find having all of the kernel parameters
passed in useful. Currently they have to open up /proc/cmdline and
reparse that to obtain this information. Add a kernel configuration
option to enable passing of all options.
Note, enabling this option will reduce the chances that a fallback from
/sbin/init to /bin/bash or /bin/sh will succeed. Though it should be
noted that there are commonly unknown options present which would already
break this fallback. init=/bin/foo provides explicit control over options
which is unaffected by this change.
Signed-off-by: Andy Whitcroft <apw@canonical.com>
Signed-off-by: Leann Ogasawara <leann.ogasawara@canonical.com>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/params.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/kernel/params.c b/kernel/params.c index f37d8263134..3513e1f902c 100644 --- a/kernel/params.c +++ b/kernel/params.c @@ -89,7 +89,7 @@ static int parse_one(char *param, unsigned num_params, s16 min_level, s16 max_level, - int (*handle_unknown)(char *param, char *val)) + int (*handle_arg)(char *param, char *val, int known)) { unsigned int i; int err; @@ -104,6 +104,14 @@ static int parse_one(char *param, if (!val && params[i].ops->set != param_set_bool && params[i].ops->set != param_set_bint) return -EINVAL; + if (handle_arg) { + int ret; + pr_debug("Valid argument: calling %p\n", + handle_arg); + ret = handle_arg(param, val, 1); + if (ret) + return ret; + } pr_debug("They are equal! Calling %p\n", params[i].ops->set); mutex_lock(¶m_lock); @@ -113,9 +121,9 @@ static int parse_one(char *param, } } - if (handle_unknown) { - pr_debug("Unknown argument: calling %p\n", handle_unknown); - return handle_unknown(param, val); + if (handle_arg) { + pr_debug("Unknown argument: calling %p\n", handle_arg); + return handle_arg(param, val, 0); } pr_debug("Unknown argument `%s'\n", param); @@ -181,7 +189,7 @@ int parse_args(const char *name, unsigned num, s16 min_level, s16 max_level, - int (*unknown)(char *param, char *val)) + int (*handle_arg)(char *param, char *val, int arg)) { char *param, *val; @@ -197,7 +205,7 @@ int parse_args(const char *name, args = next_arg(args, ¶m, &val); irq_was_disabled = irqs_disabled(); ret = parse_one(param, val, params, num, - min_level, max_level, unknown); + min_level, max_level, handle_arg); if (irq_was_disabled && !irqs_disabled()) { printk(KERN_WARNING "parse_args(): option '%s' enabled " "irq's!\n", param); |