Annotation of 43BSD/etc/dmesg.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1980 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  */
        !             6: 
        !             7: #ifndef lint
        !             8: static char sccsid[] = "@(#)dmesg.c    5.4 (Berkeley) 2/20/86";
        !             9: #endif not lint
        !            10: 
        !            11: /*
        !            12:  *     Suck up system messages
        !            13:  *     dmesg
        !            14:  *             print current buffer
        !            15:  *     dmesg -
        !            16:  *             print and update incremental history
        !            17:  */
        !            18: 
        !            19: #include <stdio.h>
        !            20: #include <sys/param.h>
        !            21: #include <nlist.h>
        !            22: #include <signal.h>
        !            23: #include <sys/file.h>
        !            24: #include <sys/vm.h>
        !            25: #include <sys/msgbuf.h>
        !            26: 
        !            27: struct msgbuf msgbuf;
        !            28: char   *msgbufp;
        !            29: int    sflg;
        !            30: int    of      = -1;
        !            31: 
        !            32: struct msgbuf omesg;
        !            33: struct nlist nl[2] = {
        !            34:        { "_msgbuf" },
        !            35:        { "" }
        !            36: };
        !            37: 
        !            38: main(argc, argv)
        !            39: char **argv;
        !            40: {
        !            41:        int mem;
        !            42:        register char *mp, *omp, *mstart;
        !            43:        int samef, sawnl, ignore;
        !            44: 
        !            45:        if (argc>1 && argv[1][0] == '-') {
        !            46:                sflg++;
        !            47:                argc--;
        !            48:                argv++;
        !            49:        }
        !            50:        if (sflg) {
        !            51:                of = open("/usr/adm/msgbuf", O_RDWR | O_CREAT, 0644);
        !            52:                if (of < 0)
        !            53:                        done("Can't open /usr/adm/msgbuf\n");
        !            54:                read(of, (char *)&omesg, sizeof(omesg));
        !            55:                lseek(of, 0L, 0);
        !            56:        }
        !            57:        sflg = 0;
        !            58:        nlist(argc>2? argv[2]:"/vmunix", nl);
        !            59:        if (nl[0].n_type==0)
        !            60:                done("Can't get kernel namelist\n");
        !            61:        if ((mem = open((argc>1? argv[1]: "/dev/kmem"), 0)) < 0)
        !            62:                done("Can't read kernel memory\n");
        !            63:        lseek(mem, (long)nl[0].n_value, 0);
        !            64:        read(mem, &msgbuf, sizeof (msgbuf));
        !            65:        if (msgbuf.msg_magic != MSG_MAGIC)
        !            66:                done("Magic number wrong (namelist mismatch?)\n");
        !            67:        if (msgbuf.msg_bufx >= MSG_BSIZE)
        !            68:                msgbuf.msg_bufx = 0;
        !            69:        if (omesg.msg_bufx >= MSG_BSIZE)
        !            70:                omesg.msg_bufx = 0;
        !            71:        mstart = &msgbuf.msg_bufc[omesg.msg_bufx];
        !            72:        omp = &omesg.msg_bufc[msgbuf.msg_bufx];
        !            73:        mp = msgbufp = &msgbuf.msg_bufc[msgbuf.msg_bufx];
        !            74:        samef = 1;
        !            75:        do {
        !            76:                if (*mp++ != *omp++) {
        !            77:                        mstart = msgbufp;
        !            78:                        samef = 0;
        !            79:                        pdate();
        !            80:                        printf("...\n");
        !            81:                        break;
        !            82:                }
        !            83:                if (mp >= &msgbuf.msg_bufc[MSG_BSIZE])
        !            84:                        mp = msgbuf.msg_bufc;
        !            85:                if (omp >= &omesg.msg_bufc[MSG_BSIZE])
        !            86:                        omp = omesg.msg_bufc;
        !            87:        } while (mp != mstart);
        !            88:        if (samef && omesg.msg_bufx == msgbuf.msg_bufx)
        !            89:                exit(0);
        !            90:        mp = mstart;
        !            91:        pdate();
        !            92:        sawnl = 1;
        !            93:        do {
        !            94:                if (sawnl && *mp == '<')
        !            95:                        ignore = 1;
        !            96:                if (*mp && (*mp & 0200) == 0 && !ignore)
        !            97:                        putchar(*mp);
        !            98:                if (ignore && *mp == '>')
        !            99:                        ignore = 0;
        !           100:                sawnl = (*mp == '\n');
        !           101:                mp++;
        !           102:                if (mp >= &msgbuf.msg_bufc[MSG_BSIZE])
        !           103:                        mp = msgbuf.msg_bufc;
        !           104:        } while (mp != msgbufp);
        !           105:        done((char *)NULL);
        !           106: }
        !           107: 
        !           108: done(s)
        !           109: char *s;
        !           110: {
        !           111:        register char *p, *q;
        !           112: 
        !           113:        if (s) {
        !           114:                pdate();
        !           115:                printf(s);
        !           116:        } else if (of != -1)
        !           117:                write(of, (char *)&msgbuf, sizeof(msgbuf));
        !           118:        exit(s!=NULL);
        !           119: }
        !           120: 
        !           121: pdate()
        !           122: {
        !           123:        extern char *ctime();
        !           124:        static firstime;
        !           125:        time_t tbuf;
        !           126: 
        !           127:        if (firstime==0) {
        !           128:                firstime++;
        !           129:                time(&tbuf);
        !           130:                printf("\n%.12s\n", ctime(&tbuf)+4);
        !           131:        }
        !           132: }

unix.superglobalmegacorp.com

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