Apurdue.178
net.bugs.4bsd
utcsrgv!utzoo!decvax!pur-ee!purdue!cak
Tue Feb  2 21:00:25 1982
pstat.c fixes -- you asked for it!
>From cak Tue Feb  2 20:58:48 1982
To: csvax.4bsd-bugs@berkeley
Subject: pstat.c fixes

The following diffs show changes made to allow pstat to operate
properly with post-mortem core dumps. Basically, addresses
were not having the high order bit properly cleared when dealing
with dumps.

It also fixes a recently reported bug about the addresses the -f
option reports.

Please note also that the documentation does not mention the -k
flag which is expected when dealing with core dumps.

Chris Kent

*** /usr/src/cmd/pstat.c        Tue Feb  2 20:51:06 1982
--- /usr/src/cmd/pstat.c.v0     Tue Feb  2 20:20:29 1982
***************
*** 1,8
 static char *sccsid = "@(#)pstat.c    4.9 (Berkeley) 5/7/81";
 /*
  * Print system stuff
-  *
-  *    fixed to handle core dumps properly, 2/2/81 -- cak
  */

 #define mask(x) (x&0377)

--- 1,6 -----
 static char *sccsid = "@(#)pstat.c    4.9 (Berkeley) 5/7/81";
 /*
  * Print system stuff
  */

 #define mask(x) (x&0377)
***************
*** 203,209
       nin = 0;
       ninode = getw(nl[SNINODE].n_value);
       xinode = (struct inode *)calloc(ninode, sizeof (struct inode));
!       kseek(fc, (int)(ainode = (struct inode *)getw(nl[SINODE].n_value)), 0);
       read(fc, xinode, ninode * sizeof(struct inode));
       for (ip = xinode; ip i_count)

--- 201,207 -----
       nin = 0;
       ninode = getw(nl[SNINODE].n_value);
       xinode = (struct inode *)calloc(ninode, sizeof (struct inode));
!       lseek(fc, (int)(ainode = (struct inode *)getw(nl[SINODE].n_value)), 0);
       read(fc, xinode, ninode * sizeof(struct inode));
       for (ip = xinode; ip i_count)
***************
*** 246,252

       if (kflg)
               loc &= 0x7fffffff;
!       kseek(fc, loc, 0);
       read(fc, &word, sizeof (word));
       if (kflg)
               word &= 0x7fffffff;

--- 244,250 -----

       if (kflg)
               loc &= 0x7fffffff;
!       lseek(fc, loc, 0);
       read(fc, &word, sizeof (word));
       if (kflg)
               word &= 0x7fffffff;
***************
*** 271,277
       ntx = 0;
       ntext = getw(nl[SNTEXT].n_value);
       xtext = (struct text *)calloc(ntext, sizeof (struct text));
!       kseek(fc, (int)(atext = (struct text *)getw(nl[STEXT].n_value)), 0);
       read(fc, xtext, ntext * sizeof (struct text));
       for (xp = xtext; xp x_iptr!=NULL)

--- 269,275 -----
       ntx = 0;
       ntext = getw(nl[SNTEXT].n_value);
       xtext = (struct text *)calloc(ntext, sizeof (struct text));
!       lseek(fc, (int)(atext = (struct text *)getw(nl[STEXT].n_value)), 0);
       read(fc, xtext, ntext * sizeof (struct text));
       for (xp = xtext; xp x_iptr!=NULL)
***************
*** 315,321

       nproc = getw(nl[SNPROC].n_value);
       xproc = (struct proc *)calloc(nproc, sizeof (struct proc));
!       kseek(fc, (int)(aproc = (struct proc *)getw(nl[SPROC].n_value)), 0);
       read(fc, xproc, nproc * sizeof (struct proc));
       np = 0;
       for (pp=xproc; pp p_ppid);
               if (kflg)
                       pp->p_addr = (struct pte *)clear((int)pp->p_addr);
