BSD 4 release
[unix-history] / usr / src / cmd / wall.c
CommitLineData
31cef89c 1static char *sccsid = "@(#)wall.c 4.1 (Berkeley) 10/1/80";
1addde1c
BJ
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
14char mesg[3000];
15int msize,sline;
16struct utmp utmp[USERS];
17char *strcpy();
18char *strcat();
19char who[9] = "???";
20long clock;
21struct tm *localtime();
22struct tm *localclock;
23
24main(argc, argv)
25char *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
66sendmes(tty)
67char *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, "\n\a\a\aBroadcast 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}