diff options
author | Jim Meyering <jim@meyering.net> | 2007-07-15 22:13:16 +0200 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2007-07-15 22:13:44 +0200 |
commit | 0a744370bb9a58b023d518bf4f32a5cb36929138 (patch) | |
tree | 94501f57b387e79c1f25abe439334d0b7a528ac5 /src/ls.c | |
parent | 065109af86c08ca6b2e2ce1d160b63a38df78188 (diff) | |
download | coreutils-0a744370bb9a58b023d518bf4f32a5cb36929138.tar.xz |
ls --color: Don't stat symlinks when neither ORPHAN nor MISSING attribute has a color.
* src/ls.c (main): Don't set check_symlink_color when C_EXEC is
colored, unless ln=target (aka color_symlink_as_referent) is set.
(gobble_file): Set f->linkok = true also when !check_symlink_color.
http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/10608/focus=10927
Reported by Jeremy Maitin-Shepard.
* tests/strace: New file, contents extracted from...
* tests/mv/atomic: ...here. Source strace.
* tests/ls/stat-free-symlinks: New file. Test for the above.
Use strace to ensure that in this corner case, ls does not call stat.
* tests/ls/Makefile.am (TESTS): Add stat-free-symlinks.
* tests/Makefile.am (EXTRA_DIST): Add strace.
Diffstat (limited to 'src/ls.c')
-rw-r--r-- | src/ls.c | 8 |
1 files changed, 7 insertions, 1 deletions
@@ -1168,7 +1168,7 @@ main (int argc, char **argv) { /* Avoid following symbolic links when possible. */ if (is_colored (C_ORPHAN) - || is_colored (C_EXEC) + || (is_colored (C_EXEC) && color_symlink_as_referent) || (is_colored (C_MISSING) && format == long_format)) check_symlink_color = true; @@ -2713,6 +2713,12 @@ gobble_file (char const *name, enum filetype type, ino_t inode, free (linkname); } + /* When not distinguishing types of symlinks, pretend we know that + it is stat'able, so that it will be colored as a regular symlink, + and not as an orphan. */ + if (S_ISLNK (f->stat.st_mode) && !check_symlink_color) + f->linkok = true; + if (S_ISLNK (f->stat.st_mode)) f->filetype = symbolic_link; else if (S_ISDIR (f->stat.st_mode)) |