summaryrefslogtreecommitdiff
path: root/src/df.c
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2012-07-13 02:27:26 +0100
committerPádraig Brady <P@draigBrady.com>2012-07-16 02:48:31 +0100
commit3ed70fd559c3fbed8383b50373e6d23d1857dc52 (patch)
tree89b15d9f2f62a6263993183648624b5b57a922f6 /src/df.c
parentac00d23e1a90dc5a8cd0f6de0e61eb401d5089d5 (diff)
downloadcoreutils-3ed70fd559c3fbed8383b50373e6d23d1857dc52.tar.xz
df: don't output control characters in a mount point name
It's awkward to read and problematic for scripts when control characters like '\n' are output. Note other fields are already handled with mbsalign, which converts non printable chars to the replacement char. A caveat to note with that, is the replacement char takes a place in the field and so possibly truncates the field if it was the widest field in the records. Note a more general replacement function, that handles all printable, or non white space characters, would require more sophisticated support for various encodings, and the complexity vs benefit was not deemed beneficial enough at present. Perhaps in future a more general replacement function could be shared between the various utilities. Note <space> is unaffected in any field, which could impact scripts processing the output. However any of the number fields at least could have spaces considering `LANG=fr_FR df -B\'1`, so it's probably best to leave spaces, which also allows scripts to handle mount points with spaces without change. * src/df.c (hide_problematic_chars): Replace control chars with '?'. * tests/df/problematic-chars: Add a new root only test. * tests/Makefile.am: Reference the new test. * NEWS: Mention the fix.
Diffstat (limited to 'src/df.c')
-rw-r--r--src/df.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/df.c b/src/df.c
index 7e30d57f7..5dc3d2dd0 100644
--- a/src/df.c
+++ b/src/df.c
@@ -192,6 +192,23 @@ static struct option const long_options[] =
{NULL, 0, NULL, 0}
};
+/* Replace problematic chars with '?'.
+ Since only control characters are currently considered,
+ this should work in all encodings. */
+
+static char*
+hide_problematic_chars (char *cell)
+{
+ char *p = cell;
+ while (*p)
+ {
+ if (iscntrl (to_uchar (*p)))
+ *p = '?';
+ p++;
+ }
+ return cell;
+}
+
/* Dynamically allocate a row of pointers in TABLE, which
can then be accessed with standard 2D array notation. */
@@ -315,6 +332,8 @@ get_header (void)
if (!cell)
xalloc_die ();
+ hide_problematic_chars (cell);
+
table[nrows-1][field] = cell;
widths[field] = MAX (widths[field], mbswidth (cell, 0));
@@ -661,7 +680,10 @@ get_dev (char const *disk, char const *mount_point,
}
if (cell)
- widths[field] = MAX (widths[field], mbswidth (cell, 0));
+ {
+ hide_problematic_chars (cell);
+ widths[field] = MAX (widths[field], mbswidth (cell, 0));
+ }
table[nrows-1][field] = cell;
}
}