|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.