home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / sps3 / part02 / main.c < prev    next >
C/C++ Source or Header  |  1992-05-08  |  5KB  |  170 lines

  1. # ifndef lint
  2. static char SccsId[] =  "@(#)main.c    1.3\t8/22/91" ;
  3. # endif
  4.  
  5. # include       "sps.h"
  6. # include       "flags.h"
  7. # ifdef KVM
  8. # include       <kvm.h>
  9. # include       <fcntl.h>
  10. # endif KVM
  11. # ifndef SUNOS40
  12. # include       <h/text.h>
  13. # endif
  14. # include       <sys/stat.h>
  15. # include       <stdio.h>
  16.  
  17.  
  18. /* SPS - Show Process Status */
  19.  
  20.  
  21. /* J. R. Ward - Hasler AG, Bern, Switzerland         - 24 May 1985 */
  22. /*                                  - 26 Nov 1986 */
  23. /* J. R. Ward - Olsen & Associates AG,
  24.         Seefeldstrasse 233,
  25.         CH-8008 Zuerich,
  26.             Switzerland                 -  1 Oct 1988 */
  27. /* J. R. Ward - Olsen & Associates AG             - 21 August 1991 */
  28.  
  29. /* <robert@olsen.ch> or <uunet!chx400!olsen!robert> */
  30.  
  31. /* NFS additions and SunOS4.0 support by Alexander Dupuy
  32.    <dupuy@ncs.columbia.edu> and Charlie Kim <cck@cunixc.cc.columbia.edu>.
  33.    Ultrix 2.x support by Rob Lehman at CUCCA.
  34.    SunOS4.1 support by Sakari Jalovaara <sja@sirius.hut.fi>
  35.    Ultrix 4.0 support by Stefano Diomedi <sdiomedi@tecsiel.it> */
  36.  
  37.  
  38. main ( argc,argv )
  39.  
  40. int                             argc ;
  41. char                            **argv ;
  42.  
  43. {
  44.     register struct process *plist ;
  45.     register struct process *process ;
  46. # ifndef SUNOS40
  47.     register struct text    *text ;
  48. # endif
  49.     int                     flinfo ;
  50.     char            *fileinfo, *filesymbol ;
  51.     struct stat        sinfo, ssymbol ;
  52. # ifdef WARNPASSWD
  53.     struct stat        spasswd ;
  54. # endif
  55.     extern struct flags     Flg ;
  56.     extern struct info      Info ;
  57. # ifdef KVM
  58.     extern kvm_t           *Flkvm ;
  59. # else
  60.     extern int              Flmem ;
  61.     extern int              Flkmem ;
  62.     extern int              Flswap ;
  63. # endif
  64.     char                    *getcore() ;
  65.     struct process          *needed(), *mktree() ;
  66.  
  67.     /* Renice as fast as possible for root only (Suggested by Jeff Mogul,
  68.        gregorio!mogul) */
  69.     if ( !getuid() )
  70.         (void)nice( -40 ) ;
  71.     /* Decode the flag arguments */
  72.     flagdecode( argc, argv ) ;      
  73.     /* Determine the terminal width */
  74.     if ( !Flg.flg_w && !Flg.flg_N && !Flg.flg_i )
  75.         termwidth() ;
  76.     /* Open the cpu physical memory, kernel virtual memory and swap device*/
  77. # ifdef KVM
  78.     Flkvm = kvm_open( Flg.flg_s, Flg.flg_k, NULL, O_RDONLY, "sps" ) ;
  79.     if ( !Flkvm )
  80.         /* Error message already output */
  81.         exit( 1 ) ;
  82. # else
  83.     if ( Flg.flg_k )
  84.     {
  85.         Flmem = openfile( Flg.flg_k ) ;
  86.         Flkmem = Flmem ;
  87.     }
  88.     else
  89.     {
  90.         Flmem = openfile( FILE_MEM ) ;
  91.         Flkmem = openfile( FILE_KMEM ) ;
  92.         if ( !Flg.flg_o )
  93.             Flswap = openfile( FILE_SWAP ) ;
  94.     }
  95. # endif
  96.     if ( Flg.flg_i )
  97.     {       /* -i flag for info file initialisation */
  98.         /* sps probably running setgid so patch security hole now */
  99.         (void)setgid( getgid() ) ;
  100.         initialise() ;          
  101.         exit( 0 ) ;
  102.     }
  103.     /* Check that the information file is newer than the symbol and
  104.        password files, suggested by gregorio!mogul */
  105.     fileinfo = Flg.flg_j ? Flg.flg_j : FILE_INFO ;
  106.     filesymbol = Flg.flg_s ? Flg.flg_s : FILE_SYMBOL ;
  107.     flinfo = openfile( fileinfo ) ;
  108.     (void)fstat( flinfo, &sinfo ) ;
  109.     if ( !stat( filesymbol, &ssymbol ) &&
  110.         sinfo.st_mtime < ssymbol.st_mtime )
  111.         fprintf( stderr,
  112.            "sps - WARNING: Info file `%s' is older than symbol file `%s'\n",
  113.             fileinfo, filesymbol ) ;
  114. # ifdef WARNPASSWD
  115.     if ( !stat( FILE_PASSWD, &spasswd ) &&
  116.         sinfo.st_mtime < spasswd.st_mtime )
  117.         fprintf( stderr,
  118.            "sps - WARNING: Info file `%s' is older than passwd file `%s'\n",
  119.             fileinfo, FILE_PASSWD ) ;
  120. # endif
  121.     /* Read the information file */
  122.     if ( read( flinfo, (char*)&Info, sizeof( struct info ) )
  123.     != sizeof( struct info ) )
  124.     {
  125.         fprintf( stderr, "sps - Can't read info file `%s'", fileinfo ) ;
  126.         sysperror() ;
  127.     }
  128.     (void)close( flinfo ) ;
  129.     /* Find current tty status */
  130.     ttystatus() ;                   
  131.     /* Now that we know the available ttys, decode the flags */
  132.     flagsetup() ;                   
  133.     process = (struct process*)getcore(Info.i_nproc*sizeof(struct process));
  134. # ifndef SUNOS40
  135.     text = (struct text*)getcore( Info.i_ntext * sizeof( struct text ) ) ;
  136. # endif
  137.     do
  138.     {       /* Read current process status */
  139. # ifdef SUNOS40
  140.         readstatus( process ) ;
  141.         /* Select those processes to be listed */
  142.         plist = needed( process ) ;
  143. # else
  144.         readstatus( process, text ) ;
  145.         /* Select those processes to be listed */
  146.         plist = needed( process, text ) ;
  147. # endif
  148.         /* Form a tree of listed processes */
  149.         plist = mktree( process, plist ) ;
  150.         if ( !Flg.flg_N )
  151.         {       /* Print the processes */
  152.             prheader() ;
  153.             printall( plist, 0 ) ;
  154.         }
  155.         prsummary() ;
  156.         (void)fflush( stdout ) ;
  157.         if ( Flg.flg_r )        
  158.         {       /* If repeating, again get tty status */
  159.             ttystatus() ;
  160.             if ( Flg.flg_rdelay )
  161. # ifdef BSD42
  162.                 sleep( Flg.flg_rdelay ) ;
  163. # else
  164.                 sleep( (int)Flg.flg_rdelay ) ;
  165. # endif
  166.         }
  167.     } while ( Flg.flg_r ) ;
  168.     exit( 0 ) ;
  169. }
  170.