!               kseek(fc, (long)(Usrptma+btokmx(pp->p_addr)), 0);
               read(fc, &apte, sizeof(apte));
               printf(" %8x", ctob(apte.pg_pfnum+1) - sizeof(struct pte) * UPAGES);
               printf(" %4x", pp->p_rssize);

--- 344,350 -----
               printf(" %6d", pp->p_ppid);
               if (kflg)
                       pp->p_addr = (struct pte *)clear((int)pp->p_addr);
!               lseek(fc, (long)(Usrptma+btokmx(pp->p_addr)), 0);
               read(fc, &apte, sizeof(apte));
               printf(" %8x", ctob(apte.pg_pfnum+1) - sizeof(struct pte) * UPAGES);
               printf(" %4x", pp->p_rssize);
***************
*** 370,376
       printf("1 cons\n");
       if (kflg)
               nl[SKL].n_value = clear(nl[SKL].n_value);
!       kseek(fc, (long)nl[SKL].n_value, 0);
       read(fc, dz_tty, sizeof(dz_tty[0]));
       mesg = " # RAW CAN OUT   MODE    ADDR   DEL COL  STATE   PGRP DISC\n";
       printf(mesg);

--- 368,374 -----
       printf("1 cons\n");
       if (kflg)
               nl[SKL].n_value = clear(nl[SKL].n_value);
!       lseek(fc, (long)nl[SKL].n_value, 0);
       read(fc, dz_tty, sizeof(dz_tty[0]));
       mesg = " # RAW CAN OUT   MODE    ADDR   DEL COL  STATE   PGRP DISC\n";
       printf(mesg);
***************
*** 381,387
               nl[SNDZ].n_value = clear(nl[SNDZ].n_value);
               nl[SDZ].n_value = clear(nl[SDZ].n_value);
       }
!       kseek(fc, (long)nl[SNDZ].n_value, 0);
       read(fc, &ndz, sizeof(ndz));
       printf("%d dz lines\n", ndz);
       kseek(fc, (long)nl[SDZ].n_value, 0);

--- 379,385 -----
               nl[SNDZ].n_value = clear(nl[SNDZ].n_value);
               nl[SDZ].n_value = clear(nl[SDZ].n_value);
       }
!       lseek(fc, (long)nl[SNDZ].n_value, 0);
       read(fc, &ndz, sizeof(ndz));
       printf("%d dz lines\n", ndz);
       lseek(fc, (long)nl[SDZ].n_value, 0);
***************
*** 384,390
       kseek(fc, (long)nl[SNDZ].n_value, 0);
       read(fc, &ndz, sizeof(ndz));
       printf("%d dz lines\n", ndz);
!       kseek(fc, (long)nl[SDZ].n_value, 0);
       read(fc, dz_tty, sizeof(dz_tty));
       for (tp = dz_tty; tp  sizeof (struct user) */
!       kseek(fc, ubase * NBPG, 0);
       read(fc, &U, sizeof(U));
       printf("pcb");
       ip = (int *)&U.u_pcb;

--- 457,463 -----
       register i, j, *ip;

       /* This wins only if PAGSIZ > sizeof (struct user) */
!       lseek(fc, ubase * NBPG, 0);
       read(fc, &U, sizeof(U));
       printf("pcb");
       ip = (int *)&U.u_pcb;
***************
*** 589,595
       nf = 0;
       nfile = getw(nl[SNFILE].n_value);
       xfile = (struct file *)calloc(nfile, sizeof (struct file));
!       kseek(fc, (int)(afile = (struct file *)getw(nl[SFIL].n_value)), 0);
       read(fc, xfile, nfile * sizeof (struct file));
       for (fp=xfile; fp f_count)

--- 587,593 -----
       nf = 0;
       nfile = getw(nl[SNFILE].n_value);
       xfile = (struct file *)calloc(nfile, sizeof (struct file));
!       lseek(fc, (int)(afile = (struct file *)getw(nl[SFIL].n_value)), 0);
       read(fc, xfile, nfile * sizeof (struct file));
       for (fp=xfile; fp f_count)
***************
*** 600,608
       }
       printf("%d/%d open files\n", nf, nfile);
       printf("   LOC   FLG  CNT   INO    OFFS\n");
