Make some RERR_* choices better, and another noop_io_until_death() tweak.
authorWayne Davison <wayned@samba.org>
Mon, 16 Nov 2009 20:35:17 +0000 (12:35 -0800)
committerWayne Davison <wayned@samba.org>
Mon, 16 Nov 2009 20:35:17 +0000 (12:35 -0800)
cleanup.c
io.c
token.c
xattrs.c

index ae185d4..63118e6 100644 (file)
--- a/cleanup.c
+++ b/cleanup.c
@@ -213,7 +213,7 @@ NORETURN void _exit_cleanup(int code, const char *file, int line)
                /* FALLTHROUGH */
 #include "case_N.h"
 
                /* FALLTHROUGH */
 #include "case_N.h"
 
-               if (exit_code && exit_code != RERR_STREAMIO && exit_code != RERR_SIGNAL1
+               if (exit_code && exit_code != RERR_SOCKETIO && exit_code != RERR_STREAMIO && exit_code != RERR_SIGNAL1
                 && (protocol_version >= 31 || (!am_sender && !am_generator))) {
                        if (line > 0)
                                send_msg_int(MSG_ERROR_EXIT, exit_code);
                 && (protocol_version >= 31 || (!am_sender && !am_generator))) {
                        if (line > 0)
                                send_msg_int(MSG_ERROR_EXIT, exit_code);
diff --git a/io.c b/io.c
index 679b564..4a6b95f 100644 (file)
--- a/io.c
+++ b/io.c
@@ -734,7 +734,7 @@ static char *perform_io(size_t needed, int flags)
                                                rsyserr(FERROR_SOCKET, errno, "read error");
                                        } else
                                                rsyserr(FERROR, errno, "read error");
                                                rsyserr(FERROR_SOCKET, errno, "read error");
                                        } else
                                                rsyserr(FERROR, errno, "read error");
-                                       exit_cleanup(RERR_STREAMIO);
+                                       exit_cleanup(RERR_SOCKETIO);
                                }
                        }
                        if (msgs2stderr && DEBUG_GTE(IO, 2))
                                }
                        }
                        if (msgs2stderr && DEBUG_GTE(IO, 2))
@@ -766,7 +766,7 @@ static char *perform_io(size_t needed, int flags)
                                        iobuf.out.len = iobuf.msg.len = iobuf.raw_flushing_ends_before = 0;
                                        rsyserr(FERROR_SOCKET, errno, "[%s] write error", who_am_i());
                                        drain_multiplex_messages();
                                        iobuf.out.len = iobuf.msg.len = iobuf.raw_flushing_ends_before = 0;
                                        rsyserr(FERROR_SOCKET, errno, "[%s] write error", who_am_i());
                                        drain_multiplex_messages();
-                                       exit_cleanup(RERR_STREAMIO);
+                                       exit_cleanup(RERR_SOCKETIO);
                                }
                        }
                        if (msgs2stderr && DEBUG_GTE(IO, 2)) {
                                }
                        }
                        if (msgs2stderr && DEBUG_GTE(IO, 2)) {
@@ -819,12 +819,10 @@ void noop_io_until_death(void)
        char buf[1024];
 
        kluge_around_eof = 2;
        char buf[1024];
 
        kluge_around_eof = 2;
-       /* For protocol 31: setting an I/O timeout ensures that if something
-        * inexplicably weird happens, we won't hang around forever.  For older
-        * protocols: we can't tell the other side to die, so we linger a brief
-        * time (to try to give our error messages time to arrive) and then let
-        * the "unexpectedly" closed socket tell them to die. */
-       set_io_timeout(protocol_version >= 31 ? 30 : 1);
+       /* Setting an I/O timeout ensures that if something inexplicably weird
+        * happens, we won't hang around forever. */
+       if (!io_timeout)
+               set_io_timeout(60);
 
        while (1)
                read_buf(iobuf.in_fd, buf, sizeof buf);
 
        while (1)
                read_buf(iobuf.in_fd, buf, sizeof buf);
@@ -2114,11 +2112,11 @@ void io_printf(int fd, const char *format, ...)
        va_end(ap);
 
        if (len < 0)
        va_end(ap);
 
        if (len < 0)
-               exit_cleanup(RERR_STREAMIO);
+               exit_cleanup(RERR_PROTOCOL);
 
        if (len > (int)sizeof buf) {
                rprintf(FERROR, "io_printf() was too long for the buffer.\n");
 
        if (len > (int)sizeof buf) {
                rprintf(FERROR, "io_printf() was too long for the buffer.\n");
-               exit_cleanup(RERR_STREAMIO);
+               exit_cleanup(RERR_PROTOCOL);
        }
 
        write_sbuf(fd, buf);
        }
 
        write_sbuf(fd, buf);
diff --git a/token.c b/token.c
index 838f8c9..be882e9 100644 (file)
--- a/token.c
+++ b/token.c
@@ -306,7 +306,7 @@ send_deflated_token(int f, int32 token, struct map_struct *buf, OFF_T offset,
                                         Z_DEFLATED, -15, 8,
                                         Z_DEFAULT_STRATEGY) != Z_OK) {
                                rprintf(FERROR, "compression init failed\n");
                                         Z_DEFLATED, -15, 8,
                                         Z_DEFAULT_STRATEGY) != Z_OK) {
                                rprintf(FERROR, "compression init failed\n");
-                               exit_cleanup(RERR_STREAMIO);
+                               exit_cleanup(RERR_PROTOCOL);
                        }
                        if ((obuf = new_array(char, OBUF_SIZE)) == NULL)
                                out_of_memory("send_deflated_token");
                        }
                        if ((obuf = new_array(char, OBUF_SIZE)) == NULL)
                                out_of_memory("send_deflated_token");
