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