aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coreutils/Config.in7
-rw-r--r--coreutils/chown.c18
2 files changed, 24 insertions, 1 deletions
diff --git a/coreutils/Config.in b/coreutils/Config.in
index 49e285982..1e32e2664 100644
--- a/coreutils/Config.in
+++ b/coreutils/Config.in
@@ -52,6 +52,13 @@ config CHOWN
chown is used to change the user and/or group ownership
of files.
+config FEATURE_CHOWN_LONG_OPTIONS
+ bool "Enable long options"
+ default n
+ depends on CHOWN && LONG_OPTS
+ help
+ Enable use of long options
+
config CHROOT
bool "chroot"
default n
diff --git a/coreutils/chown.c b/coreutils/chown.c
index 2d8e556f0..d29f8252a 100644
--- a/coreutils/chown.c
+++ b/coreutils/chown.c
@@ -8,7 +8,6 @@
*/
/* BB_AUDIT SUSv3 defects - none? */
-/* BB_AUDIT GNU defects - unsupported long options. */
/* http://www.opengroup.org/onlinepubs/007904975/utilities/chown.html */
#include "libbb.h"
@@ -37,6 +36,20 @@
#define BIT_TRAVERSE_TOP (0x20|0x40)
#define OPT_TRAVERSE_TOP (IF_DESKTOP(opt & BIT_TRAVERSE_TOP) IF_NOT_DESKTOP(0))
+#if ENABLE_FEATURE_CHOWN_LONG_OPTIONS
+static const char chown_longopts[] ALIGN1 =
+ "recursive\0" No_argument "R"
+ "dereference\0" No_argument "\xff"
+ "no-dereference\0" No_argument "h"
+# if ENABLE_DESKTOP
+ "changes\0" No_argument "c"
+ "silent\0" No_argument "f"
+ "quiet\0" No_argument "f"
+ "verbose\0" No_argument "v"
+# endif
+ ;
+#endif
+
typedef int (*chown_fptr)(const char *, uid_t, gid_t);
struct param_t {
@@ -78,6 +91,9 @@ int chown_main(int argc UNUSED_PARAM, char **argv)
param.ugid.gid = -1;
param.chown_func = chown;
+#if ENABLE_FEATURE_CHOWN_LONG_OPTIONS
+ applet_long_options = chown_longopts;
+#endif
opt_complementary = "-2";
opt = getopt32(argv, OPT_STR);
argv += optind;