commiting patch from bug 71:

0000071: patch: implement "--color" option for ls coloring control
1_1_stable
Paul Fox 2005-08-01 19:33:30 +00:00
parent fc2256a6ca
commit 156dc41cbc
3 changed files with 81 additions and 4 deletions

View File

@ -304,11 +304,23 @@ config CONFIG_FEATURE_LS_USERNAME
Allow ls to display username/groupname for files. Allow ls to display username/groupname for files.
config CONFIG_FEATURE_LS_COLOR config CONFIG_FEATURE_LS_COLOR
bool " Use color to identify file types" bool " Allow use of color to identify file types"
default y default y
depends on CONFIG_LS depends on CONFIG_LS
help 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 config CONFIG_MD5SUM
bool "md5sum" bool "md5sum"

View File

@ -60,6 +60,7 @@ enum {
#include <fcntl.h> #include <fcntl.h>
#include <signal.h> #include <signal.h>
#include <termios.h> #include <termios.h>
#include <getopt.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/sysmacros.h> /* major() and minor() */ #include <sys/sysmacros.h> /* major() and minor() */
#include "busybox.h" #include "busybox.h"
@ -164,8 +165,18 @@ enum {
/* colored LS support by JaWi, janwillem.janssen@lxtreme.nl */ /* colored LS support by JaWi, janwillem.janssen@lxtreme.nl */
#ifdef CONFIG_FEATURE_LS_COLOR #ifdef CONFIG_FEATURE_LS_COLOR
static int show_color = 0; 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"\ #define COLOR(mode) ("\000\043\043\043\042\000\043\043"\
"\000\000\044\000\043\000\000\040" [TYPEINDEX(mode)]) "\000\000\044\000\043\000\000\040" [TYPEINDEX(mode)])
#define ATTR(mode) ("\00\00\01\00\01\00\01\00"\ #define ATTR(mode) ("\00\00\01\00\01\00\01\00"\
@ -984,8 +995,7 @@ extern int ls_main(int argc, char **argv)
#endif #endif
#ifdef CONFIG_FEATURE_LS_COLOR #ifdef CONFIG_FEATURE_LS_COLOR
if (isatty(STDOUT_FILENO)) bb_applet_long_options = ls_color_opt;
show_color = 1;
#endif #endif
/* process options */ /* 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 */ /* sort out which command line options take precedence */
#ifdef CONFIG_FEATURE_LS_RECURSIVE #ifdef CONFIG_FEATURE_LS_RECURSIVE
if (all_fmt & DISP_NOLIST) if (all_fmt & DISP_NOLIST)

View File

@ -1602,6 +1602,11 @@
#else #else
# define USAGE_AUTOWIDTH(a) # define USAGE_AUTOWIDTH(a)
#endif #endif
#ifdef CONFIG_FEATURE_LS_COLOR
#define USAGE_LS_COLOR(a) a
#else
#define USAGE_LS_COLOR(a)
#endif
#define ls_trivial_usage \ #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...]" "[-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-a\tdo not hide entries starting with .\n" \
"\t-C\tlist entries by columns\n" \ "\t-C\tlist entries by columns\n" \
USAGE_LS_TIMESTAMPS("\t-c\twith -l: show ctime\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" \ "\t-d\tlist directory entries instead of contents\n" \
USAGE_LS_TIMESTAMPS("\t-e\tlist both full date and full time\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") \ USAGE_LS_FILETYPES("\t-F\tappend indicator (one of */=@|) to entries\n") \