aboutsummaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorOlivier Houchard <cognet@FreeBSD.org>2006-02-21 13:01:00 +0000
committerOlivier Houchard <cognet@FreeBSD.org>2006-02-21 13:01:00 +0000
commitb457a3e19cd7c0d83dae9681c658dab8317da8df (patch)
treec5c9433b584c538f5c632cb200b65fd6c24cd3ea /usr.bin
parentc15ff0bc7bccdc23c1124363a8b24f4393b9e3b0 (diff)
downloadsrc-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.c15
-rw-r--r--usr.bin/who/who.c24
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