diff options
author | Patrick Steinhardt | 2017-07-02 15:42:51 +0200 |
---|---|---|
committer | Denys Vlasenko | 2017-07-04 17:15:32 +0200 |
commit | 6a3bcf340aa9d7defc86f21d75fd9412c5b9f427 (patch) | |
tree | ef070f39c9d47dd7abae691b74d6da25b3de97c8 | |
parent | d253b557a338c5fe27e8f5e55540db07e7842fc4 (diff) | |
download | busybox-6a3bcf340aa9d7defc86f21d75fd9412c5b9f427.zip busybox-6a3bcf340aa9d7defc86f21d75fd9412c5b9f427.tar.gz |
setpriv: prepare option parsing logic for additional opts
The current option parsing logic of setpriv only supports the case where
we want to execute a sub-program and have at most one argument. Refactor
handling of options to solve these shortcomings to make it easy to
support 'setpriv --dump', which does not accept any additional
arguments, as well as the case where additional options are passed to
setpriv. This is done by handling 'argc' ourselves, throwing an error
when no program is specified, as well as introducing an enum for the
different option bitmasks.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | util-linux/setpriv.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/util-linux/setpriv.c b/util-linux/setpriv.c index 686ad45..d15e0d8 100644 --- a/util-linux/setpriv.c +++ b/util-linux/setpriv.c @@ -51,6 +51,12 @@ #define PR_SET_NO_NEW_PRIVS 38 #endif +enum { + OPTBIT_NNP, + + OPT_NNP = (1 << OPTBIT_NNP), +}; + int setpriv_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int setpriv_main(int argc UNUSED_PARAM, char **argv) { @@ -60,15 +66,17 @@ int setpriv_main(int argc UNUSED_PARAM, char **argv) ; int opts; - opt_complementary = "-1"; applet_long_options = setpriv_longopts; opts = getopt32(argv, "+"); - if (opts) { + argv += optind; + + if (opts & OPT_NNP) { if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) bb_simple_perror_msg_and_die("prctl: NO_NEW_PRIVS"); } - argv += optind; + if (!argv[0]) + bb_show_usage(); BB_EXECVP_or_die(argv); } |