Date: 24 Mar 2002 20:41:50 -0000 From: Jonathan Hitchcock <vhata@rucus.ru.ac.za> To: FreeBSD-gnats-submit@FreeBSD.org Cc: vhata@rucus.ru.ac.za Subject: bin/36262: [PATCH] Fixed rusers idle-time reporting to use minutes instead of seconds Message-ID: <20020324204150.80506.qmail@shell.rucus.ru.ac.za>
next in thread | raw e-mail | index | archive | help
>Number: 36262 >Category: bin >Synopsis: [PATCH] Fixed rusers idle-time reporting to use minutes instead of seconds >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sun Mar 24 12:50:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Jonathan Hitchcock <vhata@rucus.ru.ac.za> >Release: FreeBSD 4.5-STABLE i386 >Organization: >Environment: System: FreeBSD shell.rucus.ru.ac.za 4.5-STABLE FreeBSD 4.5-STABLE #0: Mon Mar 4 16:55:49 SAST 2002 drs@shell.rucus.ru.ac.za:/usr/build/obj/usr/build/src/sys/RUCUS i386 >Description: The rusers program currently reports the idle-time of a user in days, hours, minutes and seconds. However, the utmp entries work only in minutes - they are not as fine as seconds. Thus, an idle time of 60 hours will be reported as 1:00:00, and an idle time of (60*24) == 1440 hours will be reported as 1 day, 0:00:00. In addition, idle times that are greater than the time logged in are reported - programs like 'w' check this, and only report idle times less than, or equal to, the time logged in. >How-To-Repeat: Request a long list (rusers -l) from a host where a user has been idle for any length of time - this time will be reported in incorrect units, although this is only apparent if the time is longer than 24 hours, and only especially apparent if it is longer than 1440 hours... To test it, the following code will demonstrate the problem: perl -e '$t=`tty`; chomp $t; $i=time-86400; utime $i, $i, $t;' ; w $LOGNAME ; rusers -l `hostname` | grep $LOGNAME Where '86400' is replaced by the idle time desired, of course. >Fix: The patch included with this bug-report removes the "seconds" assumption, working only in days, hours and minutes (but keeping the original output format of rusers, etc). In addition, it compares the idle time reported in the utmp info with the length of time that utmp thinks the user has been logged in, and truncates the idle time if it is longer than the logged-in time. --- rusers.patch begins here --- --- usr.bin/rusers/rusers.c.orig Sun Mar 24 20:16:59 2002 +++ usr.bin/rusers/rusers.c Sun Mar 24 21:31:11 2002 @@ -92,11 +92,12 @@ rusers_reply(char *replyp, struct sockaddr_in *raddrp) { int x, idle; + time_t now; char date[32], idle_time[64], remote[64]; struct hostent *hp; utmpidlearr *up = (utmpidlearr *)replyp; char *host; - int days, hours, minutes, seconds; + int days, hours, minutes; if (search_host(raddrp->sin_addr)) return (0); @@ -120,27 +121,27 @@ sizeof(date) - 1); idle = up->utmpidlearr_val[x].ui_idle; + now = (time(NULL))/60; + if((now - idle) < (up->utmpidlearr_val[x].ui_utmp.ut_time / 60)) { + // idle time is longer than login time + idle = now - (up->utmpidlearr_val[x].ui_utmp.ut_time / 60); + } sprintf(idle_time, " :%02d", idle); if (idle == MAX_INT) strcpy(idle_time, "??"); else if (idle == 0) strcpy(idle_time, ""); else { - seconds = idle; - days = seconds / (60 * 60 * 24); - seconds %= (60 * 60 * 24); - hours = seconds / (60 * 60); - seconds %= (60 * 60); - minutes = seconds / 60; - seconds %= 60; + minutes = idle; + days = minutes / (60 * 24); + minutes %= (60 * 24); + hours = minutes / 60; + minutes %= 60; if (idle > 60) - sprintf(idle_time, "%d:%02d", minutes, seconds); - if (idle >= (60 * 60)) - sprintf(idle_time, "%d:%02d:%02d", - hours, minutes, seconds); - if (idle >= (24 * 60 * 60)) - sprintf(idle_time, "%d days, %d:%02d:%02d", - days, hours, minutes, seconds); + sprintf(idle_time, "%d:%02d", hours, minutes); + if (idle >= (24 * 60)) + sprintf(idle_time, "%d days, %02d:%02d", + days, hours, minutes); } strncpy(remote, up->utmpidlearr_val[x].ui_utmp.ut_host, --- rusers.patch ends here --- >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020324204150.80506.qmail>