Hello!
In the attached file is patch for the option to set client connection limit.
We had problem for dead hosts, so default system timeout is not enough.

--conlimit option added

Will be great to see this patch in the future version, so we do not need to patch every time.
Thanks and Cheers, Eugene.

--
diff -Naur rsync-2.6.8/errcode.h rsync-2.6.8-new/errcode.h
--- rsync-2.6.8/errcode.h       Sat Dec 17 01:48:28 2005
+++ rsync-2.6.8-new/errcode.h   Wed May 24 16:19:59 2006
@@ -47,6 +47,8 @@
 
 #define RERR_TIMEOUT    30      /* timeout in data send/receive */
 
+#define RERR_CON_TIMEOUT 35
+
 /* Although it doesn't seem to be specified anywhere,
  * ssh and the shell seem to return these values:
  *
diff -Naur rsync-2.6.8/log.c rsync-2.6.8-new/log.c
--- rsync-2.6.8/log.c   Sat Apr  8 19:04:34 2006
+++ rsync-2.6.8-new/log.c       Wed May 24 16:19:27 2006
@@ -83,6 +83,7 @@
        { RERR_PARTIAL    , "some files could not be transferred" },
        { RERR_VANISHED   , "some files vanished before they could be 
transferred" },
        { RERR_TIMEOUT    , "timeout in data send/receive" },
+       { RERR_CON_TIMEOUT, "timeout in connect()" },
        { RERR_CMD_FAILED , "remote shell failed" },
        { RERR_CMD_KILLED , "remote shell killed" },
        { RERR_CMD_RUN    , "remote command could not be run" },
diff -Naur rsync-2.6.8/options.c rsync-2.6.8-new/options.c
--- rsync-2.6.8/options.c       Wed Mar 29 02:09:36 2006
+++ rsync-2.6.8-new/options.c   Wed May 24 15:50:43 2006
@@ -93,6 +93,7 @@
 int daemon_over_rsh = 0;
 int do_stats = 0;
 int do_progress = 0;
+int do_timeout = 0;
 int keep_partial = 0;
 int safe_symlinks = 0;
 int copy_unsafe_links = 0;
@@ -506,6 +507,7 @@
   {"from0",           '0', POPT_ARG_NONE,   &eol_nulls, 0, 0, 0},
   {"numeric-ids",      0,  POPT_ARG_NONE,   &numeric_ids, 0, 0, 0 },
   {"timeout",          0,  POPT_ARG_INT,    &io_timeout, 0, 0, 0 },
+  {"contimeout",       0,  POPT_ARG_INT,    &do_timeout, 0, 0, 0 },
   {"rsh",             'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 },
   {"rsync-path",       0,  POPT_ARG_STRING, &rsync_path, 0, 0, 0 },
   {"temp-dir",        'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 },
@@ -1612,6 +1614,12 @@
                        goto oom;
                args[ac++] = arg;
        }
+       
+       if (do_timeout) {
+               if (asprintf(&arg, "--contimeout=%d", do_timeout) < 0)
+                       goto oom;
+               args[ac++] = arg;
+       }
 
        if (bwlimit) {
                if (asprintf(&arg, "--bwlimit=%d", bwlimit) < 0)
diff -Naur rsync-2.6.8/rsync.yo rsync-2.6.8-new/rsync.yo
--- rsync-2.6.8/rsync.yo        Sat Apr 22 18:38:34 2006
+++ rsync-2.6.8-new/rsync.yo    Wed May 24 16:21:48 2006
@@ -2448,6 +2448,7 @@
 dit(bf(24)) Partial transfer due to vanished source files
 dit(bf(25)) The --max-delete limit stopped deletions
 dit(bf(30)) Timeout in data send/receive
+dit(bf(35)) Timeout in connect()
 enddit()
 
 manpagesection(ENVIRONMENT VARIABLES)
diff -Naur rsync-2.6.8/socket.c rsync-2.6.8-new/socket.c
--- rsync-2.6.8/socket.c        Tue Apr 11 03:48:28 2006
+++ rsync-2.6.8-new/socket.c    Wed May 24 16:22:48 2006
@@ -37,6 +37,7 @@
 
 extern char *bind_address;
 extern int default_af_hint;
+extern int do_timeout;
 
 #ifdef HAVE_SIGACTION
 static struct sigaction sigact;
@@ -162,6 +163,13 @@
        return -1;
 }
 
+/**
+ * connect() timeout handler based on alarm()
+ **/
+static RETSIGTYPE contimeout_handler(UNUSED(int val))
+{
+       exit_cleanup(RERR_CON_TIMEOUT);
+}
 
 /**
  * Open a socket to a tcp remote host with the specified port .
@@ -266,11 +274,23 @@
                        s = -1;
                        continue;
                }
+               if ( do_timeout > 0 )
+               {
+                       SIGACTION(SIGALRM, contimeout_handler);
+                       alarm(do_timeout);
+               }
+               
                if (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
                        close(s);
                        s = -1;
                        continue;
                }
+               
+               if ( do_timeout > 0 )
+               {
+                       alarm(0);
+               }
+               
                if (proxied
                 && establish_proxy_connection(s, host, port,
                                               proxy_user, proxy_pass) != 0) {
-- 
To unsubscribe or change options: https://lists.samba.org/mailman/listinfo/rsync
Before posting, read: http://www.catb.org/~esr/faqs/smart-questions.html

Reply via email to