Affect the first of stdin, stdout and stderr that is attached to a terminal.

Write status information to stdout instead of stderr.
Exit status when an error occurs musn't be 1, that is reserved for
indicating that messages are disabled.

These changes bring mesg(1) up to SUSv3 conformance.

Reviewed by:	mike
This commit is contained in:
Tim J. Robbins 2002-05-06 04:33:04 +00:00
parent b23de8a352
commit 17b3efd432
2 changed files with 28 additions and 17 deletions

View File

@ -32,7 +32,7 @@
.\" @(#)mesg.1 8.1 (Berkeley) 6/6/93
.\" $FreeBSD$
.\"
.Dd June 6, 1993
.Dd May 5, 2002
.Dt MESG 1
.Os
.Sh NAME
@ -44,15 +44,17 @@
.Sh DESCRIPTION
The
.Nm
utility is invoked by a users to control write access others
have to the terminal device associated with the standard error
output.
utility is invoked by a user to control write access others
have to a terminal device.
Write access is allowed by default, and programs such as
.Xr talk 1
and
.Xr write 1
may display messages on the terminal.
.Pp
The first terminal device in the sequence of devices associated with standard
input, standard output and standard error is affected.
.Pp
Options available:
.Bl -tag -width flag
.It Cm n
@ -63,8 +65,8 @@ Permits messages to be displayed.
.Pp
If no arguments are given,
.Nm
displays the present message status to the standard error output.
.Pp
displays the present message status to the standard output.
.Sh DIAGNOSTICS
The
.Nm
utility exits with one of the following values:
@ -77,15 +79,22 @@ Messages are not allowed.
.It Li ">1"
An error has occurred.
.El
.Sh FILES
.Bl -tag -width /dev/[pt]ty[pq]? -compact
.It Pa /dev/[pt]ty[pq]?
.El
.Sh COMPATIBILITY
Previous versions of the
.Nm
utility wrote the message status to the standard error output and
affected the terminal attached to standard error without first trying the
standard input or output devices.
.Sh SEE ALSO
.Xr biff 1 ,
.Xr talk 1 ,
.Xr wall 1 ,
.Xr write 1
.Sh STANDARDS
The
.Nm
utility conforms to
.St -p1003.1-2001 .
.Sh HISTORY
A
.Nm

View File

@ -79,28 +79,30 @@ main(argc, argv)
argc -= optind;
argv += optind;
if ((tty = ttyname(STDERR_FILENO)) == NULL)
err(1, "ttyname");
if ((tty = ttyname(STDIN_FILENO)) == NULL &&
(tty = ttyname(STDOUT_FILENO)) == NULL &&
(tty = ttyname(STDERR_FILENO)) == NULL)
err(2, "ttyname");
if (stat(tty, &sb) < 0)
err(1, "%s", tty);
err(2, "%s", tty);
if (*argv == NULL) {
if (sb.st_mode & S_IWGRP) {
(void)fprintf(stderr, "is y\n");
(void)puts("is y");
exit(0);
}
(void)fprintf(stderr, "is n\n");
(void)puts("is n");
exit(1);
}
switch (*argv[0]) {
case 'y':
if (chmod(tty, sb.st_mode | S_IWGRP) < 0)
err(1, "%s", tty);
err(2, "%s", tty);
exit(0);
case 'n':
if (chmod(tty, sb.st_mode & ~S_IWGRP) < 0)
err(1, "%s", tty);
err(2, "%s", tty);
exit(1);
}