mesg: do not print 'ttyname failed' message unless --verbose requested

Lots of people are confused why mesg(1) is priting this message.  Usual
cause seems to be an uninteractive shell trying to turn running 'mesg n'
from a /root/.profile where command invocation is by default on debian based
systems.  This might be rare case when failing silently is better.

[kzak@redhat.com: - add note to the man page
                  - fix if(isatty()) logic]

Reference: https://www.google.com/search?q=mesg+ttyname+failed
Review: https://marc.info/?l=util-linux-ng&m=153319988631233&w=2
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Sami Kerola 2018-08-02 19:35:51 +01:00 committed by Karel Zak
parent c6789d37ea
commit 8dd5832395
2 changed files with 14 additions and 0 deletions

View File

@ -55,6 +55,15 @@ write access by default, at least for the primary login shell. To make
sure your ttys are set the way you want them to be set,
.B mesg
should be executed in your login scripts.
.PP
The
.B mesg
utility silently exits with error status 2 if the current standard error output does
not refer to the terminal. In this case execute
.B mesg
is pointless. The command line option \fB\-\-verbose\fR forces
mesg to print a warning in this situation. This behaviour has been introduced
in version 2.33.
.SH ARGUMENTS
.TP
.B n

View File

@ -121,6 +121,11 @@ int main(int argc, char *argv[])
argc -= optind;
argv += optind;
if (!isatty(STDERR_FILENO)) {
if (verbose)
warnx(_("no tty"));
exit(MESG_EXIT_FAILURE);
}
if ((tty = ttyname(STDERR_FILENO)) == NULL)
err(MESG_EXIT_FAILURE, _("ttyname failed"));
if ((fd = open(tty, O_RDONLY)) < 0)