When complaining about a socket-read problem, use an FSOCKERR
authorWayne Davison <wayned@samba.org>
Wed, 1 Feb 2006 19:35:17 +0000 (19:35 +0000)
committerWayne Davison <wayned@samba.org>
Wed, 1 Feb 2006 19:35:17 +0000 (19:35 +0000)
code instead of a normal FERROR.  The generator is the only
process that will receive this, and it uses it to close down
the multi-I/O over the socket so that it won't ever hang trying
to write an error down a dead socket.

io.c

diff --git a/io.c b/io.c
index ba71098d415e855489e4e2332899a25f652ba79a..6dafa2afe399bd30163c30789e1ffe495802a959 100644 (file)
--- a/io.c
+++ b/io.c
@@ -300,6 +300,13 @@ static void read_msg_fd(void)
                if (preserve_hard_links)
                        flist_ndx_push(&hlink_list, IVAL(buf,0));
                break;
+       case MSG_SOCKERR:
+               if (!am_generator) {
+                       rprintf(FERROR, "invalid message %d:%d\n", tag, len);
+                       exit_cleanup(RERR_STREAMIO);
+               }
+               close_multiplexing_out();
+               /* FALL THROUGH */
        case MSG_INFO:
        case MSG_ERROR:
        case MSG_LOG:
@@ -580,9 +587,11 @@ static int read_timeout(int fd, char *buf, size_t len)
                                continue;
 
                        /* Don't write errors on a dead socket. */
-                       if (fd == sock_f_in)
+                       if (fd == sock_f_in) {
                                close_multiplexing_out();
-                       rsyserr(FERROR, errno, "read error");
+                               rsyserr(FSOCKERR, errno, "read error");
+                       } else
+                               rsyserr(FERROR, errno, "read error");
                        exit_cleanup(RERR_STREAMIO);
                }