mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-02-13 10:52:09 +02:00
who --mesg (-T) can use a more accurate test for TTY writability
Enabled when coreutils is configured with --with-tty-group. Based on a patch written by Piotr Gackiewicz. Details at http://bugzilla.redhat.com/454261 * src/who.c (is_tty_writable): A new function returning true if a TTY device is writable by the group. Additionally it checks the group to be the same as TTY_GROUP_NAME when compiled with --with-tty-group. * m4/jm-macros.m4: Introduce a new configure option --with-tty-group. * NEWS: Mention the change.
This commit is contained in:
committed by
Jim Meyering
parent
0caead1ea0
commit
aad0bde0b5
12
NEWS
12
NEWS
@@ -2,6 +2,18 @@ GNU coreutils NEWS -*- outline -*-
|
||||
|
||||
* Noteworthy changes in release ?.? (????-??-??) [?]
|
||||
|
||||
** New features
|
||||
|
||||
who: the "+/-" --mesg (-T) indicator of whether a user/tty is accepting
|
||||
messages could be incorrectly listed as "+", when in fact, the user was
|
||||
not accepting messages (mesg no). Before, who would examine only the
|
||||
permission bits, and not consider the group of the TTY device file.
|
||||
Thus, if a login tty's group would change somehow e.g., to "root",
|
||||
that would make it unwritable (via write(1)) by normal users, in spite
|
||||
of whatever the permission bits might imply. Now, when configured
|
||||
using the --with-tty-group[=NAME] option, who also compares the group
|
||||
of the TTY device with NAME (or "tty" if no group name is specified).
|
||||
|
||||
|
||||
* Noteworthy changes in release 8.4 (2010-01-13) [stable]
|
||||
|
||||
|
||||
1
THANKS
1
THANKS
@@ -495,6 +495,7 @@ Philippe Schnoebelen Philippe.Schnoebelen@imag.fr
|
||||
Phillip Jones mouse@datastacks.com
|
||||
Piergiorgio Sartor sartor@sony.de
|
||||
Pieter Bowman bowman@math.utah.edu
|
||||
Piotr Gackiewicz gacek@intertele.pl
|
||||
Piotr Kwapulinski kwap@univ.gda.pl
|
||||
Prashant TR tr@eth.net
|
||||
Priit Jõerüüt jemm4jemm@yahoo.com
|
||||
|
||||
@@ -144,6 +144,25 @@ AC_DEFUN([coreutils_MACROS],
|
||||
])
|
||||
|
||||
AC_REQUIRE([AM_LANGINFO_CODESET])
|
||||
|
||||
# Accept configure options: --with-tty-group[=GROUP], --without-tty-group
|
||||
# You can determine the group of a TTY via 'stat --format %G /dev/tty'
|
||||
# Omitting this option is equivalent to using --without-tty-group.
|
||||
AC_ARG_WITH([tty-group],
|
||||
AS_HELP_STRING([--with-tty-group[[[=NAME]]]],
|
||||
[group used by system for TTYs, "tty" when not specified]
|
||||
[ (default: do not rely on any group used for TTYs)]),
|
||||
[tty_group_name=$withval],
|
||||
[tty_group_name=no])
|
||||
|
||||
if test "x$tty_group_name" != xno; then
|
||||
if test "x$tty_group_name" = xyes; then
|
||||
tty_group_name=tty
|
||||
fi
|
||||
AC_MSG_NOTICE([TTY group used by system set to "$tty_group_name"])
|
||||
AC_DEFINE_UNQUOTED([TTY_GROUP_NAME], ["$tty_group_name"],
|
||||
[group used by system for TTYs])
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_CHECK_ALL_HEADERS],
|
||||
|
||||
22
src/who.c
22
src/who.c
@@ -37,6 +37,10 @@
|
||||
#include "hard-locale.h"
|
||||
#include "quote.h"
|
||||
|
||||
#ifdef TTY_GROUP_NAME
|
||||
# include <grp.h>
|
||||
#endif
|
||||
|
||||
/* The official name of this program (e.g., no `g' prefix). */
|
||||
#define PROGRAM_NAME "who"
|
||||
|
||||
@@ -308,6 +312,22 @@ print_line (int userlen, const char *user, const char state,
|
||||
free (x_exitstr);
|
||||
}
|
||||
|
||||
/* Return true if a terminal device given as PSTAT allows other users
|
||||
to send messages to; false otherwise */
|
||||
static bool
|
||||
is_tty_writable (struct stat const *pstat)
|
||||
{
|
||||
#ifdef TTY_GROUP_NAME
|
||||
/* Ensure the group of the TTY device matches TTY_GROUP_NAME, more info at
|
||||
https://bugzilla.redhat.com/454261 */
|
||||
struct group *ttygr = getgrnam (TTY_GROUP_NAME);
|
||||
if (!ttygr || (pstat->st_gid != ttygr->gr_gid))
|
||||
return false;
|
||||
#endif
|
||||
|
||||
return pstat->st_mode & S_IWGRP;
|
||||
}
|
||||
|
||||
/* Send properly parsed USER_PROCESS info to print_line. The most
|
||||
recent boot time is BOOTTIME. */
|
||||
static void
|
||||
@@ -346,7 +366,7 @@ print_user (const STRUCT_UTMP *utmp_ent, time_t boottime)
|
||||
|
||||
if (stat (line, &stats) == 0)
|
||||
{
|
||||
mesg = (stats.st_mode & S_IWGRP) ? '+' : '-';
|
||||
mesg = is_tty_writable (&stats) ? '+' : '-';
|
||||
last_change = stats.st_atime;
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user