|
|
1.1 ! root 1: /* ! 2: * ! 3: * This program is not related to David Wall, whose Stanford Ph.D. thesis ! 4: * is entitled "Mechanisms for Broadcast and Selective Broadcast". ! 5: */ ! 6: ! 7: #include <stdio.h> ! 8: #include <utmp.h> ! 9: #include <time.h> ! 10: #include <sys/utsname.h> ! 11: #include <signal.h> ! 12: #include <sys/types.h> ! 13: #include <sys/stat.h> ! 14: ! 15: char *strcpy(), *strncpy(); ! 16: char *strcat(), *strncat(); ! 17: long time(); ! 18: struct tm *localtime(); ! 19: ! 20: main() ! 21: { ! 22: register int c; ! 23: register char *p; ! 24: struct utmp utmp; ! 25: struct tm *tm; ! 26: long clock; ! 27: FILE *f; ! 28: char *who, *mytty; ! 29: struct utsname node; ! 30: char mesg[3000]; ! 31: char *getlogin(), *ttyname(); ! 32: long time(); ! 33: struct tm *localtime(); ! 34: ! 35: if((f = fopen("/etc/utmp", "r")) == NULL) { ! 36: fprintf(stderr, "Cannot open /etc/utmp\n"); ! 37: exit(1); ! 38: } ! 39: if ((who = getlogin()) == NULL) ! 40: who = "greg"; ! 41: if ((mytty = ttyname(2)) == NULL) ! 42: mytty = "???"; ! 43: else if (strncmp(mytty, "/dev/", 5) == 0) ! 44: mytty += 5; /* for prettiness */ ! 45: uname(&node); ! 46: clock = time((long *)0); ! 47: tm = localtime(&clock); ! 48: sprintf(mesg, "\nBroadcast Message from %s!%s (%s) at %d:%02d ...\r\n", ! 49: node.nodename, who, mytty, tm->tm_hour, tm->tm_min); ! 50: p = &mesg[strlen(mesg)]; ! 51: while((c = getchar()) != EOF) { ! 52: if (p >= &mesg[sizeof(mesg)]) { ! 53: fprintf(stderr, "Message too long\n"); ! 54: exit(1); ! 55: } ! 56: if (c == '\n') ! 57: *p++ = '\r'; ! 58: *p++ = c; ! 59: } ! 60: while (fread((char *)&utmp, sizeof(utmp), 1, f) == 1) { ! 61: if (utmp.ut_name[0] == 0) ! 62: continue; ! 63: /* reject people not really logged in */ ! 64: for (c = 0; c < sizeof(utmp.ut_name); c++) ! 65: if (utmp.ut_name[c] == '*') ! 66: break; ! 67: if (c < sizeof(utmp.ut_name)) ! 68: continue; ! 69: sendmes(utmp.ut_line, sizeof(utmp.ut_line), mesg, p - mesg); ! 70: } ! 71: exit(0); ! 72: } ! 73: ! 74: sendmes(tty, len, mesg, mlen) ! 75: char *tty, *mesg; ! 76: int len, mlen; ! 77: { ! 78: int i; ! 79: char t[50]; ! 80: int fd; ! 81: ! 82: while ((i = fork()) == -1) ! 83: if (wait((int *)0) == -1) { ! 84: fprintf(stderr, "Try again\n"); ! 85: return; ! 86: } ! 87: if(i) ! 88: return; ! 89: sprintf(t, "/dev/%.*s", len, tty); ! 90: if (ckmode(t) == 0) ! 91: exit(0); ! 92: signal(SIGALRM, SIG_DFL); /* blow away if open hangs */ ! 93: alarm(10); ! 94: if((fd = open(t, 1)) < 0) { ! 95: fprintf(stderr,"cannot open %s\n", t); ! 96: exit(1); ! 97: } ! 98: write(fd, mesg, mlen); ! 99: close(fd); ! 100: ! 101: /* ! 102: * Bitchin'. ! 103: */ ! 104: ! 105: exit(0); ! 106: } ! 107: ! 108: /* ! 109: * don't write on ttys whose mode is 0 ! 110: * hack to prevent hanging ndcon ! 111: */ ! 112: ! 113: ckmode(tty) ! 114: char *tty; ! 115: { ! 116: struct stat sb; ! 117: ! 118: if (stat(tty, &sb) < 0) ! 119: return (1); /* eh? */ ! 120: if (sb.st_mode & ~S_IFMT) ! 121: return (1); ! 122: return (0); ! 123: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.