Text File

Apur-phy.259 net.bugs.2bsd utcsrgv!utzoo!decvax!pur-ee!purdue!pur-phy!crl Sat Mar 27 21:23:12 1982 Bug fixes to w.c I have found and fixed a bug in the 'w' program, along with cleaning up a couple of other items. They are:

1) 'w' would add up the times of all processes started on the terminal. Thus, if someone put a process in the back- ground, logged out, and someone else logged on, the job and process times would be incorrect. This was fixed by comparing the uid of the person currently logged on and the real uid of the processes on that tty.

2) Since 2.8 bsd has a loadav call, I replaced the peek into memory to calculate it.

3) Also, since stdout is already buffered, I removed the call to setbuf.

A diff of the changes follow.

Charles LaBrec pur-ee!physics:crl

*** w.c.brk Sat Mar 27 21:00:56 1982 (old version) --- w.c Sat Mar 27 21:07:36 1982 (new " ) *************** *** 15,20 #include <CTYPE.H> #include <UTMP.H> #include <TIME.H> #include <SYS/PARAM.H> #include <SYS/STAT.H> #include <SYS/PROC.H>

--- 15,21 ----- #include <CTYPE.H> #include <UTMP.H> #include <TIME.H> + #include <PWD.H> #include <SYS/PARAM.H> #include <SYS/STAT.H> #include <SYS/PROC.H> *************** *** 33,38 dev_t w_tty; /* tty device of process */ char w_comm[15]; /* user.u_comm, null terminated */ char w_args[ARGWIDTH+1]; /* args if interesting process */ } pr[NPROC];

struct nlist nl[] = {

--- 34,40 ----- dev_t w_tty; /* tty device of process */ char w_comm[15]; /* user.u_comm, null terminated */ char w_args[ARGWIDTH+1]; /* args if interesting process */ + int w_ruid; /* real user id */ } pr[NPROC];

struct nlist nl[] = { *************** *** 58,63 int nswap; int file; dev_t tty; char doing[520]; /* process attached to terminal */ time_t proctime; /* cpu time of process in doing */ short avenrun[3];

--- 60,66 ----- int nswap; int file; dev_t tty; + int uid; char doing[520]; /* process attached to terminal */ time_t proctime; /* cpu time of process in doing */ double load[3]; *************** *** 60,66 dev_t tty; char doing[520]; /* process attached to terminal */ time_t proctime; /* cpu time of process in doing */ - short avenrun[3]; double load[3];

#define DIV60(t) ((t+30)/60) /* x/60 rounded */

--- 63,68 ----- int uid; char doing[520]; /* process attached to terminal */ time_t proctime; /* cpu time of process in doing */ double load[3];

#define DIV60(t) ((t+30)/60) /* x/60 rounded */ *************** *** 64,70 double load[3];

#define DIV60(t) ((t+30)/60) /* x/60 rounded */ ! #define TTYEQ (tty == pr[i].w_tty) #define IGINT (1+3*1) /* ignoring both SIGINT & SIGQUIT */

long round();

--- 66,72 ----- double load[3];

#define DIV60(t) ((t+30)/60) /* x/60 rounded */ ! #define TTYEQ (tty == pr[i].w_tty && uid == pr[i].w_ruid) #define IGINT (1+3*1) /* ignoring both SIGINT & SIGQUIT */

long round(); *************** *** 75,80 char *getptr(); FILE *popen(); struct tm *localtime();

int debug; /* true if -d flag: debugging output */ int header = 1; /* true if -h flag: don't print heading */

--- 77,83 ----- char *getptr(); FILE *popen(); struct tm *localtime(); + struct passwd *getpwnam();

int debug; /* true if -d flag: debugging output */ int header = 1; /* true if -h flag: don't print heading */ *************** *** 107,113 register int i, j; char *cp; register int curpid, empty; ! char obuf[BUFSIZ];

setbuf(stdout, obuf); login = (argv[0][0] == '-');

--- 110,116 ----- register int i, j; char *cp; register int curpid, empty; ! struct passwd *pwptr;

login = (argv[0][0] == '-'); cp = rindex(argv[0], '/'); *************** *** 109,115 register int curpid, empty; char obuf[BUFSIZ];

- setbuf(stdout, obuf); login = (argv[0][0] == '-'); cp = rindex(argv[0], '/'); firstchar = login ? argv[0][1] : (cp==0) ? argv[0][0] : cp[1];

--- 112,117 ----- register int curpid, empty; struct passwd *pwptr;

login = (argv[0][0] == '-'); cp = rindex(argv[0], '/'); firstchar = login ? argv[0][1] : (cp==0) ? argv[0][0] : cp[1]; *************** *** 212,233 rewind(ut); printf(" %d users", nusers);

! if (nl[X_AVENRUN].n_type > 0) { ! /* ! * Print 1, 5, and 15 minute load averages. ! * (Found by looking in kernel for avenrun). ! */ ! printf(", load average:"); ! lseek(mem, (long)nl[X_AVENRUN].n_value, 0); ! read(mem, avenrun, sizeof(avenrun)); ! for (i = 0; i 0) ! printf(","); ! printf(" %.2f", load[i]); ! } ! } ! printf("\n"); if (firstchar == 'u') exit(0);

--- 214,221 ----- rewind(ut); printf(" %d users", nusers);

! loadav(load); ! printf(", load average: %.2f %.2f %.2f\n", load[0], load[1], load[2]); if (firstchar == 'u') exit(0);

*************** *** 247,252 } if (utmp.ut_name[0] == '\0') continue; /* that tty is free */ if (sel_user && strncmp(utmp.ut_name, sel_user, 8) != 0) continue; /* we wanted only somebody else */

--- 235,243 ----- } if (utmp.ut_name[0] == '\0') continue; /* that tty is free */ + if ((pwptr = getpwnam(utmp.ut_name)) == NULL ) + continue; /* can't figure out who's on it */ + uid = pwptr->pw_uid; if (sel_user && strncmp(utmp.ut_name, sel_user, 8) != 0) continue; /* we wanted only somebody else */

*************** *** 488,493 pr[np].w_time = up.u_utime + up.u_stime; pr[np].w_ctime = up.u_cutime + up.u_cstime; pr[np].w_tty = up.u_ttyd; up.u_comm[14] = 0; /* Bug: This bombs next field. */ strcpy(pr[np].w_comm, up.u_comm); /*

--- 479,485 ----- pr[np].w_time = up.u_utime + up.u_stime; pr[np].w_ctime = up.u_cutime + up.u_cstime; pr[np].w_tty = up.u_ttyd; + pr[np].w_ruid = up.u_ruid; up.u_comm[14] = 0; /* Bug: This bombs next field. */ strcpy(pr[np].w_comm, up.u_comm); /*

----------------------------------------------------------------- gopher://quux.org/ conversion by John Goerzen <jgoerzen@complete.org> of http://communication.ucsd.edu/A-News/

This Usenet Oldnews Archive article may be copied and distributed freely, provided:

1. There is no money collected for the text(s) of the articles.

2. The following notice remains appended to each copy:

The Usenet Oldnews Archive: Compilation Copyright (C) 1981, 1996 Bruce Jones, Henry Spencer, David Wiseman.