From 021eeb20207634119a2920f756b6eba04148bbf9 Mon Sep 17 00:00:00 2001 From: rwatson Date: Wed, 2 Apr 2003 20:22:29 +0000 Subject: If stat() on the terminal specified in utmp fails due to ENOENT, don't print a warning, and set the idletime variable for the entry to -1; then pick up the -1 later in sprint() and lprint() and ignore those idle times by printing just whitespace. When third party applications, such as kdm, insert utmp entries, they sometimes use strings like ":0", which can't be stat()'d and currently result in warnings that are not helpful to the user. --- usr.bin/finger/lprint.c | 3 ++- usr.bin/finger/sprint.c | 5 +++++ usr.bin/finger/util.c | 15 ++++++++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) (limited to 'usr.bin/finger') diff --git a/usr.bin/finger/lprint.c b/usr.bin/finger/lprint.c index 16a10a5..d74b21e 100644 --- a/usr.bin/finger/lprint.c +++ b/usr.bin/finger/lprint.c @@ -189,7 +189,8 @@ no_gecos: * idle time. Follow with a comma if a remote login. */ delta = gmtime(&w->idletime); - if (delta->tm_yday || delta->tm_hour || delta->tm_min) { + if (w->idletime != -1 && (delta->tm_yday || + delta->tm_hour || delta->tm_min)) { cpr += printf("%-*s idle ", maxlen - (int)strlen(w->tty) + 1, ","); if (delta->tm_yday > 0) { diff --git a/usr.bin/finger/sprint.c b/usr.bin/finger/sprint.c index 396c86e..51a1919 100644 --- a/usr.bin/finger/sprint.c +++ b/usr.bin/finger/sprint.c @@ -167,6 +167,11 @@ stimeprint(WHERE *w) { struct tm *delta; + if (w->idletime == -1) { + (void)printf(" "); + return; + } + delta = gmtime(&w->idletime); if (!delta->tm_yday) if (!delta->tm_hour) diff --git a/usr.bin/finger/util.c b/usr.bin/finger/util.c index 229d58a..3ac5a06 100644 --- a/usr.bin/finger/util.c +++ b/usr.bin/finger/util.c @@ -314,10 +314,23 @@ find_idle_and_ttywrite(WHERE *w) { struct stat sb; time_t touched; + int error; (void)snprintf(tbuf, sizeof(tbuf), "%s/%s", _PATH_DEV, w->tty); - if (stat(tbuf, &sb) < 0) { + + error = stat(tbuf, &sb); + if (error < 0 && errno == ENOENT) { + /* + * The terminal listed is not actually a terminal (i.e., + * ":0"). This is a failure, so we'll skip printing + * out the idle time, which is non-ideal but better + * than a bogus warning and idle time. + */ + w->idletime = -1; + return; + } else if (error < 0) { warn("%s", tbuf); + w->idletime = -1; return; } touched = sb.st_atime; -- cgit v1.1