diff options
author | David Dykstra <dwd@samba.org> | 2003-01-27 03:35:08 +0000 |
---|---|---|
committer | David Dykstra <dwd@samba.org> | 2003-01-27 03:35:08 +0000 |
commit | 9f639210ca71c548b76d311d826899ed36f98372 (patch) | |
tree | 93d3d0d66c28388a51d69c7eae39303adfb55236 /cleanup.c | |
parent | deec574421aea793cc2093e676adc798989181fa (diff) | |
download | rsync-9f639210ca71c548b76d311d826899ed36f98372.tar.gz rsync-9f639210ca71c548b76d311d826899ed36f98372.tar.bz2 rsync-9f639210ca71c548b76d311d826899ed36f98372.zip |
Prevent the "Connection reset by peer" messages often seen from Cygwin.
Result of a lot of discussion over the last year and a half. Based on
a patch from Randy O'Meara, cleaned up a bit by Max Bowsher.
Diffstat (limited to 'cleanup.c')
-rw-r--r-- | cleanup.c | 27 |
1 files changed, 27 insertions, 0 deletions
@@ -22,6 +22,32 @@ #include "rsync.h" /** + * Close all open sockets and files, allowing a (somewhat) graceful + * shutdown() of socket connections. This eliminates the abortive + * TCP RST sent by a Winsock-based system when the close() occurs. + **/ +void close_all() +{ +#ifdef SHUTDOWN_ALL_SOCKETS + int max_fd; + int fd; + int ret; + struct stat st; + + max_fd = sysconf(_SC_OPEN_MAX) - 1; + for (fd = max_fd; fd >= 0; fd--) { + ret = fstat(fd,&st); + if (fstat(fd,&st) == 0) { + if (is_a_socket(fd)) { + ret = shutdown(fd, 2); + } + ret = close(fd); + } + } +#endif +} + +/** * @file cleanup.c * * Code for handling interrupted transfers. Depending on the @c @@ -115,6 +141,7 @@ void _exit_cleanup(int code, const char *file, int line) rprintf(FINFO,"_exit_cleanup(code=%d, file=%s, line=%d): about to call exit(%d)\n", ocode, file, line, code); + close_all(); exit(code); } |