BSD 4 release
[unix-history] / usr / src / cmd / wall.c
index 003ff7c..0642a3c 100644 (file)
@@ -1,17 +1,31 @@
+static char *sccsid = "@(#)wall.c      4.1 (Berkeley) 10/1/80";
+/*
+ * wall.c - Broadcast a message to all users.
+ *
+ * This program is not related to David Wall, whose Stanford Ph.D. thesis
+ * is entitled "Mechanisms for Broadcast and Selective Broadcast".
+ */
+
 #include <stdio.h>
 #include <utmp.h>
 #include <stdio.h>
 #include <utmp.h>
-#define        USERS   50
+#include <time.h>
+#define        USERS   128
 
 char   mesg[3000];
 
 char   mesg[3000];
-int    msize;
+int    msize,sline;
 struct utmp utmp[USERS];
 char   *strcpy();
 char   *strcat();
 struct utmp utmp[USERS];
 char   *strcpy();
 char   *strcat();
+char who[9] = "???";
+long   clock;
+struct tm *localtime();
+struct tm *localclock;
 
 main(argc, argv)
 char *argv[];
 {
        register i;
 
 main(argc, argv)
 char *argv[];
 {
        register i;
+       register char c;
        register struct utmp *p;
        FILE *f;
 
        register struct utmp *p;
        FILE *f;
 
@@ -19,10 +33,13 @@ char *argv[];
                fprintf(stderr, "Cannot open /etc/utmp\n");
                exit(1);
        }
                fprintf(stderr, "Cannot open /etc/utmp\n");
                exit(1);
        }
+       clock = time( 0 );
+       localclock = localtime( &clock );
        fread((char *)utmp, sizeof(struct utmp), USERS, f);
        fclose(f);
        f = stdin;
        if(argc >= 2) {
        fread((char *)utmp, sizeof(struct utmp), USERS, f);
        fclose(f);
        f = stdin;
        if(argc >= 2) {
+               /* take message from unix file instead of standard input */
                if((f = fopen(argv[1], "r")) == NULL) {
                        fprintf(stderr,"Cannot open %s\n", argv[1]);
                        exit(1);
                if((f = fopen(argv[1], "r")) == NULL) {
                        fprintf(stderr,"Cannot open %s\n", argv[1]);
                        exit(1);
@@ -30,6 +47,12 @@ char *argv[];
        }
        while((i = getc(f)) != EOF) mesg[msize++] = i;
        fclose(f);
        }
        while((i = getc(f)) != EOF) mesg[msize++] = i;
        fclose(f);
+       sline = ttyslot(2); /* 'utmp' slot no. of sender */
+       if (sline) {
+               for (i=0;(c=utmp[sline].ut_name[i]) && i<sizeof(utmp[0].ut_name);i++)
+                       who[i]=c;
+               who[i] = '\0'; /* sender initials */
+               }
        for(i=0; i<USERS; i++) {
                p = &utmp[i];
                if(p->ut_name[0] == 0)
        for(i=0; i<USERS; i++) {
                p = &utmp[i];
                if(p->ut_name[0] == 0)
@@ -45,6 +68,8 @@ char *tty;
 {
        register i;
        char t[50], buf[BUFSIZ];
 {
        register i;
        char t[50], buf[BUFSIZ];
+       register char *cp;
+       register int c, ch;
        FILE *f;
 
        i = fork();
        FILE *f;
 
        i = fork();
@@ -62,7 +87,20 @@ char *tty;
                exit(1);
        }
        setbuf(f, buf);
                exit(1);
        }
        setbuf(f, buf);
-       fprintf(f, "\a\a\aBroadcast Message ...\n\n");
-       fwrite(mesg, msize, 1, f);
+       fprintf(f, "\n\a\a\aBroadcast Message from %s (%s) at %d:%02d ...\r\n\n"
+              ,who, utmp[sline].ut_line
+              , localclock -> tm_hour , localclock -> tm_min );
+       /* fwrite(mesg, msize, 1, f); */
+       for (cp = mesg, c = msize; c-- > 0; cp++) {
+               ch = *cp;
+               if (ch == '\n')
+                       putc('\r', f);
+               putc(ch, f);
+       }
+
+       /*
+        * Bitchin'.
+        */
+
        exit(0);
 }
        exit(0);
 }