@@ -450,7 +450,7 @@ static int32 recv_deflated_token(int f, char **data)
                                rx_strm.zfree = NULL;
                                if (inflateInit2(&rx_strm, -15) != Z_OK) {
                                        rprintf(FERROR, "inflate init failed\n");
                                rx_strm.zfree = NULL;
                                if (inflateInit2(&rx_strm, -15) != Z_OK) {
                                        rprintf(FERROR, "inflate init failed\n");
-                                       exit_cleanup(RERR_STREAMIO);
+                                       exit_cleanup(RERR_PROTOCOL);
                                }
                                if (!(cbuf = new_array(char, MAX_DATA_COUNT))
                                    || !(dbuf = new_array(char, AVAIL_OUT_SIZE(CHUNK_SIZE))))
                                }
                                if (!(cbuf = new_array(char, MAX_DATA_COUNT))
                                    || !(dbuf = new_array(char, AVAIL_OUT_SIZE(CHUNK_SIZE))))
index 2b71270..7e3b74a 100644 (file)
--- a/xattrs.c
+++ b/xattrs.c
@@ -589,7 +589,7 @@ int recv_xattr_request(struct file_struct *file, int f_in)
 
        if (F_XATTR(file) < 0) {
                rprintf(FERROR, "recv_xattr_request: internal data error!\n");
 
        if (F_XATTR(file) < 0) {
                rprintf(FERROR, "recv_xattr_request: internal data error!\n");
-               exit_cleanup(RERR_STREAMIO);
+               exit_cleanup(RERR_PROTOCOL);
        }
        lst += F_XATTR(file);
 
        }
        lst += F_XATTR(file);
 
@@ -605,12 +605,12 @@ int recv_xattr_request(struct file_struct *file, int f_in)
                if (!cnt || rxa->num != num) {
                        rprintf(FERROR, "[%s] could not find xattr #%d for %s\n",
                                who_am_i(), num, f_name(file, NULL));
                if (!cnt || rxa->num != num) {
                        rprintf(FERROR, "[%s] could not find xattr #%d for %s\n",
                                who_am_i(), num, f_name(file, NULL));
-                       exit_cleanup(RERR_STREAMIO);
+                       exit_cleanup(RERR_PROTOCOL);
                }
                if (!XATTR_ABBREV(*rxa) || rxa->datum[0] != XSTATE_ABBREV) {
                        rprintf(FERROR, "[%s] internal abbrev error on %s (%s, len=%ld)!\n",
                                who_am_i(), f_name(file, NULL), rxa->name, (long)rxa->datum_len);
                }
                if (!XATTR_ABBREV(*rxa) || rxa->datum[0] != XSTATE_ABBREV) {
                        rprintf(FERROR, "[%s] internal abbrev error on %s (%s, len=%ld)!\n",
                                who_am_i(), f_name(file, NULL), rxa->name, (long)rxa->datum_len);
-                       exit_cleanup(RERR_STREAMIO);
+                       exit_cleanup(RERR_PROTOCOL);
                }
 
                if (am_sender) {
                }
 
                if (am_sender) {