summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coreutils/Config.in16
-rw-r--r--coreutils/ls.c63
-rw-r--r--include/usage.h6
3 files changed, 81 insertions, 4 deletions
diff --git a/coreutils/Config.in b/coreutils/Config.in
index 79081e5..49b884b 100644
--- a/coreutils/Config.in
+++ b/coreutils/Config.in
@@ -304,11 +304,23 @@ config CONFIG_FEATURE_LS_USERNAME
Allow ls to display username/groupname for files.
config CONFIG_FEATURE_LS_COLOR
- bool " Use color to identify file types"
+ bool " Allow use of color to identify file types"
default y
depends on CONFIG_LS
help
- Allow ls to use color when displaying files.
+ This enables the --color option to ls.
+
+if CONFIG_FEATURE_LS_COLOR
+ config CONFIG_FEATURE_LS_COLOR_IS_DEFAULT
+ bool " Produce colored ls output by default"
+ default n
+ help
+ Saying yes here will turn coloring on by default,
+ even if no "--color" option is given to the ls command.
+ This is not recommended, since the colors are not
+ configurable, and the output may not be legible on
+ many output screens.
+endif
config CONFIG_MD5SUM
bool "md5sum"
diff --git a/coreutils/ls.c b/coreutils/ls.c
index 92e1509..75d7b1f 100644
--- a/coreutils/ls.c
+++ b/coreutils/ls.c
@@ -60,6 +60,7 @@ enum {
#include <fcntl.h>
#include <signal.h>
#include <termios.h>
+#include <getopt.h>
#include <sys/ioctl.h>
#include <sys/sysmacros.h> /* major() and minor() */
#include "busybox.h"
@@ -164,8 +165,18 @@ enum {
/* colored LS support by JaWi, janwillem.janssen@lxtreme.nl */
#ifdef CONFIG_FEATURE_LS_COLOR
+
static int show_color = 0;
+/* long option entry used only for --color, which has no short option
+ * equivalent. */
+static int got_color_opt;
+static struct option ls_color_opt[] =
+{
+ {"color", optional_argument, &got_color_opt, 1},
+ {NULL, 0, NULL, 0}
+};
+
#define COLOR(mode) ("\000\043\043\043\042\000\043\043"\
"\000\000\044\000\043\000\000\040" [TYPEINDEX(mode)])
#define ATTR(mode) ("\00\00\01\00\01\00\01\00"\
@@ -984,8 +995,7 @@ extern int ls_main(int argc, char **argv)
#endif
#ifdef CONFIG_FEATURE_LS_COLOR
- if (isatty(STDOUT_FILENO))
- show_color = 1;
+ bb_applet_long_options = ls_color_opt;
#endif
/* process options */
@@ -1034,6 +1044,55 @@ extern int ls_main(int argc, char **argv)
}
}
+#ifdef CONFIG_FEATURE_LS_COLOR
+ if (got_color_opt) {
+ /* there is no way for bb_getopt_ulflags() to
+ * return us the argument string for long options
+ * which don't have a short option equivalent.
+ * all we can find out is that the option was
+ * present, and we have to rescan to find the
+ * argument string.
+ */
+ got_color_opt=0;
+ optind = 1;
+ while ((i = getopt_long (argc, argv, ls_options,
+ ls_color_opt, NULL)) >= 0) {
+ if (i != 0) continue;
+ if (got_color_opt) {
+ if (!optarg || strcmp("always", optarg) == 0)
+ show_color = 1;
+ else if (strcmp("never", optarg) == 0)
+ show_color = 0;
+ else if (strcmp("auto", optarg) == 0 &&
+ isatty(STDOUT_FILENO))
+ show_color = 1;
+
+ /* don't break; want to a) pick up repeated
+ * --color options, and b) leave optind
+ * set correctly when we're done.
+ */
+ got_color_opt = 0;
+ }
+ }
+#if CONFIG_FEATURE_LS_COLOR_IS_DEFAULT
+ } else {
+ /* if no option set by user, then this config option
+ * forces "auto", which is what busybox 1.00 and previous
+ * did. however, provide one more "out" for users that
+ * don't want color: if LS_COLOR is set, and is null or
+ * "none" -- then default coloring to "off".
+ */
+ char *p;
+ if ((p = getenv ("LS_COLORS")) != NULL &&
+ (*p == '\0' || (strcmp(p, "none") == 0))) {
+ show_color = 0;
+ } else if (isatty(STDOUT_FILENO)) {
+ show_color = 1;
+ }
+#endif
+ }
+#endif
+
/* sort out which command line options take precedence */
#ifdef CONFIG_FEATURE_LS_RECURSIVE
if (all_fmt & DISP_NOLIST)
diff --git a/include/usage.h b/include/usage.h
index 967ab3f..dad6078 100644
--- a/include/usage.h
+++ b/include/usage.h
@@ -1602,6 +1602,11 @@
#else
# define USAGE_AUTOWIDTH(a)
#endif
+#ifdef CONFIG_FEATURE_LS_COLOR
+ #define USAGE_LS_COLOR(a) a
+#else
+ #define USAGE_LS_COLOR(a)
+#endif
#define ls_trivial_usage \
"[-1Aa" USAGE_LS_TIMESTAMPS("c") "Cd" USAGE_LS_TIMESTAMPS("e") USAGE_LS_FILETYPES("F") "iln" USAGE_LS_FILETYPES("p") USAGE_LS_FOLLOWLINKS("L") USAGE_LS_RECURSIVE("R") USAGE_LS_SORTFILES("rS") "s" USAGE_AUTOWIDTH("T") USAGE_LS_TIMESTAMPS("tu") USAGE_LS_SORTFILES("v") USAGE_AUTOWIDTH("w") "x" USAGE_LS_SORTFILES("X") USAGE_HUMAN_READABLE("h") USAGE_NOT_HUMAN_READABLE("") "k" USAGE_SELINUX("K") "] [filenames...]"
@@ -1613,6 +1618,7 @@
"\t-a\tdo not hide entries starting with .\n" \
"\t-C\tlist entries by columns\n" \
USAGE_LS_TIMESTAMPS("\t-c\twith -l: show ctime\n") \
+ USAGE_LS_COLOR("\t--color[={always,never,auto}]\tto control coloring\n") \
"\t-d\tlist directory entries instead of contents\n" \
USAGE_LS_TIMESTAMPS("\t-e\tlist both full date and full time\n") \
USAGE_LS_FILETYPES("\t-F\tappend indicator (one of */=@|) to entries\n") \