BSD 4_3_Reno release
[unix-history] / usr / src / libexec / talkd / announce.c
index fe4d177..5798ded 100644 (file)
@@ -1,15 +1,27 @@
 /*
  * Copyright (c) 1983 Regents of the University of California.
 /*
  * Copyright (c) 1983 Regents of the University of California.
- * All rights reserved.  The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that: (1) source distributions retain this entire copyright
+ * notice and comment, and (2) distributions including binaries display
+ * the following acknowledgement:  ``This product includes software
+ * developed by the University of California, Berkeley and its contributors''
+ * in the documentation or other materials provided with the distribution
+ * and in all advertising materials mentioning features or use of this
+ * software. Neither the name of the University nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)announce.c 5.1 (Berkeley) %G%";
-#endif not lint
-
-#include "ctl.h"
+static char sccsid[] = "@(#)announce.c 5.8 (Berkeley) 6/1/90";
+#endif /* not lint */
 
 
+#include <sys/types.h>
 #include <sys/stat.h>
 #include <sgtty.h>
 #include <sys/ioctl.h>
 #include <sys/stat.h>
 #include <sgtty.h>
 #include <sys/ioctl.h>
@@ -17,38 +29,38 @@ static char sccsid[] = "@(#)announce.c      5.1 (Berkeley) %G%";
 #include <stdio.h>
 #include <sys/wait.h>
 #include <errno.h>
 #include <stdio.h>
 #include <sys/wait.h>
 #include <errno.h>
+#include <syslog.h>
 
 
-char *sprintf();
+#include <protocols/talkd.h>
+#include <paths.h>
 
 
-extern int errno;
-extern char hostname[];
-int nofork = 0;                /* to be set from the debugger */
+extern int errno;
+extern char hostname[];
 
 /*
 
 /*
+ * Announce an invitation to talk.
+ *
  * Because the tty driver insists on attaching a terminal-less
  * process to any terminal that it writes on, we must fork a child
  * to protect ourselves
  */
  * Because the tty driver insists on attaching a terminal-less
  * process to any terminal that it writes on, we must fork a child
  * to protect ourselves
  */
