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;
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;
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;
cmd = rsh_env;
if (!cmd)
cmd = RSYNC_RSH;
- cmd = strdup(cmd); /*MEMORY LEAK*/
+ cmd = need_to_free = strdup(cmd);
if (!cmd)
goto oom;
send_protected_args(*f_out_p, args);
}
+ if (need_to_free)
+ free(need_to_free);
+
return pid;
oom:
uchar fnamecmp_type;
char xname[MAXPATHLEN];
+ shutting_down = True;
+
if (protocol_version < 29)
i = read_int(f_in);
else {
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());
}
if (pid == 0) {
+ am_receiver = 1;
send_msgs_to_gen = am_server;
close(error_pipe[0]);
}
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)
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);
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')
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,