Annotation of 42BSD/bin/wall.c, revision 1.1

1.1     ! root        1: static char *sccsid = "@(#)wall.c      4.7 (Berkeley) 83/07/01";
        !             2: /*
        !             3:  * wall.c - Broadcast a message to all users.
        !             4:  *
        !             5:  * This program is not related to David Wall, whose Stanford Ph.D. thesis
        !             6:  * is entitled "Mechanisms for Broadcast and Selective Broadcast".
        !             7:  */
        !             8: 
        !             9: #include <stdio.h>
        !            10: #include <utmp.h>
        !            11: #include <sys/time.h>
        !            12: #include <signal.h>
        !            13: #define        USERS   128
        !            14: #define IGNOREUSER     "sleeper"
        !            15: 
        !            16: char   hostname[32];
        !            17: char   mesg[3000];
        !            18: int    msize,sline;
        !            19: struct utmp utmp[USERS];
        !            20: char   *strcpy();
        !            21: char   *strcat();
        !            22: char who[9] = "???";
        !            23: long   clock, time();
        !            24: struct tm *localtime();
        !            25: struct tm *localclock;
        !            26: 
        !            27: main(argc, argv)
        !            28: char *argv[];
        !            29: {
        !            30:        register i;
        !            31:        register char c;
        !            32:        register struct utmp *p;
        !            33:        FILE *f;
        !            34:        FILE *mf;
        !            35: 
        !            36:        gethostname(hostname, sizeof (hostname));
        !            37:        if((f = fopen("/etc/utmp", "r")) == NULL) {
        !            38:                fprintf(stderr, "Cannot open /etc/utmp\n");
        !            39:                exit(1);
        !            40:        }
        !            41:        clock = time( 0 );
        !            42:        localclock = localtime( &clock );
        !            43:        mf = stdin;
        !            44:        if(argc >= 2) {
        !            45:                /* take message from unix file instead of standard input */
        !            46:                if((mf = fopen(argv[1], "r")) == NULL) {
        !            47:                        fprintf(stderr,"Cannot open %s\n", argv[1]);
        !            48:                        exit(1);
        !            49:                }
        !            50:        }
        !            51:        while((i = getc(mf)) != EOF) {
        !            52:                if (msize >= sizeof mesg) {
        !            53:                        fprintf(stderr, "Message too long\n");
        !            54:                        exit(1);
        !            55:                }
        !            56:                mesg[msize++] = i;
        !            57:        }
        !            58:        fclose(mf);
        !            59:        sline = ttyslot(2); /* 'utmp' slot no. of sender */
        !            60:        fread((char *)utmp, sizeof(struct utmp), USERS, f);
        !            61:        fclose(f);
        !            62:        if (sline)
        !            63:                strncpy(who, utmp[sline].ut_name, sizeof(utmp[sline].ut_name));
        !            64:        for(i=0; i<USERS; i++) {
        !            65:                p = &utmp[i];
        !            66:                if ((p->ut_name[0] == 0) ||
        !            67:                    (strncmp (p->ut_name, IGNOREUSER, sizeof(p->ut_name)) == 0))
        !            68:                        continue;
        !            69:                sendmes(p->ut_line);
        !            70:        }
        !            71:        exit(0);
        !            72: }
        !            73: 
        !            74: sendmes(tty)
        !            75: char *tty;
        !            76: {
        !            77:        register i;
        !            78:        char t[50], buf[BUFSIZ];
        !            79:        register char *cp;
        !            80:        register int c, ch;
        !            81:        FILE *f;
        !            82: 
        !            83:        while ((i = fork()) == -1)
        !            84:                if (wait((int *)0) == -1) {
        !            85:                        fprintf(stderr, "Try again\n");
        !            86:                        return;
        !            87:                }
        !            88:        if(i)
        !            89:                return;
        !            90:        strcpy(t, "/dev/");
        !            91:        strcat(t, tty);
        !            92: 
        !            93:        signal(SIGALRM, SIG_DFL);       /* blow away if open hangs */
        !            94:        alarm(10);
        !            95: 
        !            96:        if((f = fopen(t, "w")) == NULL) {
        !            97:                fprintf(stderr,"cannot open %s\n", t);
        !            98:                exit(1);
        !            99:        }
        !           100:        setbuf(f, buf);
        !           101:        fprintf(f,
        !           102:            "\nBroadcast Message from %s!%s (%.*s) at %d:%02d ...\r\n\n"
        !           103:                , hostname
        !           104:                , who
        !           105:                , sizeof(utmp[sline].ut_line)
        !           106:                , utmp[sline].ut_line
        !           107:                , localclock -> tm_hour
        !           108:                , localclock -> tm_min
        !           109:        );
        !           110:        /* fwrite(mesg, msize, 1, f); */
        !           111:        for (cp = mesg, c = msize; c-- > 0; cp++) {
        !           112:                ch = *cp;
        !           113:                if (ch == '\n')
        !           114:                        putc('\r', f);
        !           115:                putc(ch, f);
        !           116:        }
        !           117: 
        !           118:        /*
        !           119:         * Bitchin'.
        !           120:         */
        !           121: 
        !           122:        exit(0);
        !           123: }

unix.superglobalmegacorp.com

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