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

unix.superglobalmegacorp.com

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