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