summaryrefslogtreecommitdiff
path: root/cleanup.c
diff options
context:
space:
mode:
authorDavid Dykstra <dwd@samba.org>2003-01-27 03:35:08 +0000
committerDavid Dykstra <dwd@samba.org>2003-01-27 03:35:08 +0000
commit9f639210ca71c548b76d311d826899ed36f98372 (patch)
tree93d3d0d66c28388a51d69c7eae39303adfb55236 /cleanup.c
parentdeec574421aea793cc2093e676adc798989181fa (diff)
downloadrsync-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.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/cleanup.c b/cleanup.c
index 8543217d..2a850832 100644
--- a/cleanup.c
+++ b/cleanup.c
@@ -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);
}