diff --git a/coreutils/ls.c b/coreutils/ls.c index f2512fb9c..bbc9114d2 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c @@ -145,6 +145,14 @@ static const int SPLIT_SUBDIR = 2; #ifdef CONFIG_FEATURE_LS_FILETYPES #define APPCHAR(mode) ("\0|\0\0/\0\0\0\0\0@\0=\0\0\0" [TYPEINDEX(mode)]) #endif +/* colored LS support by JaWi, janwillem.janssen@lxtreme.nl */ +#ifdef CONFIG_FEATURE_LS_COLOR +static int show_color = 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"\ + "\00\00\01\00\01\00\00\01" [TYPEINDEX(mode)]) +#endif /* * a directory entry and its stat info are stored here @@ -221,6 +229,31 @@ static void newline(void) } } +/*----------------------------------------------------------------------*/ +#ifdef CONFIG_FEATURE_LS_COLOR +static char fgcolor(mode_t mode) +{ + /* Check wheter the file is existing (if so, color it red!) */ + if ( errno == ENOENT ) { + errno = 0; + return '\037'; + } + if ( LIST_EXEC && S_ISREG( mode ) + && ( mode & ( S_IXUSR | S_IXGRP | S_IXOTH ) ) ) + return COLOR(0xF000); /* File is executable ... */ + return COLOR(mode); +} + +/*----------------------------------------------------------------------*/ +static char bgcolor(mode_t mode) +{ + if ( LIST_EXEC && S_ISREG( mode ) + && ( mode & ( S_IXUSR | S_IXGRP | S_IXOTH ) ) ) + return ATTR(0xF000); /* File is executable ... */ + return ATTR(mode); +} +#endif + /*----------------------------------------------------------------------*/ #ifdef CONFIG_FEATURE_LS_FILETYPES static char append_char(mode_t mode) @@ -682,18 +715,41 @@ static int list_single(struct dnode *dn) break; #endif case LIST_FILENAME: +#ifdef CONFIG_FEATURE_LS_COLOR + if (show_color && !lstat(dn->fullname, &info)) { + printf( "\033[%d;%dm", bgcolor(info.st_mode), + fgcolor(info.st_mode) ); + } +#endif printf("%s", dn->name); +#ifdef CONFIG_FEATURE_LS_COLOR + if (show_color) { + printf( "\033[0m" ); + } +#endif column += strlen(dn->name); break; case LIST_SYMLINK: if (S_ISLNK(dn->dstat.st_mode)) { char *lpath = xreadlink(dn->fullname); if (lpath) { - printf(" -> %s", lpath); -#ifdef CONFIG_FEATURE_LS_FILETYPES + printf(" -> "); +#if defined(BB_FEATURE_LS_FILETYPES) || defined(CONFIG_FEATURE_LS_COLOR) if (!stat(dn->fullname, &info)) { append = append_char(info.st_mode); } +#endif +#ifdef CONFIG_FEATURE_LS_COLOR + if (show_color) { + printf( "\033[%d;%dm", bgcolor(info.st_mode), + fgcolor(info.st_mode) ); + } +#endif + printf("%s", lpath); +#ifdef CONFIG_FEATURE_LS_COLOR + if (show_color) { + printf( "\033[0m" ); + } #endif column += strlen(lpath) + 4; free(lpath); @@ -747,6 +803,11 @@ extern int ls_main(int argc, char **argv) #endif nfiles=0; +#ifdef CONFIG_FEATURE_LS_COLOR + if (isatty(fileno(stdout))) + show_color = 1; +#endif + /* process options */ while ((opt = getopt(argc, argv, "1AaCdgilnsx" #ifdef CONFIG_FEATURE_AUTOWIDTH