X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/e92ee12893ca6320f5331384b2c2e8560ca9c88a..ff81e809f46293171a332a2faa320aca57277b4b:/io.c diff --git a/io.c b/io.c index 2f4162cd..1069a2e5 100644 --- a/io.c +++ b/io.c @@ -1,5 +1,6 @@ -/* - Copyright (C) Andrew Tridgell 1996 +/* -*- c-file-style: "linux" -*- + + Copyright (C) 1996-2001 by Andrew Tridgell Copyright (C) Paul Mackerras 1996 This program is free software; you can redistribute it and/or modify @@ -47,6 +48,8 @@ static void check_timeout(void) { extern int am_server, am_daemon; time_t t; + + err_list_push(); if (!io_timeout) return; @@ -59,7 +62,7 @@ static void check_timeout(void) if (last_io && io_timeout && (t-last_io) >= io_timeout) { if (!am_server && !am_daemon) { - rprintf(FERROR,"io timeout after %d second - exiting\n", + rprintf(FERROR,"io timeout after %d seconds - exiting\n", (int)(t-last_io)); } exit_cleanup(RERR_TIMEOUT); @@ -80,6 +83,8 @@ static void read_error_fd(void) int fd = io_error_fd; int tag, len; + /* io_error_fd is temporarily disabled -- is this meant to + * prevent indefinite recursion? */ io_error_fd = -1; read_loop(fd, buf, 4); @@ -103,9 +108,17 @@ static void read_error_fd(void) static int no_flush; -/* read from a socket with IO timeout. return the number of - bytes read. If no bytes can be read then exit, never return - a number <= 0 */ +/* + * Read from a socket with IO timeout. return the number of bytes + * read. If no bytes can be read then exit, never return a number <= 0. + * + * TODO: If the remote shell connection fails, then current versions + * actually report an "unexpected EOF" error here. Since it's a + * fairly common mistake to try to use rsh when ssh is required, we + * should trap that: if we fail to read any data at all, we should + * give a better explanation. We can tell whether the connection has + * started by looking e.g. at whether the remote version is known yet. + */ static int read_timeout(int fd, char *buf, int len) { int n, ret=0; @@ -166,7 +179,10 @@ static int read_timeout(int fd, char *buf, int len) if (n == 0) { if (eof_error) { - rprintf(FERROR,"unexpected EOF in read_timeout\n"); + rprintf(FERROR, + "%s: connection to server unexpectedly closed" + " (%ld bytes read so far)\n", + RSYNC_NAME, stats.total_read); } exit_cleanup(RERR_STREAMIO); } @@ -325,6 +341,8 @@ static void writefd_unbuffered(int fd,char *buf,int len) int fd_count, count; struct timeval tv; + err_list_push(); + no_flush++; while (total < len) { @@ -377,7 +395,10 @@ static void writefd_unbuffered(int fd,char *buf,int len) } if (ret <= 0) { - rprintf(FERROR,"erroring writing %d bytes - exiting\n", len); + rprintf(FERROR, + "error writing %d unbuffered bytes" + " - exiting: %s\n", len, + strerror(errno)); exit_cleanup(RERR_STREAMIO); } @@ -445,6 +466,9 @@ static void mplex_write(int fd, enum logcode code, char *buf, int len) void io_flush(void) { int fd = multiplex_out_fd; + + err_list_push(); + if (!io_buffer_count || no_flush) return; if (io_multiplexing_out) { @@ -455,6 +479,8 @@ void io_flush(void) io_buffer_count = 0; } + +/* XXX: fd is ignored, which seems a little strange. */ void io_end_buffering(int fd) { io_flush(); @@ -464,21 +490,12 @@ void io_end_buffering(int fd) } } -/* some OSes have a bug where an exit causes the pending writes on - a socket to be flushed. Do an explicit shutdown to try to prevent this */ -void io_shutdown(void) -{ - if (multiplex_out_fd != -1) close(multiplex_out_fd); - if (io_error_fd != -1) close(io_error_fd); - multiplex_out_fd = -1; - io_error_fd = -1; -} - - static void writefd(int fd,char *buf,int len) { stats.total_written += len; + err_list_push(); + if (!io_buffer || fd != multiplex_out_fd) { writefd_unbuffered(fd, buf, len); return; @@ -505,6 +522,11 @@ void write_int(int f,int32 x) writefd(f,b,4); } + +/* + * Note: int64 may actually be a 32-bit type if ./configure couldn't find any + * 64-bit types on this platform. + */ void write_longint(int f, int64 x) { extern int remote_version; @@ -611,14 +633,6 @@ int io_multiplex_write(enum logcode code, char *buf, int len) return 1; } -/* write a message to the special error fd */ -int io_error_write(int f, enum logcode code, char *buf, int len) -{ - if (f == -1) return 0; - mplex_write(f, code, buf, len); - return 1; -} - /* stop output multiplexing */ void io_multiplexing_close(void) {