The branch, master has been updated via c0268d92 Some improvements for --msgs2stderr and --daemon. from da448cdc Mention the latest NEWS items.
https://git.samba.org/?p=rsync.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit c0268d9217ebe1affab268a86696c33caf21485c Author: Wayne Davison <wa...@opencoder.net> Date: Sun May 31 15:25:11 2020 -0700 Some improvements for --msgs2stderr and --daemon. - Set am_daemon to -1 (from 1) when the daemon is run via rsh. - Only disable --msgs2stderr for a normal (socket) daemon. - Forward a -q to the server if --msgs2stderr was also specified. - Added --no-msgs2stderr option to allow it to be overridden. ----------------------------------------------------------------------- Summary of changes: clientserver.c | 16 ++++++++++++--- log.c | 61 ++++++++++++++++++++++++++++------------------------------ options.c | 6 ++++-- rsync.yo | 23 +++++++++++++--------- 4 files changed, 60 insertions(+), 46 deletions(-) Changeset truncated at 500 lines: diff --git a/clientserver.c b/clientserver.c index a6c24cf3..3af97d84 100644 --- a/clientserver.c +++ b/clientserver.c @@ -30,6 +30,7 @@ extern int am_sender; extern int am_server; extern int am_daemon; extern int am_root; +extern int msgs2stderr; extern int rsync_port; extern int protect_args; extern int ignore_errors; @@ -543,7 +544,7 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char return -1; } - if (am_daemon && am_server) { + if (am_daemon > 0) { rprintf(FLOG, "rsync allowed access on module %s from %s (%s)\n", name, host, addr); } @@ -883,6 +884,8 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char orig_early_argv = NULL; munge_symlinks = save_munge_symlinks; /* The client mustn't control this. */ + if (am_daemon > 0) + msgs2stderr = 0; /* A non-rsh-run daemon doesn't have stderr for msgs. */ if (pre_exec_pid) { err_msg = finish_pre_exec(pre_exec_pid, pre_exec_arg_fd, pre_exec_error_fd, @@ -1029,7 +1032,7 @@ static void send_listing(int fd) static int load_config(int globals_only) { if (!config_file) { - if (am_server && am_root <= 0) + if (am_daemon < 0 && am_root <= 0) config_file = RSYNCD_USERCONF; else config_file = RSYNCD_SYSCONF; @@ -1047,6 +1050,13 @@ int start_daemon(int f_in, int f_out) char *p; int i; + /* At this point, am_server is only set for a daemon started via rsh. + * Because am_server gets forced on soon, we'll set am_daemon to -1 as + * a flag that can be checked later on to distinguish a normal daemon + * from an rsh-run daemon. */ + if (am_server) + am_daemon = -1; + io_set_sock_fds(f_in, f_out); /* We must load the config file before calling any function that @@ -1096,7 +1106,7 @@ int start_daemon(int f_in, int f_out) host = lp_reverse_lookup(-1) ? client_name(f_in) : undetermined_hostname; rprintf(FLOG, "connect from %s (%s)\n", host, addr); - if (!am_server) { + if (am_daemon > 0) { set_socket_options(f_in, "SO_KEEPALIVE"); set_nonblocking(f_in); } diff --git a/log.c b/log.c index 65386754..ded8045b 100644 --- a/log.c +++ b/log.c @@ -264,14 +264,13 @@ void rwrite(enum logcode code, const char *buf, int len, int is_utf8) exit_cleanup(RERR_MESSAGEIO); if (msgs2stderr) { - if (!am_daemon) { - if (code == FLOG) - return; - goto output_msg; - } - if (code == FCLIENT) - return; - code = FLOG; + /* A normal daemon can get msgs2stderr set if the socket is busted, so we + * change the message destination into an FLOG message in order to try to + * get some info about an abnormal-exit into the log file. An rsh daemon + * can have this set via user request, so we'll leave the code alone so + * that the msg gets logged and then sent to stderr after that. */ + if (am_daemon > 0 && code != FCLIENT) + code = FLOG; } else if (send_msgs_to_gen) { assert(!is_utf8); /* Pass the message to our sibling in native charset. */ @@ -307,10 +306,28 @@ void rwrite(enum logcode code, const char *buf, int len, int is_utf8) } else if (code == FLOG) return; - if (quiet && code == FINFO) - return; + switch (code) { + case FERROR_XFER: + got_xfer_error = 1; + /* FALL THROUGH */ + case FERROR: + case FWARNING: + f = stderr; + break; + case FINFO: + if (quiet) + return; + break; + //case FLOG: + //case FCLIENT: + //case FERROR_UTF8: + //case FERROR_SOCKET: + default: + fprintf(stderr, "Bad logcode in rwrite(): %d [%s]\n", (int)code, who_am_i()); + exit_cleanup(RERR_MESSAGEIO); + } - if (am_server) { + if (am_server && !msgs2stderr) { enum msgcode msg = (enum msgcode)code; if (protocol_version < 30) { if (msg == MSG_ERROR) @@ -321,33 +338,13 @@ void rwrite(enum logcode code, const char *buf, int len, int is_utf8) /* Pass the message to the non-server side. */ if (send_msg(msg, buf, len, !is_utf8)) return; - if (am_daemon) { + if (am_daemon > 0) { /* TODO: can we send the error to the user somehow? */ return; } f = stderr; } -output_msg: - switch (code) { - case FERROR_XFER: - got_xfer_error = 1; - /* FALL THROUGH */ - case FERROR: - case FERROR_UTF8: - case FERROR_SOCKET: - case FWARNING: - f = stderr; - break; - case FLOG: - case FINFO: - case FCLIENT: - break; - default: - fprintf(stderr, "Unknown logcode in rwrite(): %d [%s]\n", (int)code, who_am_i()); - exit_cleanup(RERR_MESSAGEIO); - } - if (output_needs_newline) { fputc('\n', f); output_needs_newline = 0; diff --git a/options.c b/options.c index 6a7e7aac..73f80ad2 100644 --- a/options.c +++ b/options.c @@ -731,7 +731,7 @@ void usage(enum logcode F) rprintf(F," -v, --verbose increase verbosity\n"); rprintf(F," --info=FLAGS fine-grained informational verbosity\n"); rprintf(F," --debug=FLAGS fine-grained debug verbosity\n"); - rprintf(F," --msgs2stderr special output handling for debugging\n"); + rprintf(F," --msgs2stderr output messages directly to stderr\n"); rprintf(F," -q, --quiet suppress non-error messages\n"); rprintf(F," --no-motd suppress daemon-mode MOTD (see manpage caveat)\n"); rprintf(F," -c, --checksum skip based on checksum, not mod-time & size\n"); @@ -901,6 +901,7 @@ static struct poptOption long_options[] = { {"info", 0, POPT_ARG_STRING, 0, OPT_INFO, 0, 0 }, {"debug", 0, POPT_ARG_STRING, 0, OPT_DEBUG, 0, 0 }, {"msgs2stderr", 0, POPT_ARG_NONE, &msgs2stderr, 0, 0, 0 }, + {"no-msgs2stderr", 0, POPT_ARG_VAL, &msgs2stderr, 0, 0, 0 }, {"quiet", 'q', POPT_ARG_NONE, 0, 'q', 0, 0 }, {"motd", 0, POPT_ARG_VAL, &output_motd, 1, 0, 0 }, {"no-motd", 0, POPT_ARG_VAL, &output_motd, 0, 0, 0 }, @@ -2578,7 +2579,8 @@ void server_options(char **args, int *argc_p) for (i = 0; i < verbose; i++) argstr[x++] = 'v'; - /* the -q option is intentionally left out */ + if (quiet && msgs2stderr) + argstr[x++] = 'q'; if (make_backups) argstr[x++] = 'b'; if (update_only) diff --git a/rsync.yo b/rsync.yo index 37421c94..02481084 100644 --- a/rsync.yo +++ b/rsync.yo @@ -342,7 +342,7 @@ to the detailed description below for a complete description. verb( -v, --verbose increase verbosity --info=FLAGS fine-grained informational verbosity --debug=FLAGS fine-grained debug verbosity - --msgs2stderr special output handling for debugging + --msgs2stderr output messages directly to stderr -q, --quiet suppress non-error messages --no-motd suppress daemon-mode MOTD (see caveat) -c, --checksum skip based on checksum, not mod-time & size @@ -584,15 +584,20 @@ verb( rsync -aiv {-M,}--debug=del2 src/ dest/ ) dit(bf(--msgs2stderr)) This option changes rsync to send all its output directly to stderr rather than to send messages to the client side via the -protocol (which normally outputs info messages via stdout). This is mainly -intended for debugging in order to avoid changing the data sent via the -protocol, since the extra protocol data can change what is being tested. +protocol. The protocol allows rsync to output normal messages via stdout and +errors via stderr, but it can delay messages behind a slew of data. + +One case where this is helpful is when sending really large files, since errors +that happen on a remote receiver tend to get delayed until afer the file's data +is fully sent. It is also helpful for debugging, since it helps to avoid +overpopulating the protocol data with extra message data. + The option does not affect the remote side of a transfer without using -bf(--remote-option) -- e.g. bf(-M--msgs2stderr). -Also keep in mind that a daemon connection does not have a stderr channel to send -messages back to the client side, so if you are doing any daemon-transfer -debugging using this option, you should start up a daemon using bf(--no-detach) -so that you can see the stderr output on the daemon side. +bf(--remote-option) -- e.g. bf(-M--msgs2stderr) or bf({-M,}--msgs2stderr). + +Also keep in mind that connecting to a normal (non-remote-shell) daemon does +not have a stderr channel to send messages back to the client side, so a modern +rsync only allows the option on a remote-shell-run daemon. This option has the side-effect of making stderr output get line-buffered so that the merging of the output of 3 programs happens in a more readable manner. -- The rsync repository. _______________________________________________ rsync-cvs mailing list rsync-cvs@lists.samba.org https://lists.samba.org/mailman/listinfo/rsync-cvs