Annotation of researchv8dc/cmd/wall.c, revision 1.1

1.1     ! root        1: static char *sccsid = "@(#)wall.c      4.5 (Berkeley) 81/06/12";
        !             2: /*
        !             3:  *
        !             4:  * This program is not related to David Wall, whose Stanford Ph.D. thesis
        !             5:  * is entitled "Mechanisms for Broadcast and Selective Broadcast".
        !             6:  */
        !             7: 
        !             8: #include <stdio.h>
        !             9: #include <utmp.h>
        !            10: #include <time.h>
        !            11: #include <sys/utsname.h>
        !            12: #include <signal.h>
        !            13: #include <sys/types.h>
        !            14: #include <sys/stat.h>
        !            15: #define        USERS   128
        !            16: 
        !            17: char   mesg[3000];
        !            18: int    msize,sline;
        !            19: struct utmp utmp[USERS];
        !            20: char   *strcpy(), *strncpy();
        !            21: char   *strcat(), *strncat();
        !            22: char who[9] = "greg";
        !            23: long   clock, time();
        !            24: struct tm *localtime();
        !            25: struct tm *localclock;
        !            26: struct utsname ourname;
        !            27: 
        !            28: main(argc, argv)
        !            29: char *argv[];
        !            30: {
        !            31:        register i;
        !            32:        register char c;
        !            33:        register struct utmp *p;
        !            34:        FILE *f;
        !            35:        FILE *mf;
        !            36: 
        !            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:                register int j;
        !            66:                p = &utmp[i];
        !            67:                if (p->ut_name[0] == 0)
        !            68:                        continue;
        !            69:                /* reject people not really logged in */
        !            70:                j = 0;
        !            71:                while (j < sizeof (p->ut_name) && p->ut_name[j] != '*')
        !            72:                        j++;
        !            73:                if (j < sizeof (p->ut_name))
        !            74:                        continue;
        !            75:                sendmes(p->ut_line, sizeof(p->ut_line));
        !            76:        }
        !            77:        exit(0);
        !            78: }
        !            79: 
        !            80: sendmes(tty, len)
        !            81: char *tty;
        !            82: {
        !            83:        register i;
        !            84:        char t[50], buf[BUFSIZ];
        !            85:        register char *cp;
        !            86:        register int c, ch;
        !            87:        FILE *f;
        !            88: 
        !            89:        while ((i = fork()) == -1)
        !            90:                if (wait((int *)0) == -1) {
        !            91:                        fprintf(stderr, "Try again\n");
        !            92:                        return;
        !            93:                }
        !            94:        if(i)
        !            95:                return;
        !            96:        strcpy(t, "/dev/");
        !            97:        strncat(t, tty, len);
        !            98:        t[sizeof("/dev/")+len] = 0;
        !            99: 
        !           100:        if (ckmode(t) == 0)
        !           101:                exit(0);
        !           102:        signal(SIGALRM, SIG_DFL);       /* blow away if open hangs */
        !           103:        alarm(10);
        !           104: 
        !           105:        if((f = fopen(t, "w")) == NULL) {
        !           106:                fprintf(stderr,"cannot open %s\n", t);
        !           107:                exit(1);
        !           108:        }
        !           109:        setbuf(f, buf);
        !           110:        uname (&ourname);
        !           111:        fprintf(f,
        !           112:            "\nBroadcast Message from %s!%s (%.*s) at %d:%02d ...\r\n\n"
        !           113:                , ourname.nodename
        !           114:                , who
        !           115:                , sizeof(utmp[sline].ut_line)
        !           116:                , utmp[sline].ut_line
        !           117:                , localclock -> tm_hour
        !           118:                , localclock -> tm_min
        !           119:        );
        !           120:        /* fwrite(mesg, msize, 1, f); */
        !           121:        for (cp = mesg, c = msize; c-- > 0; cp++) {
        !           122:                ch = *cp;
        !           123:                if (ch == '\n')
        !           124:                        putc('\r', f);
        !           125:                putc(ch, f);
        !           126:        }
        !           127: 
        !           128:        /*
        !           129:         * Bitchin'.
        !           130:         */
        !           131: 
        !           132:        exit(0);
        !           133: }
        !           134: 
        !           135: /*
        !           136:  * don't write on ttys whose mode is 0
        !           137:  * hack to prevent hanging ndcon
        !           138:  */
        !           139: 
        !           140: ckmode(tty)
        !           141: char *tty;
        !           142: {
        !           143:        struct stat sb;
        !           144: 
        !           145:        if (stat(tty, &sb) < 0)
        !           146:                return (1);     /* eh? */
        !           147:        if (sb.st_mode & ~S_IFMT)
        !           148:                return (1);
        !           149:        return (0);
        !           150: }

unix.superglobalmegacorp.com

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