From b457a3e19cd7c0d83dae9681c658dab8317da8df Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Tue, 21 Feb 2006 13:01:00 +0000 Subject: [PATCH] In wall and who, check that the utmp entry isn't stalled, as it is done in w. Apparently with the new pts code stalled entries are printed, when they are not with the BSD ptys. Submitted by: Michal Mertl --- usr.bin/wall/wall.c | 15 +++++++++++++++ usr.bin/who/who.c | 24 +++++++++++++++++++++--- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/usr.bin/wall/wall.c b/usr.bin/wall/wall.c index 35d6463cdd9..1a1d2a38373 100644 --- a/usr.bin/wall/wall.c +++ b/usr.bin/wall/wall.c @@ -81,6 +81,19 @@ int nobanner; int mbufsize; char *mbuf; +static int +ttystat(char *line, int sz) +{ + struct stat sb; + char ttybuf[MAXPATHLEN]; + + (void)snprintf(ttybuf, sizeof(ttybuf), "%s%.*s", _PATH_DEV, sz, line); + if (stat(ttybuf, &sb) == 0) { + return (0); + } else + return (-1); +} + int main(int argc, char *argv[]) { @@ -140,6 +153,8 @@ main(int argc, char *argv[]) while (fread((char *)&utmp, sizeof(utmp), 1, fp) == 1) { if (!utmp.ut_name[0]) continue; + if (ttystat(utmp.ut_line, UT_LINESIZE) != 0) + continue; if (grouplist) { ingroup = 0; strlcpy(username, utmp.ut_name, sizeof(utmp.ut_name)); diff --git a/usr.bin/who/who.c b/usr.bin/who/who.c index 27b68960c2b..f94fcdb3474 100644 --- a/usr.bin/who/who.c +++ b/usr.bin/who/who.c @@ -27,6 +27,7 @@ #include __FBSDID("$FreeBSD$"); +#include #include #include #include @@ -203,14 +204,31 @@ row(struct utmp *ut) putchar('\n'); } +static int +ttystat(char *line, int sz) +{ + struct stat sb; + char ttybuf[MAXPATHLEN]; + + (void)snprintf(ttybuf, sizeof(ttybuf), "%s%.*s", _PATH_DEV, sz, line); + if (stat(ttybuf, &sb) == 0) { + return (0); + } else + return (-1); +} + static void process_utmp(FILE *fp) { struct utmp ut; - while (fread(&ut, sizeof(ut), 1, fp) == 1) - if (*ut.ut_name != '\0') - row(&ut); + while (fread(&ut, sizeof(ut), 1, fp) == 1) { + if (*ut.ut_name == '\0') + continue; + if (ttystat(ut.ut_line, UT_LINESIZE) != 0) + continue; + row(&ut); + } } static void