]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
ls: handle disabling of colors consistently for all tile types
authorPádraig Brady <P@draigBrady.com>
Mon, 14 Sep 2009 12:37:37 +0000 (13:37 +0100)
committerPádraig Brady <P@draigBrady.com>
Mon, 21 Sep 2009 12:16:44 +0000 (13:16 +0100)
* src/ls.c (print_color_indicator): Use consistent syntax for
all file and directory subtypes, and fall back to the color
of the base type if there is no enabled color for the subtype.
This allows turning off specific colors for o+w dirs for example.
* tests/ls/color-dtype-dir: Add a case to test that turning off
coloring for o+w directories, falls back to standard dir color.
* NEWS: Mention the fix
Introduced by commit ac467814, 2005-09-05,
"Colorize set-user-ID ... files and sticky ... directories."

NEWS
src/ls.c
tests/ls/color-dtype-dir

diff --git a/NEWS b/NEWS
index 0f4481697cceab6e64a8aaf7ec40e3bcb4647325..270aa85b21fdc32d8ff3f42bd219491d040c9274 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,10 @@ GNU coreutils NEWS                                    -*- outline -*-
   to accommodate leap seconds.
   [the bug dates back to the initial implementation]
 
+  ls --color now reverts to the color of a base file type consistently
+  when the color of a more specific type is disabled.
+  [bug introduced in coreutils-5.90]
+
 ** Changes in behavior
 
   id no longer prints SELinux " context=..." when the POSIXLY_CORRECT
index 6d81dab0e8a27ad138ab9fa73487a682e39297a1..10d024bac761380a81c4a2256516d74ff9644d7d 100644 (file)
--- a/src/ls.c
+++ b/src/ls.c
@@ -4103,7 +4103,7 @@ print_color_indicator (const char *name, mode_t mode, int linkok,
                        bool stat_ok, enum filetype filetype,
                        nlink_t nlink)
 {
-  int type;
+  enum indicator_no type;
   struct color_ext_type *ext;  /* Color extension */
   size_t len;                  /* Length of name */
 
@@ -4121,27 +4121,29 @@ print_color_indicator (const char *name, mode_t mode, int linkok,
       if (S_ISREG (mode))
         {
           type = C_FILE;
-          if ((mode & S_ISUID) != 0)
+
+          if ((mode & S_ISUID) != 0 && is_colored (C_SETUID))
             type = C_SETUID;
-          else if ((mode & S_ISGID) != 0)
+          else if ((mode & S_ISGID) != 0 && is_colored (C_SETGID))
             type = C_SETGID;
-          else if (is_colored (C_CAP) && has_capability (name))
+          else if (has_capability (name) && is_colored (C_CAP))
             type = C_CAP;
-          else if ((mode & S_IXUGO) != 0)
+          else if ((mode & S_IXUGO) != 0 && is_colored (C_EXEC))
             type = C_EXEC;
-          else if (is_colored (C_MULTIHARDLINK) && (1 < nlink))
+          else if ((1 < nlink) && is_colored (C_MULTIHARDLINK))
             type = C_MULTIHARDLINK;
         }
       else if (S_ISDIR (mode))
         {
-          if ((mode & S_ISVTX) && (mode & S_IWOTH))
+          type = C_DIR;
+
+          if ((mode & S_ISVTX) && (mode & S_IWOTH)
+              && is_colored (C_STICKY_OTHER_WRITABLE))
             type = C_STICKY_OTHER_WRITABLE;
-          else if ((mode & S_IWOTH) != 0)
+          else if ((mode & S_IWOTH) != 0 && is_colored (C_OTHER_WRITABLE))
             type = C_OTHER_WRITABLE;
-          else if ((mode & S_ISVTX) != 0)
+          else if ((mode & S_ISVTX) != 0 && is_colored (C_STICKY))
             type = C_STICKY;
-          else
-            type = C_DIR;
         }
       else if (S_ISLNK (mode))
         type = ((!linkok && color_indicator[C_ORPHAN].string)
index 5381a668433649659b9bfed1675e28dba8c659ed..3ccf10eb8b273200c01e7039923f5f0acbeae70d 100755 (executable)
@@ -50,4 +50,24 @@ EOF
 
 compare out exp || fail=1
 
+rm exp
+
+# Turn off colors for other-writable dirs and ensure
+# we fall back to the color for standard directories.
+
+LS_COLORS="ow=:" ls --color=always > out || fail=1
+cat -A out > o1 || fail=1
+echo >> o1 || fail=1
+mv o1 out || fail=1
+
+cat <<\EOF > exp || fail=1
+^[[0m^[[01;34md^[[0m$
+^[[01;34mother-writable^[[0m$
+out$
+^[[37;44msticky^[[0m$
+^[[m
+EOF
+
+compare out exp || fail=1
+
 Exit $fail