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 <[email protected]>
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.