Annotation of 41BSD/cmd/wall.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)wall.c      4.1 (Berkeley) 10/1/80";
                      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 <time.h>
                     12: #define        USERS   128
                     13: 
                     14: char   mesg[3000];
                     15: int    msize,sline;
                     16: struct utmp utmp[USERS];
                     17: char   *strcpy();
                     18: char   *strcat();
                     19: char who[9] = "???";
                     20: long   clock;
                     21: struct tm *localtime();
                     22: struct tm *localclock;
                     23: 
                     24: main(argc, argv)
                     25: char *argv[];
                     26: {
                     27:        register i;
                     28:        register char c;
                     29:        register struct utmp *p;
                     30:        FILE *f;
                     31: 
                     32:        if((f = fopen("/etc/utmp", "r")) == NULL) {
                     33:                fprintf(stderr, "Cannot open /etc/utmp\n");
                     34:                exit(1);
                     35:        }
                     36:        clock = time( 0 );
                     37:        localclock = localtime( &clock );
                     38:        fread((char *)utmp, sizeof(struct utmp), USERS, f);
                     39:        fclose(f);
                     40:        f = stdin;
                     41:        if(argc >= 2) {
                     42:                /* take message from unix file instead of standard input */
                     43:                if((f = fopen(argv[1], "r")) == NULL) {
                     44:                        fprintf(stderr,"Cannot open %s\n", argv[1]);
                     45:                        exit(1);
                     46:                }
                     47:        }
                     48:        while((i = getc(f)) != EOF) mesg[msize++] = i;
                     49:        fclose(f);
                     50:        sline = ttyslot(2); /* 'utmp' slot no. of sender */
                     51:        if (sline) {
                     52:                for (i=0;(c=utmp[sline].ut_name[i]) && i<sizeof(utmp[0].ut_name);i++)
                     53:                        who[i]=c;
                     54:                who[i] = '\0'; /* sender initials */
                     55:                }
                     56:        for(i=0; i<USERS; i++) {
                     57:                p = &utmp[i];
                     58:                if(p->ut_name[0] == 0)
                     59:                        continue;
                     60:                sleep(1);
                     61:                sendmes(p->ut_line);
                     62:        }
                     63:        exit(0);
                     64: }
                     65: 
                     66: sendmes(tty)
                     67: char *tty;
                     68: {
                     69:        register i;
                     70:        char t[50], buf[BUFSIZ];
                     71:        register char *cp;
                     72:        register int c, ch;
                     73:        FILE *f;
                     74: 
                     75:        i = fork();
                     76:        if(i == -1) {
                     77:                fprintf(stderr, "Try again\n");
                     78:                return;
                     79:        }
                     80:        if(i)
                     81:                return;
                     82:        strcpy(t, "/dev/");
                     83:        strcat(t, tty);
                     84: 
                     85:        if((f = fopen(t, "w")) == NULL) {
                     86:                fprintf(stderr,"cannot open %s\n", t);
                     87:                exit(1);
                     88:        }
                     89:        setbuf(f, buf);
                     90:        fprintf(f, "\nBroadcast Message from %s (%s) at %d:%02d ...\r\n\n"
                     91:               ,who, utmp[sline].ut_line
                     92:               , localclock -> tm_hour , localclock -> tm_min );
                     93:        /* fwrite(mesg, msize, 1, f); */
                     94:        for (cp = mesg, c = msize; c-- > 0; cp++) {
                     95:                ch = *cp;
                     96:                if (ch == '\n')
                     97:                        putc('\r', f);
                     98:                putc(ch, f);
                     99:        }
                    100: 
                    101:        /*
                    102:         * Bitchin'.
                    103:         */
                    104: 
                    105:        exit(0);
                    106: }

unix.superglobalmegacorp.com

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