1: /* $Header:   RCS/loadst.v  Revision 1.1  83/02/09  17:16:53  fen  Rel$ */
   2: /*
   3:  * loadst -- print current time and load statistics.
   4:  *				-- James Gosling @ CMU, May 1981
   5:  *  loadst [ -n ] [ interval ]
   6:  *	07/29/81 jag -- also print info on presence of mail.
   7:  *	05/05/82 jag -- add disk drive utilization statistics.
   8:  */
   9: 
  10: #define NO_SHORTNAMES  /* Do not want config to try to include remap.h */
  11: #include "../src/config.h"
  12: #include <stdio.h>
  13: #include <pwd.h>
  14: 
  15: /* Define two macros KERNEL_FILE (file to find kernel symtab in)
  16:    and LDAV_SYMBOL (symbol name to look for), based on system type.
  17:    Also define NLIST_STRUCT if the type `nlist' is a structure we
  18:    can get from nlist.h; otherwise must use a.out.h and initialize
  19:    with strcpy.  Note that config.h may define NLIST_STRUCT
  20:    for more modrern USG systems.  */
  21: 
  22: #ifdef USG
  23: #ifdef HPUX
  24: #define LDAV_SYMBOL "_avenrun"
  25: #define KERNEL_FILE "/hp-ux"
  26: #define NLIST_STRUCT
  27: #else /* not HPUX */
  28: #define LDAV_SYMBOL "avenrun"
  29: #define KERNEL_FILE "/unix"
  30: #endif /* not HPUX */
  31: #else /* not USG */
  32: #define LDAV_SYMBOL "_avenrun"
  33: #define NLIST_STRUCT
  34: #ifndef KERNEL_FILE
  35: #define KERNEL_FILE "/vmunix"
  36: #endif /* no KERNEL_FILE yet */
  37: #endif /* not USG */
  38: 
  39: 
  40: #ifdef LOAD_AVE_TYPE
  41: #ifndef NLIST_STRUCT
  42: #include <a.out.h>
  43: #else /* NLIST_STRUCT */
  44: #include <nlist.h>
  45: #endif /* NLIST_STRUCT */
  46: #endif /* LOAD_AVE_TYPE */
  47: 
  48: #ifdef USG
  49: #include <time.h>
  50: #include <sys/types.h>
  51: #else /* not USG */
  52: #include <sys/time.h>
  53: #include <sys/param.h>
  54: #ifdef LOAD_AVE_TYPE
  55: #include <sys/dk.h>
  56: #endif /* LOAD_AVE_TYPE */
  57: #endif /* USG */
  58: 
  59: #include <sys/stat.h>
  60: 
  61: /* We don't want Emacs's macro definitions for these USG primitives. */
  62: 
  63: #undef open
  64: #undef read
  65: 
  66: struct tm *localtime ();
  67: 
  68: #ifdef LOAD_AVE_TYPE
  69: #ifndef NLIST_STRUCT
  70: struct nlist nl[2];
  71: #else /* NLIST_STRUCT */
  72: struct nlist nl[] =
  73:   {
  74:     { LDAV_SYMBOL },
  75: #if defined (CPUSTATES) && defined (DK_NDRIVE)
  76: #define X_CPTIME    1
  77:     { "_cp_time" },
  78: #define X_DKXFER    2
  79:     { "_dk_xfer" },
  80: #endif /* have CPUSTATES and DK_NDRIVE */
  81:     { 0 },
  82:   };
  83: #endif /* NLIST_STRUCT */
  84: #endif /* LOAD_AVE_TYPE */
  85: 
  86: #if defined (CPUSTATES) && defined (DK_NDRIVE)
  87: 
  88: struct
  89: {
  90:   long  time[CPUSTATES];
  91:   long  xfer[DK_NDRIVE];
  92: } s, s1;
  93: 
  94: double  etime;
  95: 
  96: #endif /* have CPUSTATES and DK_NDRIVE */
  97: 
  98: int nflag;          /* -n flag -- no newline */
  99: int uflag;          /* -u flag -- user current user ID rather
 100: 				   than login user ID */
 101: int repetition;         /* repetition interval */
 102: 
 103: 
 104: main (argc, argv)
 105: char  **argv;
 106: {
 107:   register int kmem, i;
 108:   char *mail;
 109:   char *user_name;
 110:   struct stat st;
 111: 
 112:   kmem = open ("/dev/kmem", 0);
 113: 
 114: #ifdef LOAD_AVE_TYPE
 115: #ifndef NLIST_STRUCT
 116:   strcpy (nl[0].n_name, LDAV_SYMBOL);
 117:   strcpy (nl[1].n_name, "");
 118: #endif /* not NLIST_STRUCT */
 119: 
 120:   nlist (KERNEL_FILE, nl);
 121: #endif /* LOAD_AVE_TYPE */
 122: 
 123:   while (--argc > 0)
 124:     {
 125:       argv++;
 126:       if (strcmp (*argv, "-n") == 0)
 127:     nflag++;
 128:       else if (strcmp (*argv, "-u") == 0)
 129:     uflag++;
 130:       else
 131:     if ((repetition = atoi (*argv)) <= 0)
 132:       {
 133:         fprintf (stderr, "Bogus argument: %s\n", *argv);
 134:         exit (1);
 135:       }
 136:     }
 137: 
 138:   user_name = uflag ? ((struct passwd *) getpwuid (getuid ())) -> pw_name
 139: #ifdef USG
 140:     : (char *) getenv ("LOGNAME");
 141: #else
 142:     : (char *) getenv ("USER");
 143: #endif
 144: 
 145:   mail = (char *) malloc (strlen (user_name) + 30);
 146: 
 147: #ifdef USG
 148:   sprintf (mail, "/usr/mail/%s", user_name);
 149: #else /* not USG */
 150:   sprintf (mail, "/usr/spool/mail/%s", user_name);
 151: #endif /* not USG */
 152: 
 153:   if (stat (mail, &st) >= 0
 154:       && (st.st_mode & S_IFMT) == S_IFDIR)
 155:     {
 156:       strcat (mail, "/");
 157:       strcat (mail, user_name);
 158:     }
 159: 
 160:   while (1)
 161:     {
 162:       register struct tm *nowt;
 163:       long now;
 164: 
 165:       time (&now);
 166:       nowt = localtime (&now);
 167: 
 168:       printf ("%d:%02d%s ",
 169:           ((nowt->tm_hour + 11) % 12) + 1,
 170:           nowt->tm_min,
 171:           nowt->tm_hour >= 12 ? "pm" : "am");
 172: 
 173: #ifdef LOAD_AVE_TYPE
 174:       if (kmem >= 0)
 175:     {
 176:       LOAD_AVE_TYPE avenrun[3];
 177:       avenrun[0] = 0;
 178:       lseek (kmem, (long) nl[0].n_value, 0);
 179:       read (kmem, avenrun, sizeof (avenrun));
 180:       printf ("%.2f", LOAD_AVE_CVT (avenrun[0]) / 100.0);
 181:     }
 182: #endif /* LOAD_AVE_TYPE */
 183: 
 184:       printf ("%s", (stat (mail, &st) >= 0 && st.st_size) ? " Mail" : "");
 185: 
 186: #if defined (CPUSTATES) && defined (DK_NDRIVE)
 187:       if (kmem >= 0)
 188:     {
 189:       lseek (kmem, (long) nl[X_CPTIME].n_value, 0);
 190:       read (kmem, s.time, sizeof s.time);
 191:       lseek (kmem, (long) nl[X_DKXFER].n_value, 0);
 192:       read (kmem, s.xfer, sizeof s.xfer);
 193:       etime = 0;
 194:       for (i = 0; i < DK_NDRIVE; i++)
 195:         {
 196:           register t = s.xfer[i];
 197:           s.xfer[i] -= s1.xfer[i];
 198:           s1.xfer[i] = t;
 199:         }
 200:       for (i = 0; i < CPUSTATES; i++)
 201:         {
 202:           register t = s.time[i];
 203:           s.time[i] -= s1.time[i];
 204:           s1.time[i] = t;
 205:           etime += s.time[i];
 206:         }
 207:       if (etime == 0.)
 208:         etime = 1.;
 209:       etime /= 60.;
 210: 
 211:       {   register max = s.xfer[0];
 212:           for (i = 1; i < DK_NDRIVE; i++)
 213:         if (s.xfer[i] > max)
 214:           max = s.xfer[i];
 215:           printf ("[%d]", (int) (max / etime + 0.5));
 216:         }
 217:     }
 218: #endif /* have CPUSTATES and DK_NDRIVE */
 219:       if (!nflag)
 220:     putchar ('\n');
 221:       fflush (stdout);
 222:       if (repetition <= 0)
 223:     break;
 224:       sleep (repetition);
 225:     }
 226: }

Defined functions

main defined in line 104; never used

Defined variables

etime defined in line 94; used 6 times
nflag defined in line 98; used 2 times
nl defined in line 72; used 6 times
repetition defined in line 101; used 3 times
uflag defined in line 99; used 2 times

Defined macros

KERNEL_FILE defined in line 35; used 2 times
LDAV_SYMBOL defined in line 32; used 2 times
NLIST_STRUCT defined in line 33; used 3 times
NO_SHORTNAMES defined in line 10; never used
X_CPTIME defined in line 76; used 1 times
X_DKXFER defined in line 78; used 1 times
Last modified: 1986-03-28
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1287
Valid CSS Valid XHTML 1.0 Strict