-
 announce(request, remote_machine)
        CTL_MSG *request;
        char *remote_machine;
 {
        int pid, val, status;
 
 announce(request, remote_machine)
        CTL_MSG *request;
        char *remote_machine;
 {
        int pid, val, status;
 
-       if (nofork)
-               return(announce_proc(request, remote_machine));
        if (pid = fork()) {
                /* we are the parent, so wait for the child */
                if (pid == -1)          /* the fork failed */
        if (pid = fork()) {
                /* we are the parent, so wait for the child */
                if (pid == -1)          /* the fork failed */
-                       return(FAILED);
+                       return (FAILED);
                do {
                        val = wait(&status);
                        if (val == -1) {
                                if (errno == EINTR)
                                        continue;
                                /* shouldn't happen */
                do {
                        val = wait(&status);
                        if (val == -1) {
                                if (errno == EINTR)
                                        continue;
                                /* shouldn't happen */
-                               perror("wait");
+                               syslog(LOG_WARNING, "announce: wait: %m");
                                return (FAILED);
                        }
                } while (val != pid);
                                return (FAILED);
                        }
                } while (val != pid);
@@ -74,20 +86,20 @@ announce_proc(request, remote_machine)
        FILE *tf;
        struct stat stbuf;
 
        FILE *tf;
        struct stat stbuf;
 
-       (void) sprintf(full_tty, "/dev/%s", request->r_tty);
+       (void)sprintf(full_tty, "%s/%s", _PATH_DEV, request->r_tty);
        if (access(full_tty, 0) != 0)
                return (FAILED);
        if ((tf = fopen(full_tty, "w")) == NULL)
                return (PERMISSION_DENIED);
        /*
        if (access(full_tty, 0) != 0)
                return (FAILED);
        if ((tf = fopen(full_tty, "w")) == NULL)
                return (PERMISSION_DENIED);
        /*
-        * Open gratuitously attaches the talkd to
-        * any tty it opens, so disconnect us from the
-        * tty before we catch a signal
+        * On first tty open, the server will have
+        * it's pgrp set, so disconnect us from the
+        * tty before we catch a signal.
         */
        ioctl(fileno(tf), TIOCNOTTY, (struct sgttyb *) 0);
        if (fstat(fileno(tf), &stbuf) < 0)
                return (PERMISSION_DENIED);
         */
        ioctl(fileno(tf), TIOCNOTTY, (struct sgttyb *) 0);
        if (fstat(fileno(tf), &stbuf) < 0)
                return (PERMISSION_DENIED);
-       if ((stbuf.st_mode&02) == 0)
+       if ((stbuf.st_mode&020) == 0)
                return (PERMISSION_DENIED);
        print_mesg(tf, request, remote_machine);
        fclose(tf);
                return (PERMISSION_DENIED);
        print_mesg(tf, request, remote_machine);
        fclose(tf);
@@ -123,33 +135,33 @@ print_mesg(tf, request, remote_machine)
        max_size = 0;
        gettimeofday(&clock, &zone);
        localclock = localtime( &clock.tv_sec );
        max_size = 0;
        gettimeofday(&clock, &zone);
        localclock = localtime( &clock.tv_sec );
-       sprintf(line_buf[i], " ");
+       (void)sprintf(line_buf[i], " ");
        sizes[i] = strlen(line_buf[i]);
        max_size = max(max_size, sizes[i]);
        i++;
        sizes[i] = strlen(line_buf[i]);
        max_size = max(max_size, sizes[i]);
        i++;
-       sprintf(line_buf[i], "Message from Talk_Daemon@%s at %d:%02d ...",
+       (void)sprintf(line_buf[i], "Message from Talk_Daemon@%s at %d:%02d ...",
        hostname, localclock->tm_hour , localclock->tm_min );
        sizes[i] = strlen(line_buf[i]);
        max_size = max(max_size, sizes[i]);
        i++;
        hostname, localclock->tm_hour , localclock->tm_min );
        sizes[i] = strlen(line_buf[i]);
        max_size = max(max_size, sizes[i]);
        i++;
-       sprintf(line_buf[i], "talk: connection requested by %s@%s.",
+       (void)sprintf(line_buf[i], "talk: connection requested by %s@%s.",
                request->l_name, remote_machine);
        sizes[i] = strlen(line_buf[i]);
        max_size = max(max_size, sizes[i]);
        i++;
                request->l_name, remote_machine);
        sizes[i] = strlen(line_buf[i]);
        max_size = max(max_size, sizes[i]);
        i++;
-       sprintf(line_buf[i], "talk: respond with:  talk %s@%s",
+       (void)sprintf(line_buf[i], "talk: respond with:  talk %s@%s",
                request->l_name, remote_machine);
        sizes[i] = strlen(line_buf[i]);
        max_size = max(max_size, sizes[i]);
        i++;
                request->l_name, remote_machine);
        sizes[i] = strlen(line_buf[i]);
        max_size = max(max_size, sizes[i]);
        i++;
-       sprintf(line_buf[i], " ");
+       (void)sprintf(line_buf[i], " ");
        sizes[i] = strlen(line_buf[i]);
        max_size = max(max_size, sizes[i]);
        i++;
        bptr = big_buf;
        sizes[i] = strlen(line_buf[i]);
        max_size = max(max_size, sizes[i]);
        i++;
        bptr = big_buf;
-       *(bptr++) = '\a'; /* send something to wake them up */
-       *(bptr++) = '\r';       /* add a \r in case of raw mode */
-       *(bptr++) = '\n';
+       *bptr++ = '\a'; /* send something to wake them up */
+       *bptr++ = '\r'; /* add a \r in case of raw mode */
+       *bptr++ = '\n';
        for (i = 0; i < N_LINES; i++) {
                /* copy the line into the big buffer */
                lptr = line_buf[i];
        for (i = 0; i < N_LINES; i++) {
                /* copy the line into the big buffer */
                lptr = line_buf[i];