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

  1. # ifndef lint
  2. static char SccsId[] =  "@(#)filecount.c    1.2\t7/4/90" ;
  3. # endif
  4.  
  5. # include       "sps.h"
  6.  
  7. /* FILECOUNT - Counts the # open files for the current process */
  8. filecount ( p )
  9.  
  10. struct process         *p ;
  11.  
  12. {
  13.     register int            i ;
  14.     register struct file    **f ;
  15.     register int            count ;
  16.     extern union userstate  User ;
  17. # ifdef SUNOS41
  18.     /*
  19.      * The open file list is in User.u_us.u_ofile_arr
  20.      * if User.u_us.u_ofile points to it; otherwise we'll have
  21.      * do it the hard way by reading the list from kmem.
  22.      *
  23.      * Read the comment to u_ofile in /usr/include/sys/user.h.
  24.      */
  25.  
  26.     int            len ;
  27.     static char        *files = 0 ;
  28.     static int         files_len = 0 ;
  29.     extern char        *getcore () ;
  30. # endif SUNOS41
  31.  
  32.  
  33. # ifdef SUNOS41
  34.  
  35. #  ifndef offsetof
  36. #   define offsetof(type,member)    ((long) &(((type *) 0)->member))
  37. #  endif offsetof
  38.  
  39.     if ( (long) User.u_us.u_ofile ==
  40.         (long) p->pr_p.p_uarea + offsetof(struct user, u_ofile_arr[0]) )
  41.         f = &User.u_us.u_ofile_arr[ 0 ] ;
  42.     else
  43.     {
  44.         len = User.u_us.u_lastfile * sizeof (struct file *) ;
  45.         if (len <= 0)
  46.             return 0;
  47.         if (files == 0 || len < files_len)
  48.         {
  49.             if (files != 0)
  50.                 free (files) ;
  51.             files = (char *) getcore(len) ;
  52.             files_len = len ;
  53.         }
  54.         if ( getkmem( (long)User.u_us.u_ofile, (char *)files, len)
  55.         != len )
  56.             return 0 ;
  57.         f = (struct file **)files ;
  58.     }
  59.     count = 0 ;
  60.     for ( i = 0 ; i < User.u_us.u_lastfile ; i++ )
  61.         if ( *f++ )
  62.             count++ ;
  63.     return ( count ) ;
  64. # else SUNOS41
  65.     count = 0 ;
  66.     for ( i = 0, f = User.u_us.u_ofile ; i < NOFILE ; i++ )
  67.         if ( *f++ )
  68.             count++ ;
  69.     return ( count ) ;
  70. # endif SUNOS41
  71. }
  72.