1: static char *sccsid = "@(#)wall.c 4.6 (Berkeley) 82/03/15";
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: #include <signal.h>
13: #define USERS 128
14: #define IGNOREUSER "sleeper"
15:
16: char mesg[3000];
17: int msize,sline;
18: struct utmp utmp[USERS];
19: char *strcpy();
20: char *strcat();
21: char who[9] = "???";
22: long clock, time();
23: struct tm *localtime();
24: struct tm *localclock;
25:
26: main(argc, argv)
27: char *argv[];
28: {
29: register i;
30: register char c;
31: register struct utmp *p;
32: FILE *f;
33: FILE *mf;
34:
35: if((f = fopen("/etc/utmp", "r")) == NULL) {
36: fprintf(stderr, "Cannot open /etc/utmp\n");
37: exit(1);
38: }
39: clock = time( 0 );
40: localclock = localtime( &clock );
41: mf = stdin;
42: if(argc >= 2) {
43: /* take message from unix file instead of standard input */
44: if((mf = fopen(argv[1], "r")) == NULL) {
45: fprintf(stderr,"Cannot open %s\n", argv[1]);
46: exit(1);
47: }
48: }
49: while((i = getc(mf)) != EOF) {
50: if (msize >= sizeof mesg) {
51: fprintf(stderr, "Message too long\n");
52: exit(1);
53: }
54: mesg[msize++] = i;
55: }
56: fclose(mf);
57: sline = ttyslot(2); /* 'utmp' slot no. of sender */
58: fread((char *)utmp, sizeof(struct utmp), USERS, f);
59: fclose(f);
60: if (sline)
61: strncpy(who, utmp[sline].ut_name, sizeof(utmp[sline].ut_name));
62: for(i=0; i<USERS; i++) {
63: p = &utmp[i];
64: if ((p->ut_name[0] == 0) ||
65: (strncmp (p->ut_name, IGNOREUSER, sizeof(p->ut_name)) == 0))
66: continue;
67: sendmes(p->ut_line);
68: }
69: exit(0);
70: }
71:
72: sendmes(tty)
73: char *tty;
74: {
75: register i;
76: char t[50], buf[BUFSIZ];
77: register char *cp;
78: register int c, ch;
79: FILE *f;
80:
81: while ((i = fork()) == -1)
82: if (wait((int *)0) == -1) {
83: fprintf(stderr, "Try again\n");
84: return;
85: }
86: if(i)
87: return;
88: strcpy(t, "/dev/");
89: strcat(t, tty);
90:
91: signal(SIGALRM, SIG_DFL); /* blow away if open hangs */
92: alarm(10);
93:
94: if((f = fopen(t, "w")) == NULL) {
95: fprintf(stderr,"cannot open %s\n", t);
96: exit(1);
97: }
98: setbuf(f, buf);
99: fprintf(f,
100: "\nBroadcast Message from %s (%.*s) at %d:%02d ...\r\n\n"
101: , who
102: , sizeof(utmp[sline].ut_line)
103: , utmp[sline].ut_line
104: , localclock -> tm_hour
105: , localclock -> tm_min
106: );
107: /* fwrite(mesg, msize, 1, f); */
108: for (cp = mesg, c = msize; c-- > 0; cp++) {
109: ch = *cp;
110: if (ch == '\n')
111: putc('\r', f);
112: putc(ch, f);
113: }
114:
115: /*
116: * Bitchin'.
117: */
118:
119: exit(0);
120: }
Defined functions
main
defined in line
26;
never used
Defined variables
clock
defined in line
22; used 2 times
mesg
defined in line
16; used 3 times
msize
defined in line
17; used 3 times
sccsid
defined in line
1;
never used
sline
defined in line
17; used 6 times
utmp
defined in line
18; used 6 times
who
defined in line
21; used 2 times
Defined macros
USERS
defined in line
13; used 3 times