diff options
author | Olivier Houchard <cognet@FreeBSD.org> | 2006-02-21 13:01:00 +0000 |
---|---|---|
committer | Olivier Houchard <cognet@FreeBSD.org> | 2006-02-21 13:01:00 +0000 |
commit | b457a3e19cd7c0d83dae9681c658dab8317da8df (patch) | |
tree | c5c9433b584c538f5c632cb200b65fd6c24cd3ea /usr.bin | |
parent | c15ff0bc7bccdc23c1124363a8b24f4393b9e3b0 (diff) | |
download | src-b457a3e19cd7c0d83dae9681c658dab8317da8df.tar.gz src-b457a3e19cd7c0d83dae9681c658dab8317da8df.zip |
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 <mime at traveller dot cz>
Notes
Notes:
svn path=/head/; revision=155875
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/wall/wall.c | 15 | ||||
-rw-r--r-- | 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 35d6463cdd91..1a1d2a383732 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 27b68960c2bc..f94fcdb34743 100644 --- a/usr.bin/who/who.c +++ b/usr.bin/who/who.c @@ -27,6 +27,7 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#include <sys/param.h> #include <sys/types.h> #include <sys/ioctl.h> #include <sys/stat.h> @@ -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 |