X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/705132bceed54d18fb38aefa3f976b4c402cb7b8..2b2a47383124f9b62834778f61d2ccb1e55f6a0d:/main.c diff --git a/main.c b/main.c index a8f285af..59550013 100644 --- a/main.c +++ b/main.c @@ -29,6 +29,7 @@ extern int dry_run; extern int list_only; +extern int io_timeout; extern int am_root; extern int am_server; extern int am_sender; @@ -72,6 +73,9 @@ 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; extern char *stdout_format; extern char *logfile_format; @@ -91,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; @@ -392,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; @@ -403,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; @@ -535,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: @@ -725,6 +733,8 @@ static void read_final_goodbye(int f_in, int f_out) uchar fnamecmp_type; char xname[MAXPATHLEN]; + shutting_down = True; + if (protocol_version < 29) i = read_int(f_in); else { @@ -755,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()); @@ -843,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]); @@ -894,6 +907,8 @@ 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); if (write_batch && !am_server) @@ -920,6 +935,7 @@ static int do_recv(int f_in, int f_out, char *local_name) handle_stats(-1); io_flush(FULL_FLUSH); + shutting_down = True; if (protocol_version >= 24) { /* send a final goodbye message */ write_ndx(f_out, NDX_DONE); @@ -1051,6 +1067,8 @@ void start_server(int f_in, int f_out, int argc, char *argv[]) if (protocol_version >= 23) io_start_multiplex_out(f_out); + if (am_daemon && io_timeout && protocol_version >= 31) + send_msg_int(MSG_IO_TIMEOUT, io_timeout); if (am_sender) { keep_dirlinks = 0; /* Must be disabled on the sender. */ @@ -1094,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') @@ -1355,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,