Annotation of researchv10no/cmd/dmesg.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     Suck up system messages
                      3:  *     dmesg
                      4:  *             print current buffer
                      5:  *     dmesg -
                      6:  *             print and update incremental history
                      7:  */
                      8: 
                      9: #include <stdio.h>
                     10: #include <libc.h>
                     11: #include <sys/param.h>
                     12: #include <nlist.h>
                     13: #include <signal.h>
                     14: #include <sys/msgbuf.h>
                     15: 
                     16: long   msgptr;
                     17: struct msgbuf msgbuf;
                     18: char   *msgbufp;
                     19: int    sflg;
                     20: int    wflg;
                     21: 
                     22: struct msgbuf omesg;
                     23: struct nlist nl[2] = {
                     24:        { "_msgbuf" },
                     25:        { 0 }
                     26: };
                     27: 
                     28: #define        BUFFER  "/usr/adm/msgbuf"
                     29: 
                     30: main(argc, argv)
                     31: char **argv;
                     32: {
                     33:        int mem;
                     34:        int timeout();
                     35: 
                     36:        signal(SIGALRM, timeout);
                     37:        alarm(60);
                     38:        if (argc>1 && argv[1][0] == '-') {
                     39:                sflg++;
                     40:                switch (argv[1][1]) {
                     41:                default:                /* ugh */
                     42:                        wflg++;
                     43:                        break;
                     44: 
                     45:                case 'i':
                     46:                        break;
                     47:                }
                     48:                argc--;
                     49:                argv++;
                     50:        }
                     51:        if (sflg)
                     52:                openbuf();
                     53:        sflg = 0;
                     54:        timeout("can't read namelist\n");
                     55:        nlist(argc>2? argv[2]:"/unix", nl);
                     56:        if (nl[0].n_type==0)
                     57:                done("No namelist\n");
                     58:        if ((mem = open((argc>1? argv[1]: "/dev/kmem"), 0)) < 0)
                     59:                done("No /dev/kmem\n");
                     60:        lseek(mem, (long)nl[0].n_value, 0);
                     61:        read(mem, &msgptr, sizeof(msgptr));
                     62:        lseek(mem, msgptr, 0);
                     63:        read(mem, &msgbuf, sizeof (msgbuf));
                     64:        if (msgbuf.msg_magic != MSG_MAGIC)
                     65:                done("Magic number wrong (namelist mismatch?)\n");
                     66:        if (bufdiff(&omesg, &msgbuf) == 0)
                     67:                exit(0);
                     68:        prdiff(&omesg, &msgbuf);
                     69:        done((char *)NULL);
                     70: }
                     71: 
                     72: bufdiff(om, nm)
                     73: register struct msgbuf *om, *nm;
                     74: {
                     75: 
                     76:        if (om->msg_bufx != nm->msg_bufx)
                     77:                return (1);
                     78:        return (memcmp(om->msg_bufc, nm->msg_bufc, MSG_BSIZE));
                     79: }
                     80: 
                     81: prdiff(om, nm)
                     82: register struct msgbuf *om, *nm;
                     83: {
                     84:        register int ox, nx;
                     85:        register int c;
                     86: 
                     87:        if ((ox = om->msg_bufx) < 0 || ox >= MSG_BSIZE)
                     88:                ox = 0;
                     89:        if ((nx = nm->msg_bufx) < 0 || nx >= MSG_BSIZE)
                     90:                nx = 0;
                     91:        pdate();
                     92:        /*
                     93:         * did we lose something?
                     94:         */
                     95:        if (ox < nx) {
                     96:                if (memcmp(&om->msg_bufc[0], &nm->msg_bufc[0], ox)
                     97:                ||  memcmp(&om->msg_bufc[nx], &nm->msg_bufc[nx], MSG_BSIZE - nx)) {
                     98:                        ox = nx;
                     99:                        printf("...\n");
                    100:                }
                    101:        } else if (ox > nx) {
                    102:                if (memcmp(&om->msg_bufc[ox], &nm->msg_bufc[ox], nx - ox)) {
                    103:                        ox = nx;
                    104:                        printf("...\n");
                    105:                }
                    106:        }
                    107:        /*
                    108:         * else ox == nx; something might be lost, but assume not
                    109:         * now print the new part: from ox to nx-1
                    110:         */
                    111:        do {
                    112:                c = nm->msg_bufc[ox++];
                    113:                if ((c & 0200) == 0 && c != 0)  /* sanity */
                    114:                        putchar(c);
                    115:                if (ox >= MSG_BSIZE)
                    116:                        ox = 0;
                    117:        } while (ox != nx);
                    118: }
                    119: 
                    120: done(s)
                    121: char *s;
                    122: {
                    123: 
                    124:        if (s && s!=(char *)omesg.msg_magic && sflg==0) {
                    125:                pdate();
                    126:                printf(s);
                    127:        }
                    128:        if (wflg) {
                    129:                wflg = 0;
                    130:                writebuf();
                    131:        }
                    132:        exit(s!=NULL);
                    133: }
                    134: 
                    135: openbuf()
                    136: {
                    137:        int f;
                    138: 
                    139:        timeout("can't read buffer file\n");
                    140:        if ((f = open(BUFFER, 0)) < 0)
                    141:                return;
                    142:        if (read(f, (char *)&omesg, sizeof(omesg)) != sizeof(omesg)
                    143:        ||  omesg.msg_magic != MSG_MAGIC)
                    144:                memset((char *)&omesg, sizeof(omesg), 0);
                    145:        close(f);
                    146: }
                    147: 
                    148: writebuf()
                    149: {
                    150:        int f;
                    151: 
                    152:        timeout("can't write buffer file\n");
                    153:        if ((f = open(BUFFER, 1)) < 0)
                    154:                done("can't open buffer\n");
                    155:        if (write(f, (char *)&msgbuf, sizeof(msgbuf)) != sizeof(msgbuf))
                    156:                done("error writing buffer\n");
                    157:        close(f);
                    158: }
                    159: 
                    160: pdate()
                    161: {
                    162:        extern char *ctime();
                    163:        static firstime;
                    164:        time_t tbuf;
                    165: 
                    166:        if (firstime==0) {
                    167:                firstime++;
                    168:                time(&tbuf);
                    169:                printf("\n%.12s\n", ctime(&tbuf)+4);
                    170:        }
                    171: }
                    172: 
                    173: char *terr;
                    174: 
                    175: timeout(s)
                    176: char *s;
                    177: {
                    178:        extern ttrap();
                    179: 
                    180:        terr = s;
                    181:        signal(SIGALRM, ttrap);
                    182:        alarm(60);
                    183: }
                    184: 
                    185: ttrap()
                    186: {
                    187:        char buf[100];
                    188: 
                    189:        sprintf(buf, "timeout: %s", terr);
                    190:        done(buf);
                    191: }

unix.superglobalmegacorp.com

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