Improve handling of MSG_IO_ERROR message.
[rsync/rsync.git] / main.c
diff --git a/main.c b/main.c
index a2bf010..5955001 100644 (file)
--- a/main.c
+++ b/main.c
@@ -73,6 +73,7 @@ extern int send_msgs_to_gen;
 extern pid_t cleanup_child_pid;
 extern size_t bwlimit_writemax;
 extern unsigned int module_dirlen;
+extern BOOL we_send_keepalive_messages;
 extern BOOL flist_receiving_enabled;
 extern BOOL shutting_down;
 extern struct stats stats;
@@ -94,7 +95,8 @@ extern filter_rule_list daemon_filter_list;
 
 uid_t our_uid;
 gid_t our_gid;
-int am_generator = 0;
+int am_receiver = 0;  /* Only set to 1 after the receiver/generator fork. */
+int am_generator = 0; /* Only set to 1 after the receiver/generator fork. */
 int local_server = 0;
 int daemon_over_rsh = 0;
 mode_t orig_umask = 0;
@@ -395,7 +397,7 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in
                    int *f_in_p, int *f_out_p)
 {
        int i, argc = 0;
-       char *args[MAX_ARGS];
+       char *args[MAX_ARGS], *need_to_free = NULL;
        pid_t pid;
        int dash_l_set = 0;
 
@@ -406,7 +408,7 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in
                        cmd = rsh_env;
                if (!cmd)
                        cmd = RSYNC_RSH;
-               cmd = strdup(cmd); /*MEMORY LEAK*/
+               cmd = need_to_free = strdup(cmd);
                if (!cmd)
                        goto oom;
 
@@ -538,6 +540,9 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in
                        send_protected_args(*f_out_p, args);
        }
 
+       if (need_to_free)
+               free(need_to_free);
+
        return pid;
 
   oom:
@@ -760,6 +765,8 @@ static void do_server_sender(int f_in, int f_out, int argc, char *argv[])
        struct file_list *flist;
        char *dir = argv[0];
 
+       we_send_keepalive_messages = io_timeout != 0 && protocol_version < 31;
+
        if (DEBUG_GTE(SEND, 1)) {
                rprintf(FINFO, "server_sender starting pid=%ld\n",
                        (long)getpid());
@@ -848,6 +855,7 @@ static int do_recv(int f_in, int f_out, char *local_name)
        }
 
        if (pid == 0) {
+               am_receiver = 1;
                send_msgs_to_gen = am_server;
 
                close(error_pipe[0]);
@@ -899,6 +907,7 @@ static int do_recv(int f_in, int f_out, char *local_name)
        }
 
        am_generator = 1;
+       we_send_keepalive_messages = io_timeout != 0;
        flist_receiving_enabled = True;
 
        io_end_multiplex_in(MPLX_SWITCHING);
@@ -1103,6 +1112,7 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[])
 
        if (am_sender) {
                keep_dirlinks = 0; /* Must be disabled on the sender. */
+               we_send_keepalive_messages = io_timeout != 0 && protocol_version < 31;
 
                if (always_checksum
                 && (log_format_has(stdout_format, 'C')
@@ -1364,7 +1374,7 @@ static int start_client(int argc, char *argv[])
        if (DEBUG_GTE(CMD, 2)) {
                rprintf(FINFO,"cmd=%s machine=%s user=%s path=%s\n",
                        NS(shell_cmd), NS(shell_machine), NS(shell_user),
-                       remote_argv ? NS(remote_argv[0]) : "");
+                       NS(remote_argv[0]));
        }
 
        pid = do_cmd(shell_cmd, shell_machine, shell_user, remote_argv, remote_argc,