From f9bb8f76ee728bd1391a2b4890ce0281457a7bf2 Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Sat, 25 Jul 2020 09:15:41 -0700 Subject: [PATCH] Change daemon variable & simplify some option code - Rename daemon_over_rsh -> daemon_connection since it is also used to indicate if a non-rsh daemon connection is active. - Move the daemon-over-rsh exception out of server_options() to the one caller that needs that behavior. - Don't allow noop_io_until_death() to be short-circuited when talking to a daemon over a socket, because it can't send errors via stderr. --- clientserver.c | 5 ----- io.c | 7 ++++++- main.c | 28 ++++++++++++++++------------ options.c | 8 -------- 4 files changed, 22 insertions(+), 26 deletions(-) diff --git a/clientserver.c b/clientserver.c index f324a989..0f54dcab 100644 --- a/clientserver.c +++ b/clientserver.c @@ -37,7 +37,6 @@ extern int protect_args; extern int ignore_errors; extern int preserve_xattrs; extern int kluge_around_eof; -extern int daemon_over_rsh; extern int munge_symlinks; extern int open_noatime; extern int sanitize_paths; @@ -282,10 +281,6 @@ int start_inband_exchange(int f_in, int f_out, const char *user, int argc, char fclose(f); } - /* set daemon_over_rsh to false since we need to build the - * true set of args passed through the rsh/ssh connection; - * this is a no-op for direct-socket-connection mode */ - daemon_over_rsh = 0; server_options(sargs, &sargc); if (sargc >= MAX_ARGS - 2) diff --git a/io.c b/io.c index fe4a8778..b50a066c 100644 --- a/io.c +++ b/io.c @@ -54,6 +54,7 @@ extern int read_batch; extern int compat_flags; extern int protect_args; extern int checksum_seed; +extern int daemon_connection; extern int protocol_version; extern int remove_source_files; extern int preserve_hard_links; @@ -917,7 +918,11 @@ void noop_io_until_death(void) { char buf[1024]; - if (!iobuf.in.buf || !iobuf.out.buf || iobuf.in_fd < 0 || iobuf.out_fd < 0 || kluge_around_eof || msgs2stderr) + if (!iobuf.in.buf || !iobuf.out.buf || iobuf.in_fd < 0 || iobuf.out_fd < 0 || kluge_around_eof) + return; + + /* If we're talking to a daemon over a socket, don't short-circuit this logic */ + if (msgs2stderr && daemon_connection >= 0) return; kluge_around_eof = 2; diff --git a/main.c b/main.c index 04b32e74..e68d73c4 100644 --- a/main.c +++ b/main.c @@ -108,7 +108,7 @@ gid_t our_gid; 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; +int daemon_connection = 0; /* 0 = no daemon, 1 = daemon via remote shell, -1 = daemon via socket */ mode_t orig_umask = 0; int batch_gen_fd = -1; int sender_keeps_checksum = 0; @@ -566,12 +566,12 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in #ifdef HAVE_REMSH /* remsh (on HPUX) takes the arguments the other way around */ args[argc++] = machine; - if (user && !(daemon_over_rsh && dash_l_set)) { + if (user && !(daemon_connection && dash_l_set)) { args[argc++] = "-l"; args[argc++] = user; } #else - if (user && !(daemon_over_rsh && dash_l_set)) { + if (user && !(daemon_connection && dash_l_set)) { args[argc++] = "-l"; args[argc++] = user; } @@ -591,7 +591,11 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in if (blocking_io < 0 && (strcmp(t, "rsh") == 0 || strcmp(t, "remsh") == 0)) blocking_io = 1; - server_options(args, &argc); + if (daemon_connection > 0) { + args[argc++] = "--server"; + args[argc++] = "--daemon"; + } else + server_options(args, &argc); if (argc >= MAX_ARGS - 2) goto arg_overflow; @@ -599,7 +603,7 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in args[argc++] = "."; - if (!daemon_over_rsh) { + if (!daemon_connection) { while (remote_argc > 0) { if (argc >= MAX_ARGS - 1) { arg_overflow: @@ -652,7 +656,7 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in #ifdef ICONV_CONST setup_iconv(); #endif - if (protect_args && !daemon_over_rsh) + if (protect_args && !daemon_connection) send_protected_args(*f_out_p, args); } @@ -1407,7 +1411,7 @@ static int start_client(int argc, char *argv[]) } am_sender = 0; if (rsync_port) - daemon_over_rsh = shell_cmd ? 1 : -1; + daemon_connection = shell_cmd ? 1 : -1; } else { /* source is local, check dest arg */ am_sender = 1; @@ -1439,7 +1443,7 @@ static int start_client(int argc, char *argv[]) } else { /* hostspec was found, so dest is remote */ argv[argc] = path; if (rsync_port) - daemon_over_rsh = shell_cmd ? 1 : -1; + daemon_connection = shell_cmd ? 1 : -1; } } } else { /* read_batch */ @@ -1502,10 +1506,10 @@ static int start_client(int argc, char *argv[]) else env_port = rsync_port; - if (daemon_over_rsh < 0) + if (daemon_connection < 0) return start_socket_client(shell_machine, remote_argc, remote_argv, argc, argv); - if (password_file && !daemon_over_rsh) { + if (password_file && !daemon_connection) { rprintf(FERROR, "The --password-file option may only be " "used when accessing an rsync daemon.\n"); exit_cleanup(RERR_SYNTAX); @@ -1533,7 +1537,7 @@ static int start_client(int argc, char *argv[]) } #ifdef HAVE_PUTENV - if (daemon_over_rsh) + if (daemon_connection) set_env_num("RSYNC_PORT", env_port); #endif @@ -1541,7 +1545,7 @@ static int start_client(int argc, char *argv[]) /* if we're running an rsync server on the remote host over a * remote shell command, we need to do the RSYNCD protocol first */ - if (daemon_over_rsh) { + if (daemon_connection) { int tmpret; tmpret = start_inband_exchange(f_in, f_out, shell_user, remote_argc, remote_argv); if (tmpret < 0) diff --git a/options.c b/options.c index 3e74a086..3304cbae 100644 --- a/options.c +++ b/options.c @@ -28,7 +28,6 @@ extern int module_id; extern int local_server; extern int sanitize_paths; -extern int daemon_over_rsh; extern unsigned int module_dirlen; extern struct name_num_obj valid_checksums; extern struct name_num_obj valid_compressions; @@ -2683,13 +2682,6 @@ void server_options(char **args, int *argc_p) /* This should always remain first on the server's command-line. */ args[ac++] = "--server"; - if (daemon_over_rsh > 0) { - args[ac++] = "--daemon"; - *argc_p = ac; - /* if we're passing --daemon, we're done */ - return; - } - if (!am_sender) args[ac++] = "--sender"; -- 2.34.1