!       if(kflg)
!               afile = (struct file *)clear((int)afile);
!       for (fp=xfile,loc=(int)afile; fp f_count==0)
                       continue;
               printf("%8x ", loc);

--- 598,604 -----
       }
       printf("%d/%d open files\n", nf, nfile);
       printf("   LOC   FLG  CNT   INO    OFFS\n");
!       for (fp=xfile,loc=nl[SFIL].n_value; fp f_count==0)
                       continue;
               printf("%8x ", loc);
***************
*** 630,636

       nproc = getw(nl[SNPROC].n_value);
       proc = (struct proc *)calloc(nproc, sizeof (struct proc));
!       kseek(fc, getw(nl[SPROC].n_value), 0);
       read(fc, proc, nproc * sizeof (struct proc));
       nswapmap = getw(nl[SNSWAPMAP].n_value);
       swapmap = (struct map *)calloc(nswapmap, sizeof (struct map));

--- 626,632 -----

       nproc = getw(nl[SNPROC].n_value);
       proc = (struct proc *)calloc(nproc, sizeof (struct proc));
!       lseek(fc, getw(nl[SPROC].n_value), 0);
       read(fc, proc, nproc * sizeof (struct proc));
       nswapmap = getw(nl[SNSWAPMAP].n_value);
       swapmap = (struct map *)calloc(nswapmap, sizeof (struct map));
***************
*** 634,640
       read(fc, proc, nproc * sizeof (struct proc));
       nswapmap = getw(nl[SNSWAPMAP].n_value);
       swapmap = (struct map *)calloc(nswapmap, sizeof (struct map));
!       kseek(fc, getw(nl[SWAPMAP].n_value), 0);
       read(fc, swapmap, nswapmap * sizeof (struct map));
       nswap = getw(nl[SNSWAP].n_value);
       free = 0;

--- 630,636 -----
       read(fc, proc, nproc * sizeof (struct proc));
       nswapmap = getw(nl[SNSWAPMAP].n_value);
       swapmap = (struct map *)calloc(nswapmap, sizeof (struct map));
!       lseek(fc, getw(nl[SWAPMAP].n_value), 0);
       read(fc, swapmap, nswapmap * sizeof (struct map));
       nswap = getw(nl[SNSWAP].n_value);
       free = 0;
***************
*** 643,649
               free += me->m_size;
       ntext = getw(nl[SNTEXT].n_value);
       xtext = (struct text *)calloc(ntext, sizeof (struct text));
!       kseek(fc, getw(nl[STEXT].n_value), 0);
       read(fc, xtext, ntext * sizeof (struct text));
       tused = 0;
       for (xp = xtext; xp m_size;
       ntext = getw(nl[SNTEXT].n_value);
       xtext = (struct text *)calloc(ntext, sizeof (struct text));
!       lseek(fc, getw(nl[STEXT].n_value), 0);
       read(fc, xtext, ntext * sizeof (struct text));
       tused = 0;
       for (xp = xtext; xp
<HR>
This Usenet Oldnews Archive
article may be copied and distributed freely, provided:
<P>
1. There is no money collected for the text(s) of the articles.
<BR>
2. The following notice remains appended to each copy:
<P>
<EM>The Usenet Oldnews Archive: Compilation Copyright&copy 1981, 1996
<BR> Bruce Jones, Henry Spencer, David Wiseman.</EM>
<P>
<HR>
Goto <A HREF="82.02.06_ucf-cs.381_net.4bsd-bugs.html">NEXT</A> article in NET.bugs.4bsd Newsgroup
<BR>Return to <A HREF="NET.bugs.4bsd-index.html">NET.bugs.4bsd index</A>
<BR>Return to the
       <A HREF="../index.html">Usenet Oldnews Archive index</A>
</HTML>

-----------------------------------------------------------------
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.