home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume23 / sps2 / part03 / selectproc.c < prev    next >
C/C++ Source or Header  |  1991-01-08  |  2KB  |  96 lines

  1. # ifndef lint
  2. static char SccsId[] =  "@(#)selectproc.c    1.2\t6/15/90" ;
  3. # endif
  4.  
  5. # include       "sps.h"
  6. # include       "flags.h"
  7. # ifdef USELOGINUID
  8. # include    <pwd.h>
  9. # endif USELOGINUID
  10.  
  11. /*
  12. ** SELECTPROC - Given a process structure, this procedure decides whether
  13. ** the process is a candidate for printing.
  14. */
  15. selectproc ( p, process, thisuid )
  16.  
  17. register struct process         *p ;            
  18. register struct process         *process ;      
  19. int                thisuid ;
  20.  
  21. {
  22.     register union flaglist *fp ;
  23.     register struct process *pp ;
  24. #ifdef USELOGINUID
  25.     char            *username ;
  26.     struct passwd        *pw ;
  27.     char            *getlogin() ;
  28.     struct passwd        *getpwnam() ;
  29. #endif USELOGINUID
  30.     extern struct flags     Flg ;
  31.  
  32.     /* Flg.flg_AZ is an internal flag set if one of flags `A' to `Z'
  33.        was specified. If this is not set, a process is listed only
  34.        if it or one of its ancestors belongs to the invoking user. */
  35.     if ( !Flg.flg_AZ )
  36.     {
  37. #ifdef USELOGINUID
  38.         thisuid = (username = getlogin())
  39.             && (pw = getpwnam( username )) ? pw->pw_uid : getuid() ;
  40. #endif USELOGINUID
  41.         for ( pp = p ; pp > &process[1] ; pp = pp->pr_pptr )
  42.             if ( thisuid == pp->pr_p.p_uid )
  43.                 return ( 1 ) ;
  44.     }
  45.     if ( Flg.flg_A )
  46.         return ( 1 ) ;
  47.     if ( Flg.flg_P )
  48.         for ( fp = Flg.flg_Plist ; fp->f_pid >= 0 ; fp++ )
  49.             if ( fp->f_pid == p->pr_p.p_pid )
  50.                 return ( 1 ) ;
  51.     if ( Flg.flg_U )
  52.         for ( pp = p ; pp > &process[1] ; pp = pp->pr_pptr )
  53.             for ( fp = Flg.flg_Ulist ; fp->f_uid >= 0 ; fp++ )
  54.                 if ( fp->f_uid == pp->pr_p.p_uid )
  55.                     return ( 1 ) ;
  56.     switch ( p->pr_p.p_stat )
  57.     {
  58.         case SRUN :
  59.             if ( Flg.flg_B )
  60. # ifdef SUNOS40
  61.                 /* Ignore the idle processes */
  62.                 return ( p->pr_p.p_pid != 3
  63.                     && p->pr_p.p_pid != 4 ) ;
  64. # else
  65.                 return ( 1 ) ;
  66. # endif SUNOS40
  67.             break ;
  68.         case SSLEEP :
  69.             if ( Flg.flg_B
  70.             &&   p->pr_p.p_pri < PZERO && p->pr_p.p_pid > MSPID )
  71. # ifdef SUNOS40
  72.                 /* Ignore the idle processes */
  73.                 return ( p->pr_p.p_pid != 3
  74.                     && p->pr_p.p_pid != 4 ) ;
  75. # else
  76.                 return ( 1 ) ;
  77. # endif SUNOS40
  78.         case SWAIT :
  79.         case SIDL :
  80.             if ( Flg.flg_W )
  81.                 return ( 1 ) ;
  82.             break ;
  83.         case SSTOP :
  84.             if ( Flg.flg_S )
  85.                 return ( 1 ) ;
  86.             break ;
  87.         case SZOMB :
  88.             if ( Flg.flg_Z )
  89.                 return ( 1 ) ;
  90.             break ;
  91.         default :
  92.             break ;
  93.     }
  94.     return ( 0 ) ;
  95. }
  96.