Annotation of 42BSD/ucb/ruptime.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)ruptime.c  4.14 (Berkeley) 83/07/01";
        !             3: #endif
        !             4: 
        !             5: #include <sys/param.h>
        !             6: #include <stdio.h>
        !             7: #include <sys/dir.h>
        !             8: #include "../etc/rwhod/rwhod.h"
        !             9: 
        !            10: DIR    *etc;
        !            11: 
        !            12: #define        NHOSTS  100
        !            13: int    nhosts;
        !            14: struct hs {
        !            15:        struct  whod *hs_wd;
        !            16:        int     hs_nusers;
        !            17: } hs[NHOSTS];
        !            18: struct whod awhod;
        !            19: int    hscmp(), ucmp(), lcmp(), tcmp();
        !            20: 
        !            21: #define        WHDRSIZE        (sizeof (awhod) - sizeof (awhod.wd_we))
        !            22: #define        RWHODIR         "/usr/spool/rwho"
        !            23: 
        !            24: char   *interval();
        !            25: int    now;
        !            26: char   *malloc(), *sprintf();
        !            27: int    aflg;
        !            28: 
        !            29: #define down(h)                (now - (h)->hs_wd->wd_recvtime > 5 * 60)
        !            30: 
        !            31: main(argc, argv)
        !            32:        int argc;
        !            33:        char **argv;
        !            34: {
        !            35:        struct direct *dp;
        !            36:        int f, i, t;
        !            37:        char buf[BUFSIZ]; int cc;
        !            38:        register struct hs *hsp = hs;
        !            39:        register struct whod *wd;
        !            40:        register struct whoent *we;
        !            41:        int maxloadav = 0;
        !            42:        int (*cmp)() = hscmp;
        !            43: 
        !            44:        time(&t);
        !            45:        argc--, argv++;
        !            46: again:
        !            47:        if (argc && !strcmp(*argv, "-a")) {
        !            48:                aflg++;
        !            49:                argc--, argv++;
        !            50:                goto again;
        !            51:        }
        !            52:        if (argc && !strcmp(*argv, "-l")) {
        !            53:                cmp = lcmp;
        !            54:                argc--, argv++;
        !            55:                goto again;
        !            56:        }
        !            57:        if (argc && !strcmp(*argv, "-u")) {
        !            58:                cmp = ucmp;
        !            59:                argc--, argv++;
        !            60:                goto again;
        !            61:        }
        !            62:        if (argc && !strcmp(*argv, "-t")) {
        !            63:                cmp = tcmp;
        !            64:                argc--, argv++;
        !            65:                goto again;
        !            66:        }
        !            67:        if (chdir(RWHODIR) < 0) {
        !            68:                perror(RWHODIR);
        !            69:                exit(1);
        !            70:        }
        !            71:        etc = opendir(".");
        !            72:        if (etc == NULL) {
        !            73:                perror("/etc");
        !            74:                exit(1);
        !            75:        }
        !            76:        while (dp = readdir(etc)) {
        !            77:                if (dp->d_ino == 0)
        !            78:                        continue;
        !            79:                if (strncmp(dp->d_name, "whod.", 5))
        !            80:                        continue;
        !            81:                if (nhosts == NHOSTS) {
        !            82:                        fprintf(stderr, "too many hosts\n");
        !            83:                        exit(1);
        !            84:                }
        !            85:                f = open(dp->d_name, 0);
        !            86:                if (f > 0) {
        !            87:                        cc = read(f, buf, BUFSIZ);
        !            88:                        if (cc >= WHDRSIZE) {
        !            89:                                hsp->hs_wd = (struct whod *)malloc(WHDRSIZE);
        !            90:                                wd = (struct whod *)buf;
        !            91:                                bcopy(buf, hsp->hs_wd, WHDRSIZE);
        !            92:                                hsp->hs_nusers = 0;
        !            93:                                for (i = 0; i < 2; i++)
        !            94:                                        if (wd->wd_loadav[i] > maxloadav)
        !            95:                                                maxloadav = wd->wd_loadav[i];
        !            96:                                we = (struct whoent *)(buf+cc);
        !            97:                                while (--we >= wd->wd_we)
        !            98:                                        if (aflg || we->we_idle < 3600)
        !            99:                                                hsp->hs_nusers++;
        !           100:                                nhosts++; hsp++;
        !           101:                        }
        !           102:                }
        !           103:                (void) close(f);
        !           104:        }
        !           105:        (void) time(&now);
        !           106:        qsort((char *)hs, nhosts, sizeof (hs[0]), cmp);
        !           107:        if (nhosts == 0) {
        !           108:                printf("no hosts!?!\n");
        !           109:                exit(1);
        !           110:        }
        !           111:        for (i = 0; i < nhosts; i++) {
        !           112:                hsp = &hs[i];
        !           113:                if (down(hsp)) {
        !           114:                        printf("%-12.12s%s\n", hsp->hs_wd->wd_hostname,
        !           115:                            interval(now - hsp->hs_wd->wd_recvtime, "down"));
        !           116:                        continue;
        !           117:                }
        !           118:                printf("%-12.12s%s,  %4d user%s  load %*.2f, %*.2f, %*.2f\n",
        !           119:                    hsp->hs_wd->wd_hostname,
        !           120:                    interval(hsp->hs_wd->wd_sendtime -
        !           121:                        hsp->hs_wd->wd_boottime, "  up"),
        !           122:                    hsp->hs_nusers,
        !           123:                    hsp->hs_nusers == 1 ? ", " : "s,",
        !           124:                    maxloadav >= 1000 ? 5 : 4,
        !           125:                        hsp->hs_wd->wd_loadav[0] / 100.0,
        !           126:                    maxloadav >= 1000 ? 5 : 4,
        !           127:                        hsp->hs_wd->wd_loadav[1] / 100.0,
        !           128:                    maxloadav >= 1000 ? 5 : 4,
        !           129:                        hsp->hs_wd->wd_loadav[2] / 100.0);
        !           130:                cfree(hsp->hs_wd);
        !           131:        }
        !           132:        exit(0);
        !           133: }
        !           134: 
        !           135: char *
        !           136: interval(time, updown)
        !           137:        int time;
        !           138:        char *updown;
        !           139: {
        !           140:        static char resbuf[32];
        !           141:        int days, hours, minutes;
        !           142: 
        !           143:        if (time < 0 || time > 3*30*24*60*60) {
        !           144:                (void) sprintf(resbuf, "   %s ??:??", updown);
        !           145:                return (resbuf);
        !           146:        }
        !           147:        minutes = (time + 59) / 60;             /* round to minutes */
        !           148:        hours = minutes / 60; minutes %= 60;
        !           149:        days = hours / 24; hours %= 24;
        !           150:        if (days)
        !           151:                (void) sprintf(resbuf, "%s %2d+%02d:%02d",
        !           152:                    updown, days, hours, minutes);
        !           153:        else
        !           154:                (void) sprintf(resbuf, "%s    %2d:%02d",
        !           155:                    updown, hours, minutes);
        !           156:        return (resbuf);
        !           157: }
        !           158: 
        !           159: hscmp(h1, h2)
        !           160:        struct hs *h1, *h2;
        !           161: {
        !           162: 
        !           163:        return (strcmp(h1->hs_wd->wd_hostname, h2->hs_wd->wd_hostname));
        !           164: }
        !           165: 
        !           166: /*
        !           167:  * Compare according to load average.
        !           168:  */
        !           169: lcmp(h1, h2)
        !           170:        struct hs *h1, *h2;
        !           171: {
        !           172: 
        !           173:        if (down(h1))
        !           174:                if (down(h2))
        !           175:                        return (tcmp(h1, h2));
        !           176:                else
        !           177:                        return (1);
        !           178:        else if (down(h2))
        !           179:                return (-1);
        !           180:        else
        !           181:                return (h2->hs_wd->wd_loadav[0] - h1->hs_wd->wd_loadav[0]);
        !           182: }
        !           183: 
        !           184: /*
        !           185:  * Compare according to number of users.
        !           186:  */
        !           187: ucmp(h1, h2)
        !           188:        struct hs *h1, *h2;
        !           189: {
        !           190: 
        !           191:        if (down(h1))
        !           192:                if (down(h2))
        !           193:                        return (tcmp(h1, h2));
        !           194:                else
        !           195:                        return (1);
        !           196:        else if (down(h2))
        !           197:                return (-1);
        !           198:        else
        !           199:                return (h2->hs_nusers - h1->hs_nusers);
        !           200: }
        !           201: 
        !           202: /*
        !           203:  * Compare according to uptime.
        !           204:  */
        !           205: tcmp(h1, h2)
        !           206:        struct hs *h1, *h2;
        !           207: {
        !           208:        long t1, t2;
        !           209: 
        !           210:        return (
        !           211:                (down(h2) ? h2->hs_wd->wd_recvtime - now
        !           212:                          : h2->hs_wd->wd_sendtime - h2->hs_wd->wd_boottime)
        !           213:                -
        !           214:                (down(h1) ? h1->hs_wd->wd_recvtime - now
        !           215:                          : h1->hs_wd->wd_sendtime - h1->hs_wd->wd_boottime)
        !           216:        );
        !           217: }

unix.superglobalmegacorp.com

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