changed INDEX operator to handle multiple subscript arrays correctly
[unix-history] / usr / src / usr.bin / write / write.c
index 47d88b6..0b45747 100644 (file)
@@ -1,4 +1,4 @@
-static char *sccsid = "@(#)write.c     4.1 (Berkeley) %G%";
+static char *sccsid = "@(#)write.c     4.6 %G%";
 /*
  * write to another user
  */
 /*
  * write to another user
  */
@@ -10,8 +10,8 @@ static char *sccsid = "@(#)write.c    4.1 (Berkeley) %G%";
 #include <utmp.h>
 #include <time.h>
 
 #include <utmp.h>
 #include <time.h>
 
-#define NMAX sizeof(ubuf.ut_name)
-#define LMAX sizeof(ubuf.ut_line)
+#define        NMAX    sizeof(ubuf.ut_name)
+#define        LMAX    sizeof(ubuf.ut_line)
 
 char   *strcat();
 char   *strcpy();
 
 char   *strcat();
 char   *strcpy();
@@ -31,22 +31,23 @@ FILE        *tf;
 char   *getenv();
 
 main(argc, argv)
 char   *getenv();
 
 main(argc, argv)
-char *argv[];
+       int argc;
+       char *argv[];
 {
        struct stat stbuf;
        register i;
        register FILE *uf;
        int c1, c2;
 {
        struct stat stbuf;
        register i;
        register FILE *uf;
        int c1, c2;
-       long    clock = time( 0 );
+       long clock = time(0);
        struct tm *localtime();
        struct tm *localclock = localtime( &clock );
 
        struct tm *localtime();
        struct tm *localclock = localtime( &clock );
 
-       if(argc < 2) {
+       if (argc < 2) {
                printf("usage: write user [ttyname]\n");
                exit(1);
        }
        him = argv[1];
                printf("usage: write user [ttyname]\n");
                exit(1);
        }
        him = argv[1];
-       if(argc > 2)
+       if (argc > 2)
                histtya = argv[2];
        if ((uf = fopen("/etc/utmp", "r")) == NULL) {
                printf("cannot open /etc/utmp\n");
                histtya = argv[2];
        if ((uf = fopen("/etc/utmp", "r")) == NULL) {
                printf("cannot open /etc/utmp\n");
@@ -57,30 +58,40 @@ char *argv[];
                printf("Can't find your tty\n");
                exit(1);
        }
                printf("Can't find your tty\n");
                exit(1);
        }
+       if (stat(mytty, &stbuf) < 0) {
+               printf("Can't stat your tty\n");
+               exit(1);
+       }
+       if ((stbuf.st_mode&02) == 0) {
+               printf("You have write permission turned off.\n");
+               exit(1);
+       }
        mytty = rindex(mytty, '/') + 1;
        if (histtya) {
                strcpy(histty, "/dev/");
                strcat(histty, histtya);
        }
        while (fread((char *)&ubuf, sizeof(ubuf), 1, uf) == 1) {
        mytty = rindex(mytty, '/') + 1;
        if (histtya) {
                strcpy(histty, "/dev/");
                strcat(histty, histtya);
        }
        while (fread((char *)&ubuf, sizeof(ubuf), 1, uf) == 1) {
+               if (ubuf.ut_name[0] == '\0')
+                       continue;
                if (strcmp(ubuf.ut_line, mytty)==0) {
                if (strcmp(ubuf.ut_line, mytty)==0) {
-                       for(i=0; i<NMAX; i++) {
+                       for (i=0; i<NMAX; i++) {
                                c1 = ubuf.ut_name[i];
                                c1 = ubuf.ut_name[i];
-                               if(c1 == ' ')
+                               if (c1 == ' ')
                                        c1 = 0;
                                me[i] = c1;
                                        c1 = 0;
                                me[i] = c1;
-                               if(c1 == 0)
+                               if (c1 == 0)
                                        break;
                        }
                }
                                        break;
                        }
                }
-               if(him[0] != '-' || him[1] != 0)
-               for(i=0; i<NMAX; i++) {
+               if (him[0] != '-' || him[1] != 0)
+               for (i=0; i<NMAX; i++) {
                        c1 = him[i];
                        c2 = ubuf.ut_name[i];
                        c1 = him[i];
                        c2 = ubuf.ut_name[i];
-                       if(c1 == 0)
-                               if(c2 == 0 || c2 == ' ')
+                       if (c1 == 0)
+                               if (c2 == 0 || c2 == ' ')
                                        break;
                                        break;
-                       if(c1 != c2)
+                       if (c1 != c2)
                                goto nomat;
                }
                logcnt++;
                                goto nomat;
                }
                logcnt++;
@@ -100,9 +111,9 @@ cont:
        if (histtya==0 && logcnt > 1) {
                printf("%s logged more than once\nwriting to %s\n", him, histty+5);
        }
        if (histtya==0 && logcnt > 1) {
                printf("%s logged more than once\nwriting to %s\n", him, histty+5);
        }
-       if(histty[0] == 0) {
+       if (histty[0] == 0) {
                printf(him);
                printf(him);
-               if(logcnt)
+               if (logcnt)
                        printf(" not on that tty\n"); else
                        printf(" not logged in\n");
                exit(1);
                        printf(" not on that tty\n"); else
                        printf(" not logged in\n");
                exit(1);
@@ -121,28 +132,30 @@ cont:
        if ((stbuf.st_mode&02) == 0)
                goto perm;
        sigs(eof);
        if ((stbuf.st_mode&02) == 0)
                goto perm;
        sigs(eof);
-       fprintf(tf, "\r\nMessage from ");
-#ifdef interdata
-       fprintf(tf, "(Interdata) " );
-#endif
-       fprintf(tf, "%s on %s at %d:%02d ...\r\n\a\a\a"
-              , me, mytty , localclock -> tm_hour , localclock -> tm_min );
+       { char hostname[32];
+         gethostname(hostname, sizeof (hostname));
+         fprintf(tf, "\r\nMessage from ");
+         fprintf(tf, "%s!%s on %s at %d:%02d ...\r\n\a\a\a",
+             hostname, me, mytty, localclock->tm_hour, localclock->tm_min);
+       }
        fflush(tf);
        fflush(tf);
-       for(;;) {
+       for (;;) {
                char buf[128];
                i = read(0, buf, 128);
                char buf[128];
                i = read(0, buf, 128);
-               if(i <= 0)
+               if (i <= 0)
                        eof();
                        eof();
-               if(buf[0] == '!') {
+               if (buf[0] == '!') {
                        buf[i] = 0;
                        ex(buf);
                        continue;
                }
                        buf[i] = 0;
                        ex(buf);
                        continue;
                }
-               write(fileno(tf), buf, i);
-               if ( buf[ i - 1 ] == '\n' )
-                   write( fileno( tf ) , "\r" , 1 );
+               if (write(fileno(tf), buf, i) != i) {
+                       printf("\n\7Write failed (%s logged out?)\n", him);
+                       exit(1);
+               }
+               if (buf[i-1] == '\n')
+                       write(fileno(tf), "\r", 1);
        }
        }
-
 perm:
        printf("Permission denied\n");
        exit(1);
 perm:
        printf("Permission denied\n");
        exit(1);
@@ -163,22 +176,23 @@ eof()
 }
 
 ex(bp)
 }
 
 ex(bp)
-char *bp;
+       char *bp;
 {
        register i;
 
        sigs(SIG_IGN);
        i = fork();
 {
        register i;
 
        sigs(SIG_IGN);
        i = fork();
-       if(i < 0) {
+       if (i < 0) {
                printf("Try again\n");
                goto out;
        }
                printf("Try again\n");
                goto out;
        }
-       if(i == 0) {
+       if (i == 0) {
                sigs((int (*)())0);
                sigs((int (*)())0);
-               execl(getenv("SHELL") ? getenv("SHELL") : "/bin/sh", "sh", "-c", bp+1, 0);
+               execl(getenv("SHELL") ?
+                   getenv("SHELL") : "/bin/sh", "sh", "-c", bp+1, 0);
                exit(0);
        }
                exit(0);
        }
-       while(wait((int *)NULL) != i)
+       while (wait((int *)NULL) != i)
                ;
        printf("!\n");
 out:
                ;
        printf("!\n");
 out:
@@ -186,10 +200,10 @@ out:
 }
 
 sigs(sig)
 }
 
 sigs(sig)
-int (*sig)();
+       int (*sig)();
 {
        register i;
 
 {
        register i;
 
-       for(i=0;signum[i];i++)
-               signal(signum[i],sig);
+       for (i=0; signum[i]; i++)
+               signal(signum[i], sig);
 }
 }