On 2023-10-17 23:54, Parke wrote:
On Tue, Oct 17, 2023 at 10:42 AM Dragan Simic <dsi...@manjaro.org> wrote:
Regarding performing the additional stat() calls on all files, which
currently aren't performed at all in ls(1), but only when $LS_COLORS
tells ls(1) that they should be performed, I'm afraid that dircolors(1)
would be expected to have that in the $LS_COLORS that it produces,
making many users perform the stat() calls they actually don't want or
need.

dircolors.hin, line 75 seems to suggest otherwise (but I could be wrong):

CAPABILITY 00 # file with capability (very expensive to lookup)

Source:
https://github.com/coreutils/coreutils/blob/master/src/dircolors.hin#L75

The following excerpt from src/ls.c shows that some of the coloring options are disabled by default:

 615 static struct bin_str color_indicator[] =
 616   {
617 { LEN_STR_PAIR ("\033[") }, /* lc: Left of color sequence */ 618 { LEN_STR_PAIR ("m") }, /* rc: Right of color sequence */ 619 { 0, nullptr }, /* ec: End color (replaces lc+rs+rc) */ 620 { LEN_STR_PAIR ("0") }, /* rs: Reset to ordinary colors */
 621     { 0, nullptr },                     /* no: Normal */
 622     { 0, nullptr },                     /* fi: File: default */
623 { LEN_STR_PAIR ("01;34") }, /* di: Directory: bright blue */ 624 { LEN_STR_PAIR ("01;36") }, /* ln: Symlink: bright cyan */ 625 { LEN_STR_PAIR ("33") }, /* pi: Pipe: yellow/brown */ 626 { LEN_STR_PAIR ("01;35") }, /* so: Socket: bright magenta */ 627 { LEN_STR_PAIR ("01;33") }, /* bd: Block device: bright yellow */ 628 { LEN_STR_PAIR ("01;33") }, /* cd: Char device: bright yellow */ 629 { 0, nullptr }, /* mi: Missing file: undefined */ 630 { 0, nullptr }, /* or: Orphaned symlink: undefined */ 631 { LEN_STR_PAIR ("01;32") }, /* ex: Executable: bright green */ 632 { LEN_STR_PAIR ("01;35") }, /* do: Door: bright magenta */ 633 { LEN_STR_PAIR ("37;41") }, /* su: setuid: white on red */ 634 { LEN_STR_PAIR ("30;43") }, /* sg: setgid: black on yellow */ 635 { LEN_STR_PAIR ("37;44") }, /* st: sticky: black on blue */ 636 { LEN_STR_PAIR ("34;42") }, /* ow: other-writable: blue on green */ 637 { LEN_STR_PAIR ("30;42") }, /* tw: ow w/ sticky: black on green */ 638 { 0, nullptr }, /* ca: disabled by default */ 639 { 0, nullptr }, /* mh: disabled by default */ 640 { LEN_STR_PAIR ("\033[K") }, /* cl: clear to end of line */
 641   };

However, the dircolors(1) on my system still generates the "ca" (i.e. "C_CAP") entry, for some reason, which led to this confusion.

Maybe having an additional command-line option for ls(1), which
would enable the additional processing, could be an option.

If necessary, an additional command line option would be fine with me.
(I'd just alias it, as I already do with other command line options.)
But I'm not yet convinced that such an additional option is necessary.

It actually isn't necessary, but it would still be needed to investigate why dircolors(1) may behave the way I described it above, because it may cause the new feature to be enabled even when not intended so.

It goes without saying that performing numerous stat() calls would
induce a significant performance penalty, compared with the currently
employed readdir() approach.

I'm confused.  Don't the following (default?) colorizations already
require stat()ing every file and directory?

SETUID 37;41 # file that is setuid (u+s)
SETGID 30;43 # file that is setgid (g+s)
STICKY_OTHER_WRITABLE 30;42 # dir that is sticky and other-writable (+t,o+w)
OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky
STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable
# This is for files with execute permission:
EXEC 01;32

Source:
https://github.com/coreutils/coreutils/blob/master/src/dircolors.hin#L73

You're right, the following excerpt from src/ls.c confirms that:

3429       || (format_needs_type
3430           && (type == unknown || command_line_arg
3431               /* --indicator-style=classify (aka -F)
3432                  requires that we stat each regular file
3433                  to see if it's executable.  */
3434               || (type == normal && (indicator_style == classify
3435 /* This is so that --color ends up 3436 highlighting files with these mode 3437 bits set even when options like -F are 3438 not specified. Note we do a redundant 3439 stat in the very unlikely case where 3440 C_CAP is set but not the others. */
3441                                      || (print_with_color
3442                                          && (is_colored (C_EXEC)
3443 || is_colored (C_SETUID) 3444 || is_colored (C_SETGID) 3445 || is_colored (C_CAP)))
3446                                      )))))

Reply via email to