summaryrefslogtreecommitdiffstats
path: root/term-utils/mesg.c
diff options
context:
space:
mode:
authorKarel Zak2019-05-27 13:07:12 +0200
committerKarel Zak2019-05-27 13:07:12 +0200
commit2c864ba8fcf50246920d09feaa2b02f3a3dfd52c (patch)
treee03eda273424729ccd1820ef89fbaa71c79423f0 /term-utils/mesg.c
parentlib/ttyutils: introduce get_terminal_stdfd() (diff)
downloadkernel-qcow2-util-linux-2c864ba8fcf50246920d09feaa2b02f3a3dfd52c.tar.gz
kernel-qcow2-util-linux-2c864ba8fcf50246920d09feaa2b02f3a3dfd52c.tar.xz
kernel-qcow2-util-linux-2c864ba8fcf50246920d09feaa2b02f3a3dfd52c.zip
mesg: avoid 'ttyname failed: Success' message
The ttyname(3) can fail to access /dev/ path, and that will cause function to fail without setting errno value with result of rather confusing error message. Lets start setting stdin permission via /proc when this happens as a go-around, with hope kernel following symlink does not fail. Ok, noted, that hopes of symlink follow working are pretty slim. Based on patch from Sami Kerola <kerolasa@iki.fi>. Reference: https://github.com/lxc/lxd/issues/1724 Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'term-utils/mesg.c')
-rw-r--r--term-utils/mesg.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/term-utils/mesg.c b/term-utils/mesg.c
index 57d53379f..56fb70094 100644
--- a/term-utils/mesg.c
+++ b/term-utils/mesg.c
@@ -59,6 +59,8 @@
#include "nls.h"
#include "c.h"
#include "rpmatch.h"
+#include "ttyutils.h"
+#include "pathnames.h"
/* exit codes */
@@ -90,6 +92,7 @@ int main(int argc, char *argv[])
{
struct stat sb;
char *tty;
+ char ttybuf[sizeof(_PATH_PROC_FDDIR) + sizeof(stringify_value(INT_MAX))];
int ch, fd, verbose = FALSE, ret;
static const struct option longopts[] = {
@@ -121,13 +124,21 @@ int main(int argc, char *argv[])
argc -= optind;
argv += optind;
- if (!isatty(STDERR_FILENO)) {
+ fd = get_terminal_stdfd();
+ if (fd < 0) {
if (verbose)
warnx(_("no tty"));
exit(MESG_EXIT_FAILURE);
}
- if ((tty = ttyname(STDERR_FILENO)) == NULL)
- err(MESG_EXIT_FAILURE, _("ttyname failed"));
+
+ tty = ttyname(fd);
+ if (!tty) {
+ snprintf(ttybuf, sizeof(ttybuf), "%s/%d", _PATH_PROC_FDDIR, fd);
+ tty = ttybuf;
+ if (verbose)
+ warnx(_("ttyname() failed, attempting to go around using: %s"), tty);
+ }
+
if ((fd = open(tty, O_RDONLY)) < 0)
err(MESG_EXIT_FAILURE, _("cannot open %s"), tty);
if (fstat(fd, &sb))