Annotation of 43BSDReno/contrib/emacs-18.55/etc/loadst.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * loadst -- print current time and load statistics.
        !             3:  *                             -- James Gosling @ CMU, May 1981
        !             4:  *  loadst [ -n ] [ interval ]
        !             5:  */
        !             6: 
        !             7: #define NO_SHORTNAMES  /* Do not want config to try to include remap.h */
        !             8: #include "../src/config.h"
        !             9: #include <stdio.h>
        !            10: #include <pwd.h>
        !            11: 
        !            12: /* Define two macros KERNEL_FILE (file to find kernel symtab in)
        !            13:    and LDAV_SYMBOL (symbol name to look for), based on system type.
        !            14:    Also define NLIST_STRUCT if the type `nlist' is a structure we
        !            15:    can get from nlist.h; otherwise must use a.out.h and initialize
        !            16:    with strcpy.  Note that config.h may define NLIST_STRUCT
        !            17:    for more modern USG systems.  */
        !            18: 
        !            19: 
        !            20: #ifdef LOAD_AVE_TYPE
        !            21: #ifndef NLIST_STRUCT
        !            22: #include <a.out.h>
        !            23: #else /* NLIST_STRUCT */
        !            24: #include <nlist.h>
        !            25: #endif /* NLIST_STRUCT */
        !            26: #endif /* LOAD_AVE_TYPE */
        !            27: 
        !            28: /* All this serves to #include <param.h> and clean up the consequences.  */
        !            29: #ifdef BSD
        !            30: /* It appears param.h defines BSD and BSD4_3 in 4.3
        !            31:    and is not considerate enough to avoid bombing out
        !            32:    if they are already defined.  */
        !            33: #undef BSD
        !            34: #ifdef BSD4_3
        !            35: #undef BSD4_3
        !            36: #define XBSD4_3 /* XBSD4_3 says BSD4_3 is supposed to be defined.  */
        !            37: #endif
        !            38: #include <sys/param.h>
        !            39: /* Now if BSD or BSD4_3 was defined and is no longer,
        !            40:    define it again.  */
        !            41: #ifndef BSD
        !            42: #define BSD
        !            43: #endif
        !            44: #ifdef XBSD4_3
        !            45: #ifndef BSD4_3
        !            46: #define BSD4_3
        !            47: #endif
        !            48: #endif /* XBSD4_3 */
        !            49: #endif /* BSD */
        !            50: 
        !            51: #ifdef USG
        !            52: #include <time.h>
        !            53: #include <sys/types.h>
        !            54: #else /* not USG */
        !            55: #include <sys/time.h>
        !            56: #ifdef LOAD_AVE_TYPE
        !            57: #include <sys/dkstat.h>
        !            58: #endif /* LOAD_AVE_TYPE */
        !            59: #endif /* USG */
        !            60: 
        !            61: #include <sys/stat.h>
        !            62: 
        !            63: #ifdef BSD
        !            64: #include <sys/ioctl.h>
        !            65: #endif /* BSD */
        !            66: 
        !            67: #ifdef UMAX
        !            68: /*
        !            69:  *  UMAX 4.2, which runs on the Encore Multimax multiprocessor, does not
        !            70:  *  have a /dev/kmem.  Information about the workings of the running kernel
        !            71:  *  can be gathered with inq_stats system calls.
        !            72:  */
        !            73: #include <sys/sysdefs.h>
        !            74: #include <sys/syscall.h>
        !            75: #include <sys/statistics.h>
        !            76: #include <sys/procstats.h>
        !            77: #include <sys/sysstats.h>
        !            78: #endif /* UMAX */
        !            79: 
        !            80: /* We don't want Emacs's macro definitions for these USG primitives. */
        !            81: 
        !            82: #undef open
        !            83: #undef read
        !            84: #undef close
        !            85: 
        !            86: struct tm *localtime ();
        !            87: 
        !            88: #ifndef DKXFER_SYMBOL
        !            89: #define DKXFER_SYMBOL "_dk_xfer"
        !            90: #endif
        !            91: #ifndef CPTIME_SYMBOL
        !            92: #define CPTIME_SYMBOL "_cp_time"
        !            93: #endif
        !            94: 
        !            95: #ifdef LOAD_AVE_TYPE
        !            96: #ifndef NLIST_STRUCT
        !            97: struct nlist nl[2];
        !            98: #else /* NLIST_STRUCT */
        !            99: struct nlist nl[] =
        !           100:   {
        !           101:     { LDAV_SYMBOL },
        !           102: #if defined (CPUSTATES) && defined (DK_NDRIVE)
        !           103: #define        X_CPTIME        1
        !           104:     { CPTIME_SYMBOL },
        !           105: #define        X_DKXFER        2
        !           106:     { DKXFER_SYMBOL },
        !           107: #endif /* have CPUSTATES and DK_NDRIVE */
        !           108:     { 0 },
        !           109:   };
        !           110: #endif /* NLIST_STRUCT */
        !           111: #endif /* LOAD_AVE_TYPE */
        !           112: 
        !           113: #if defined (CPUSTATES) && defined (DK_NDRIVE)
        !           114: 
        !           115: struct
        !           116: {
        !           117:   long time[CPUSTATES];
        !           118:   long xfer[DK_NDRIVE];
        !           119: } s, s1;
        !           120: 
        !           121: double etime;
        !           122: 
        !           123: #endif /* have CPUSTATES and DK_NDRIVE */
        !           124: 
        !           125: int nflag;                     /* -n flag -- no newline */
        !           126: int uflag;                     /* -u flag -- user current user ID rather
        !           127:                                   than login user ID */
        !           128: int repetition;                        /* repetition interval */
        !           129: 
        !           130: #ifdef LOAD_AVE_TYPE
        !           131: LOAD_AVE_TYPE load_average ();
        !           132: #endif /* LOAD_AVE_TYPE */
        !           133: 
        !           134: main (argc, argv)
        !           135:      char  **argv;
        !           136: {
        !           137:   register int kmem, i;
        !           138:   char *mail;
        !           139:   char *user_name;
        !           140:   struct stat st;
        !           141: #ifdef LOAD_AVE_TYPE
        !           142:   LOAD_AVE_TYPE load;
        !           143: #endif /* LOAD_AVE_TYPE */
        !           144: 
        !           145:   kmem = open ("/dev/kmem", 0);
        !           146: 
        !           147: #ifdef LOAD_AVE_TYPE
        !           148: #ifndef NLIST_STRUCT
        !           149:   strcpy (nl[0].n_name, LDAV_SYMBOL);
        !           150:   strcpy (nl[1].n_name, "");
        !           151: #endif /* not NLIST_STRUCT */
        !           152: 
        !           153:   nlist (KERNEL_FILE, nl);
        !           154: #endif /* LOAD_AVE_TYPE */
        !           155: 
        !           156:   while (--argc > 0)
        !           157:     {
        !           158:       argv++;
        !           159:       if (strcmp (*argv, "-n") == 0)
        !           160:        nflag++;
        !           161:       else if (strcmp (*argv, "-u") == 0)
        !           162:        uflag++;
        !           163:       else
        !           164:        if ((repetition = atoi (*argv)) <= 0)
        !           165:          {
        !           166:            fprintf (stderr, "Bogus argument: %s\n", *argv);
        !           167:            exit (1);
        !           168:          }
        !           169:     }
        !           170: 
        !           171:   user_name = uflag ? ((struct passwd *) getpwuid (getuid ())) -> pw_name
        !           172: #ifdef USG
        !           173:     : (char *) getenv ("LOGNAME");
        !           174: #else
        !           175:     : (char *) getenv ("USER");
        !           176: #endif
        !           177: 
        !           178:   mail = (char *) getenv ("MAIL");
        !           179: 
        !           180:   if (mail == 0)
        !           181:     {
        !           182:       mail = (char *) malloc (strlen (user_name) + 30);
        !           183: 
        !           184: #if defined (USG) && ! defined (XENIX)
        !           185:       sprintf (mail, "/usr/mail/%s", user_name);
        !           186: #else /* Xenix, or not USG */
        !           187: #ifdef BSD4_4
        !           188:       sprintf (mail, "/var/mail/%s", user_name);
        !           189: #else
        !           190:       sprintf (mail, "/usr/spool/mail/%s", user_name);
        !           191: #endif
        !           192: #endif /* Xenix, or not USG */
        !           193:     }
        !           194: 
        !           195:   if (stat (mail, &st) >= 0
        !           196:       && (st.st_mode & S_IFMT) == S_IFDIR)
        !           197:     {
        !           198:       strcat (mail, "/");
        !           199:       strcat (mail, user_name);
        !           200:     }
        !           201: 
        !           202:   while (1)
        !           203:     {
        !           204:       register struct tm *nowt;
        !           205:       long now;
        !           206: 
        !           207:       time (&now);
        !           208:       nowt = localtime (&now);
        !           209: 
        !           210:       printf ("%d:%02d%s ",
        !           211:              ((nowt->tm_hour + 11) % 12) + 1,
        !           212:              nowt->tm_min,
        !           213:              nowt->tm_hour >= 12 ? "pm" : "am");
        !           214: 
        !           215: #ifdef LOAD_AVE_TYPE
        !           216:       load = load_average (kmem);
        !           217:       if (load != (LOAD_AVE_TYPE) -1)
        !           218:        printf("%.2f", LOAD_AVE_CVT (load) / 100.0);
        !           219: #endif /* LOAD_AVE_TYPE */
        !           220: 
        !           221:       printf ("%s",
        !           222:              ((stat (mail, &st) >= 0 && st.st_size > 0)
        !           223:               ? " Mail"
        !           224:               : ""));
        !           225: 
        !           226: #if defined (CPUSTATES) && defined (DK_NDRIVE)
        !           227:       if (kmem >= 0)
        !           228:        {
        !           229:          lseek (kmem, (long) nl[X_CPTIME].n_value, 0);
        !           230:          read (kmem, s.time, sizeof s.time);
        !           231:          lseek (kmem, (long) nl[X_DKXFER].n_value, 0);
        !           232:          read (kmem, s.xfer, sizeof s.xfer);
        !           233:          etime = 0;
        !           234:          for (i = 0; i < DK_NDRIVE; i++)
        !           235:            {
        !           236:              register t = s.xfer[i];
        !           237:              s.xfer[i] -= s1.xfer[i];
        !           238:              s1.xfer[i] = t;
        !           239:            }
        !           240: #ifndef BSD4_3
        !           241:          for (i = 0; i < CPUSTATES; i++)
        !           242:            {
        !           243:              register t = s.time[i];
        !           244:              s.time[i] -= s1.time[i];
        !           245:              s1.time[i] = t;
        !           246:              etime += s.time[i];
        !           247:            }
        !           248:          if (etime == 0.)
        !           249:            etime = 1.;
        !           250:          etime /= 60.;
        !           251:         
        !           252: #else
        !           253:          {
        !           254:            static struct timeval tv, tv1;
        !           255:            gettimeofday (&tv, 0);
        !           256:            etime = (tv.tv_sec - tv1.tv_sec)
        !           257:                + (tv.tv_usec - tv1.tv_usec) / 1.0e6;
        !           258:            tv1 = tv;
        !           259:          }
        !           260: #endif
        !           261:          {   register max = s.xfer[0];
        !           262:              for (i = 1; i < DK_NDRIVE; i++)
        !           263:                if (s.xfer[i] > max)
        !           264:                  max = s.xfer[i];
        !           265:              printf ("[%d]", (int) (max / etime + 0.5));
        !           266:            }
        !           267:        }
        !           268: #endif /* have CPUSTATES and DK_NDRIVE */
        !           269:       if (!nflag)
        !           270:        putchar ('\n');
        !           271:       fflush (stdout);
        !           272:       if (repetition <= 0)
        !           273:        break;
        !           274:       sleep (repetition);
        !           275: 
        !           276: #ifdef BSD
        !           277:       /* We are about to loop back and write another unit of output.  */
        !           278:       /* If previous output has not yet been read by Emacs, flush it
        !           279:         so the pty output buffer never gets full and Emacs
        !           280:         can always get the latest update right away.  */
        !           281:       /* ??? Someone should write a USG version of this code!  */
        !           282:       {
        !           283:        int zero = 0;
        !           284: 
        !           285:        ioctl (fileno (stdout), TIOCFLUSH, &zero);
        !           286:       }
        !           287: #endif
        !           288:     }
        !           289: }
        !           290: 
        !           291: #ifdef LOAD_AVE_TYPE
        !           292: 
        !           293: LOAD_AVE_TYPE
        !           294: load_average (kmem)
        !           295:      int kmem;
        !           296: {
        !           297: #ifdef UMAX
        !           298: 
        !           299:   int i, j;
        !           300:   double sum;
        !           301:   struct proc_summary proc_sum_data;
        !           302:   struct stat_descr proc_info;
        !           303:   
        !           304:   proc_info.sd_next = NULL;
        !           305:   proc_info.sd_subsys = SUBSYS_PROC;
        !           306:   proc_info.sd_type = PROCTYPE_SUMMARY;
        !           307:   proc_info.sd_addr = (char *) &proc_sum_data;
        !           308:   proc_info.sd_size = sizeof (struct proc_summary);
        !           309:   proc_info.sd_sizeused = 0;
        !           310:   
        !           311:   if (inq_stats (1, &proc_info) != 0 )
        !           312:     {
        !           313:       perror ("sysline proc summary inq_stats");
        !           314:       exit (1);
        !           315:     }
        !           316:   /*
        !           317:    * Generate current load average.
        !           318:    */
        !           319:   sum = 0;
        !           320:   for (i = proc_sum_data.ps_nrunidx, j = 0; j < 12; j++)
        !           321:     {
        !           322:       sum += proc_sum_data.ps_nrun[i];
        !           323:       if (--i < 0)
        !           324:        i = 179;
        !           325:     }
        !           326:   return sum / 12;
        !           327: 
        !           328: #else /* not UMAX */
        !           329: 
        !           330:   if (kmem >= 0)
        !           331:     {
        !           332:       LOAD_AVE_TYPE avenrun[3];
        !           333:       avenrun[0] = 0;
        !           334:       lseek (kmem, (long) nl[0].n_value, 0);
        !           335:       read (kmem, avenrun, sizeof (avenrun));
        !           336:       return avenrun[0];
        !           337:     }
        !           338:   else
        !           339:     return (LOAD_AVE_TYPE) -1;
        !           340: 
        !           341: #endif /* UMAX */
        !           342: }
        !           343: 
        !           344: #endif /* LOAD_AVE_TYPE */

unix.superglobalmegacorp.com

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