mount: replace control chars in mountpoint name

For compatibility with coreutils and to avoid complex solutions in
mount output mount replaces control characters with '?'.

Note that the listing mode in mount(8) is in maintenance mode --
findmnt(8) provides more robust and better solutions.

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2012-08-06 12:45:08 +02:00
parent 91f98496f3
commit 5f7c18902f
2 changed files with 27 additions and 8 deletions

View File

@ -115,13 +115,13 @@ options to avoid ambivalent interpretation of the given argument. For example
.B The listing and help.
.RS
Three forms of invocation do not actually mount anything:
.TP
.B "mount \-h"
prints a help message
.TP
.B "mount \-V"
prints a version string
The listing mode is maintained for backward compatibility only.
For more robust and definable output use
.BR findmnt (8),
\fBespecially in your scripts\fP. Note that control characters in the
mountpoint name are replaced with '?'.
.TP
.BR "mount " [ -l "] [" "-t \fItype\fP" ]
lists all mounted filesystems (of type

View File

@ -30,6 +30,7 @@
#include <sys/stat.h>
#include <stdarg.h>
#include <libmount.h>
#include <ctype.h>
#include "nls.h"
#include "c.h"
@ -130,6 +131,22 @@ static void encrypt_pass_release(struct libmnt_context *cxt
munlockall();
}
/*
* Replace control chars with '?' to be compatible with coreutils. For more
* robust solution use findmnt(1) where we use \x?? hex encoding.
*/
static void safe_fputs(const char *data)
{
const char *p;
for (p = data; p && *p; p++) {
if (iscntrl((unsigned char) *p))
fputc('?', stdout);
else
fputc(*p, stdout);
}
}
static void print_all(struct libmnt_context *cxt, char *pattern, int show_label)
{
struct libmnt_table *tb;
@ -157,7 +174,9 @@ static void print_all(struct libmnt_context *cxt, char *pattern, int show_label)
if (!mnt_fs_is_pseudofs(fs))
xsrc = mnt_pretty_path(src, cache);
printf ("%s on %s", xsrc ? xsrc : src, mnt_fs_get_target(fs));
printf ("%s on ", xsrc ? xsrc : src);
safe_fputs(mnt_fs_get_target(fs));
if (type)
printf (" type %s", type);
if (optstr)