home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume26 / sps3 / part03 / printproc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-08  |  7.0 KB  |  269 lines

  1. # ifndef lint
  2. static char SccsId[] =  "@(#)printproc.c    1.4\t12/4/91" ;
  3. # endif
  4.  
  5. # include       "sps.h"
  6. # include       "flags.h"
  7. # ifndef SUNOS40
  8. # include       <h/text.h>
  9. # endif
  10.  
  11. # ifdef SUNOS40
  12. #  ifdef OLDSTATS
  13. #   define OFFSET 8
  14. #  else
  15. #   define OFFSET 3
  16. #  endif
  17. # else
  18. #   define OFFSET 0
  19. # endif
  20.  
  21. /* PRINTPROC - Pretty print a process according to the switches. */
  22. printproc ( p, md )
  23.  
  24. register struct process         *p ;            
  25. int                             md ;            
  26.  
  27. {
  28.     register char           *chp ;
  29. # ifndef SUNOS40
  30.     register struct text    *tp ;
  31. # endif
  32.     register struct hashtab *hp ;
  33.     char                    chbuf[10] ;
  34.     time_t                  time ;
  35.     time_t                  chtime ;
  36. # ifdef BSD42
  37.     time_t                  utime ;
  38.     time_t                  uchtime ;
  39. # endif
  40.     extern short            Lastuid, Lastpgrp ;
  41.     extern struct flags     Flg ;
  42.     char                    *waitingfor() ;
  43.     struct hashtab          *hashuid() ;
  44.     double                  percentmem() ;
  45.  
  46.     /* List tty name and foreground/background/detached information */
  47.     printf( "%2.2s%c", p->pr_tty->l_name,
  48. # ifdef SDETACH
  49.         !p->pr_p.p_pgrp ? ' ' : p->pr_p.p_flag & SDETACH ? '_' :
  50.         p->pr_p.p_pgrp == p->pr_tty->l_pgrp ? '.' : ' ' ) ;
  51. # else
  52.         !p->pr_p.p_pgrp || p->pr_p.p_pgrp != p->pr_tty->l_pgrp ?
  53. # ifdef SPGLDR
  54.         p->pr_p.p_flag & SPGLDR ? '-' :
  55. # endif
  56.            ' ' :
  57. # ifdef SPGLDR
  58.         p->pr_p.p_flag & SPGLDR ? '+' :
  59. # endif
  60.            '.' ) ;
  61. # endif
  62.     hp = hashuid( (int)p->pr_p.p_uid ) ;
  63.     if ( !md  )                             
  64.     {       /* If a top-level process, list the user name */
  65.         if ( hp )
  66.             printf( "%-8.8s ", hp->h_uname ) ;
  67.         else
  68.             printf( "user%-4.4d ", p->pr_p.p_uid ) ;
  69.     }
  70.     else                                    
  71.     {       /* Usually list an asterisk for a child process */
  72.         md = md > 8 ? 8 : md ;
  73.         printf( "%*s%c", md, "",
  74.             p->pr_p.p_pgrp == Lastpgrp ? '|' : '*' ) ;      
  75.         /* But beware of setuid processes */
  76.         md = 8 - md ;
  77.         if ( p->pr_p.p_uid == Lastuid )
  78.             printf( "%-*.*s", md, md, "" ) ;
  79.         else if ( hp )
  80.             printf( "%-*.*s", md, md, hp->h_uname ) ;
  81.         else
  82.         {
  83.             md -= 4 ;
  84.             printf( "user%-*.*d", md, md, p->pr_p.p_uid ) ;
  85.         }
  86.     }
  87.     Lastuid = p->pr_p.p_uid ;
  88.     Lastpgrp = p->pr_p.p_pgrp ;
  89.     if ( Flg.flg_d )                        
  90.     {       /* List disc I/O and paging information */
  91.         if ( !p->pr_upag || p->pr_p.p_stat == SZOMB )
  92.         {
  93.             prcmd( p, 49, -63 ) ;
  94.             return ;
  95.         }
  96.         printf( "%2d %8d+%8d %4d %8d %8D ",
  97.             p->pr_files,
  98. # ifdef BSD42
  99.             p->pr_rself.ru_majflt,
  100.             p->pr_rself.ru_minflt,
  101.             p->pr_rself.ru_nswap,
  102.             p->pr_rself.ru_inblock + p->pr_rself.ru_oublock,
  103.             KBYTES( p->pr_rself.ru_idrss + p->pr_rself.ru_isrss
  104.                 + p->pr_rself.ru_ixrss ) ) ;
  105. # else
  106.             p->pr_vself.vm_majflt,
  107.             p->pr_vself.vm_minflt,
  108.             p->pr_vself.vm_nswap,
  109.             p->pr_vself.vm_inblk + p->pr_vself.vm_oublk,
  110.             KBYTES( (p->pr_vself.vm_idsrss
  111.                 + p->pr_vself.vm_ixrss) / Info.i_hz ) ) ;
  112. # endif
  113.         prcmd( p, 5, -63 ) ;
  114.         return ;
  115.     }
  116.     if ( !Flg.flg_v )                       
  117.     {       /* Not verbose so just list command arguments */
  118.         prcmd( p, 5, -19 ) ;
  119.         return ;
  120.     }
  121.     /* Arrive here if being verbose ; list cpu information */
  122.     switch ( p->pr_p.p_stat )               
  123.     {                                       
  124.         case SSLEEP :
  125.         case SWAIT :
  126.         case SIDL :
  127.             /* Determine why a process should be in a wait state */
  128.             chp = waitingfor( p ) ;
  129.             break ;
  130.         case SRUN :
  131.             chp = "run" ;
  132.             break ;
  133.         case SZOMB :
  134.             chp = "exit" ;
  135.             break ;
  136.         case SSTOP :
  137.             chp = "stop" ;
  138.             break ;
  139.     }
  140.     /* If the process is loaded, list the status information in capitals */
  141. # ifdef ULTRIX40
  142.     printf( "%-6.6s ", p->pr_p.p_sched & SLOAD ?
  143. # else
  144.     printf( "%-6.6s ", p->pr_p.p_flag & SLOAD ?
  145. # endif
  146.         (capitals( chp, chbuf ), chbuf) : chp ) ;
  147.     /* List process flags */
  148. # ifdef ULTRIX40
  149.     printf( "%c%c%c", p->pr_p.p_type & SSYS ? 'U' :
  150.         p->pr_p.p_trace & STRC ? 'T' : ' ',
  151.         p->pr_p.p_vm & SVFORK ? 'V' :
  152.         p->pr_p.p_vm & SPHYSIO ? 'I' : ' ',
  153.         p->pr_p.p_vm & SUANOM ? 'A' :
  154.         p->pr_p.p_vm & SSEQL ? 'S' : ' ' ) ;
  155. # else
  156.     printf( "%c%c%c", p->pr_p.p_flag & SSYS ? 'U' :
  157.         p->pr_p.p_flag & STRC ? 'T' : ' ',
  158.         p->pr_p.p_flag & SVFORK ? 'V' :
  159.         p->pr_p.p_flag & SPHYSIO ? 'I' : ' ',
  160.         p->pr_p.p_flag & SUANOM ? 'A' :
  161.         p->pr_p.p_flag & SSEQL ? 'S' : ' ' ) ;
  162. # endif
  163.     /* List process niceness */
  164.     if ( p->pr_p.p_nice != NZERO )          
  165.         printf( "%3d ", p->pr_p.p_nice - NZERO ) ;
  166.     else
  167.         printf( "    " ) ;
  168.     if ( p->pr_p.p_stat == SZOMB )
  169.     {
  170.         prcmd( p, 41 - OFFSET, OFFSET - 69 ) ;
  171.         return ;
  172.     }                                       
  173. # ifdef SUNOS40
  174. #  ifdef OLDSTATS
  175.     /* List process virtual and real sizes */
  176.     printf( "%4d", KBYTES( p->pr_p.p_dsize + p->pr_p.p_ssize ) ) ;
  177. #  else
  178.     /* List process private and shared virtual and real sizes */
  179.         printf("%4d", KBYTES( p->pr_private ) ) ;
  180.         printf("+%4d", KBYTES( p->pr_shared ) ) ;
  181. #  endif
  182.     printf( " %4d", KBYTES( p->pr_p.p_rssize ) ) ;
  183. # else
  184.     /* List process and text virtual sizes */
  185.     printf( "%4d", KBYTES( p->pr_p.p_dsize + p->pr_p.p_ssize ) ) ;
  186.     if ( tp = p->pr_p.p_textp )
  187.         printf( "+%3d ", KBYTES( tp->x_size ) ) ;
  188.     else
  189.         printf( "     " ) ;
  190.     /* List process and text real sizes */
  191.     printf( "%4d", KBYTES( p->pr_p.p_rssize ) ) ;
  192.     if ( tp )
  193.         printf( "+%3d", KBYTES( tp->x_rssize ) ) ;
  194.     else
  195.         printf( "    " ) ;
  196. # endif
  197.     printf( " %2.0f ", percentmem( p ) ) ;
  198.     /* List information obtained from the upage. This includes the process
  199.        times and command arguments. */
  200.     if ( !p->pr_upag )
  201.     {
  202.         prcmd( p, 20, OFFSET - 69 ) ;
  203.         return ;
  204.     }                                       
  205.     /* List process time information */
  206. # ifdef BSD42
  207.     time   = Flg.flg_q ? p->pr_rself.ru_utime.tv_sec :
  208.          p->pr_rself.ru_utime.tv_sec + p->pr_rself.ru_stime.tv_sec ;
  209.     utime  = Flg.flg_q ? p->pr_rself.ru_utime.tv_usec :
  210.          p->pr_rself.ru_utime.tv_usec + p->pr_rself.ru_stime.tv_usec ;
  211.     chtime = Flg.flg_q ? p->pr_rchild.ru_utime.tv_sec :
  212.          p->pr_rchild.ru_utime.tv_sec + p->pr_rchild.ru_stime.tv_sec ;
  213.     uchtime = Flg.flg_q ? p->pr_rchild.ru_utime.tv_usec :
  214.          p->pr_rchild.ru_utime.tv_usec + p->pr_rchild.ru_stime.tv_usec ;
  215.     prcpu( time, utime ) ;
  216.     if ( chtime != 0L )
  217.     {
  218.         printf( "+" ) ;
  219.         prcpu( chtime, uchtime ) ;
  220.     }
  221. # else
  222.     time   = Flg.flg_q ? p->pr_vself.vm_utime :
  223.          p->pr_vself.vm_utime + p->pr_vself.vm_stime ;
  224.     chtime = Flg.flg_q ? p->pr_vchild.vm_utime :
  225.          p->pr_vchild.vm_utime + p->pr_vchild.vm_stime ;
  226.     prcpu( time ) ;
  227.     if ( chtime != 0L )
  228.     {
  229.         printf( "+" ) ;
  230.         prcpu( chtime ) ;
  231.     }
  232. # endif
  233.     else
  234.         printf( "      " ) ;
  235. # ifdef BSD42
  236.     if ( time || utime )
  237. # else
  238.     if ( time )
  239. # endif
  240. # ifdef SUN
  241.         printf( " %2.0f ", (double)p->pr_p.p_pctcpu * 100.0/FSCALE ) ;
  242. # else
  243. #  ifdef ULTRIX40
  244.         printf( " %2.0f ", p->pr_p.p_pctcpu ) ;
  245. #  else
  246.         printf( " %2.0f ", p->pr_p.p_pctcpu * 100.0 ) ;
  247. #  endif ULTRIX40
  248. # endif SUN
  249.     else
  250.         printf( "    " ) ;
  251.     /* Finally, list the process command arguments. */
  252.     prcmd( p, 5, OFFSET - 69 ) ;                    
  253. }
  254.  
  255. /* CAPITALS - Converts letters in `chp' to upper-case in buffer `buf'. */
  256. capitals ( chp, buf )
  257.  
  258. register char                   *chp ;
  259. register char                   *buf ;
  260.  
  261. {
  262.     while ( *buf = *chp++ )
  263.     {
  264.         if ( 'a' <= *buf && *buf <= 'z' )
  265.             *buf -= 'a' - 'A' ;
  266.         buf++ ;
  267.     }
  268. }
  269.