lsscsi: fix xchdir("..") from symlink in /sys/bus/scsi/devices
[oweals/busybox.git] / selinux / chcon.c
index ae87fb5545d469c54d63ddfad157397d997390a5..3ddb2dd46d21bdee59d3c64b79858b7edd8ac62d 100644 (file)
 //config:      depends on SELINUX
 //config:      help
 //config:      Enable support to change the security context of file.
-//config:
-//config:config FEATURE_CHCON_LONG_OPTIONS
-//config:      bool "Enable long options"
-//config:      default y
-//config:      depends on CHCON && LONG_OPTS
 
 //applet:IF_CHCON(APPLET(chcon, BB_DIR_USR_BIN, BB_SUID_DROP))
 
 //usage:#define chcon_trivial_usage
 //usage:       "[OPTIONS] CONTEXT FILE..."
 //usage:       "\n     chcon [OPTIONS] [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE..."
-//usage:       IF_FEATURE_CHCON_LONG_OPTIONS(
+//usage:       IF_LONG_OPTS(
 //usage:       "\n     chcon [OPTIONS] --reference=RFILE FILE..."
 //usage:       )
+//usage:
 //usage:#define chcon_full_usage "\n\n"
 //usage:       "Change the security context of each FILE to CONTEXT\n"
-//usage:       IF_FEATURE_CHCON_LONG_OPTIONS(
-//usage:     "\n       -v,--verbose            Verbose"
-//usage:     "\n       -c,--changes            Report changes made"
-//usage:     "\n       -h,--no-dereference     Affect symlinks instead of their targets"
-//usage:     "\n       -f,--silent,--quiet     Suppress most error messages"
-//usage:     "\n       --reference RFILE       Use RFILE's group instead of using a CONTEXT value"
-//usage:     "\n       -u,--user USER          Set user/role/type/range in the target"
-//usage:     "\n       -r,--role ROLE          security context"
-//usage:     "\n       -t,--type TYPE"
-//usage:     "\n       -l,--range RANGE"
-//usage:     "\n       -R,--recursive          Recurse"
-//usage:       )
-//usage:       IF_NOT_FEATURE_CHCON_LONG_OPTIONS(
 //usage:     "\n       -v      Verbose"
 //usage:     "\n       -c      Report changes made"
 //usage:     "\n       -h      Affect symlinks instead of their targets"
 //usage:     "\n       -f      Suppress most error messages"
+//usage:       IF_LONG_OPTS(
+//usage:     "\n       --reference RFILE Use RFILE's group instead of using a CONTEXT value"
+//usage:       )
 //usage:     "\n       -u USER Set user/role/type/range in the target security context"
 //usage:     "\n       -r ROLE"
 //usage:     "\n       -t TYPE"
 //usage:     "\n       -l RNG"
 //usage:     "\n       -R      Recurse"
-//usage:       )
 
 #include <selinux/context.h>
 
@@ -68,7 +53,7 @@
 #define OPT_TYPE               (1<<6)  /* 't' */
 #define OPT_RANGE              (1<<7)  /* 'l' */
 #define OPT_VERBOSE            (1<<8)  /* 'v' */
-#define OPT_REFERENCE          ((1<<9) * ENABLE_FEATURE_CHCON_LONG_OPTIONS)
+#define OPT_REFERENCE          ((1<<9) * ENABLE_LONG_OPTS)
 #define OPT_COMPONENT_SPECIFIED        (OPT_USER | OPT_ROLE | OPT_TYPE | OPT_RANGE)
 
 static char *user = NULL;
@@ -157,7 +142,7 @@ skip:
        return rc;
 }
 
-#if ENABLE_FEATURE_CHCON_LONG_OPTIONS
+#if ENABLE_LONG_OPTS
 static const char chcon_longopts[] ALIGN1 =
        "recursive\0"      No_argument       "R"
        "changes\0"        No_argument       "c"
@@ -180,20 +165,21 @@ int chcon_main(int argc UNUSED_PARAM, char **argv)
        char *fname;
        int i, errors = 0;
 
-#if ENABLE_FEATURE_CHCON_LONG_OPTIONS
-       applet_long_options = chcon_longopts;
-#endif
-       opt_complementary = "-1"  /* at least 1 param */
-               ":?"  /* error if exclusivity constraints are violated */
-#if ENABLE_FEATURE_CHCON_LONG_OPTIONS
+       getopt32long(argv, "^"
+               "Rchfu:r:t:l:v"
+               "\0"
+               "-1" /* at least 1 arg */
+               ":?" /* error if exclusivity constraints are violated */
+#if ENABLE_LONG_OPTS
                ":\xff--urtl:u--\xff:r--\xff:t--\xff:l--\xff"
 #endif
-               ":f--v:v--f";  /* 'verbose' and 'quiet' are exclusive */
-       getopt32(argv, "Rchfu:r:t:l:v",
-               &user, &role, &type, &range, &reference_file);
+               ":f--v:v--f"  /* 'verbose' and 'quiet' are exclusive */
+               , chcon_longopts,
+               &user, &role, &type, &range, &reference_file
+       );
        argv += optind;
 
-#if ENABLE_FEATURE_CHCON_LONG_OPTIONS
+#if ENABLE_LONG_OPTS
        if (option_mask32 & OPT_REFERENCE) {
                /* FIXME: lgetfilecon() should be used when '-h' is specified.
                 * But current implementation follows the original one. */