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>
This commit is contained in:
parent
a6d9d23b5f
commit
2c864ba8fc
|
@ -54,6 +54,7 @@ endif
|
||||||
|
|
||||||
if BUILD_MESG
|
if BUILD_MESG
|
||||||
usrbin_exec_PROGRAMS += mesg
|
usrbin_exec_PROGRAMS += mesg
|
||||||
|
mesg_LDADD = $(LDADD) libcommon.la
|
||||||
dist_man_MANS += term-utils/mesg.1
|
dist_man_MANS += term-utils/mesg.1
|
||||||
mesg_SOURCES = term-utils/mesg.c
|
mesg_SOURCES = term-utils/mesg.c
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -58,8 +58,8 @@ should be executed in your login scripts.
|
||||||
.PP
|
.PP
|
||||||
The
|
The
|
||||||
.B mesg
|
.B mesg
|
||||||
utility silently exits with error status 2 if the current standard error output does
|
utility silently exits with error status 2 if not executed on terminal. In this
|
||||||
not refer to the terminal. In this case execute
|
case execute
|
||||||
.B mesg
|
.B mesg
|
||||||
is pointless. The command line option \fB\-\-verbose\fR forces
|
is pointless. The command line option \fB\-\-verbose\fR forces
|
||||||
mesg to print a warning in this situation. This behaviour has been introduced
|
mesg to print a warning in this situation. This behaviour has been introduced
|
||||||
|
|
|
@ -59,6 +59,8 @@
|
||||||
#include "nls.h"
|
#include "nls.h"
|
||||||
#include "c.h"
|
#include "c.h"
|
||||||
#include "rpmatch.h"
|
#include "rpmatch.h"
|
||||||
|
#include "ttyutils.h"
|
||||||
|
#include "pathnames.h"
|
||||||
|
|
||||||
/* exit codes */
|
/* exit codes */
|
||||||
|
|
||||||
|
@ -90,6 +92,7 @@ int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
char *tty;
|
char *tty;
|
||||||
|
char ttybuf[sizeof(_PATH_PROC_FDDIR) + sizeof(stringify_value(INT_MAX))];
|
||||||
int ch, fd, verbose = FALSE, ret;
|
int ch, fd, verbose = FALSE, ret;
|
||||||
|
|
||||||
static const struct option longopts[] = {
|
static const struct option longopts[] = {
|
||||||
|
@ -121,13 +124,21 @@ int main(int argc, char *argv[])
|
||||||
argc -= optind;
|
argc -= optind;
|
||||||
argv += optind;
|
argv += optind;
|
||||||
|
|
||||||
if (!isatty(STDERR_FILENO)) {
|
fd = get_terminal_stdfd();
|
||||||
|
if (fd < 0) {
|
||||||
if (verbose)
|
if (verbose)
|
||||||
warnx(_("no tty"));
|
warnx(_("no tty"));
|
||||||
exit(MESG_EXIT_FAILURE);
|
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)
|
if ((fd = open(tty, O_RDONLY)) < 0)
|
||||||
err(MESG_EXIT_FAILURE, _("cannot open %s"), tty);
|
err(MESG_EXIT_FAILURE, _("cannot open %s"), tty);
|
||||||
if (fstat(fd, &sb))
|
if (fstat(fd, &sb))
|
||||||
|
|
Loading…
Reference in New Issue