Annotation of 43BSD/contrib/emacs/etc/loadst.c, revision 1.1.1.1

1.1       root        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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.