BSD 3 development
[unix-history] / usr / src / cmd / wall.c
CommitLineData
1d80d110
BJ
1#include <stdio.h>
2#include <utmp.h>
3#include <time.h>
4#define USERS 50
5
6char mesg[3000];
7int msize,sline;
8struct utmp utmp[USERS];
9char *strcpy();
10char *strcat();
11char who[9] = "???";
12long clock;
13struct tm *localtime();
14struct tm *localclock;
15
16main(argc, argv)
17char *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
58sendmes(tty)
59char *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, "\n\a\a\aBroadcast 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}