X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/4f5b0756df0dfc925b9576db47ecce949c378e18..b03c719f04ceddf003f7910ed2d4e70e7e9d56fa:/clientserver.c diff --git a/clientserver.c b/clientserver.c index 4cfda808..0ed05145 100644 --- a/clientserver.c +++ b/clientserver.c @@ -27,15 +27,15 @@ #include "rsync.h" +extern int verbose; +extern int list_only; extern int am_sender; extern int am_server; extern int am_daemon; extern int am_root; -extern int verbose; extern int rsync_port; -extern int kludge_around_eof; +extern int kluge_around_eof; extern int daemon_over_rsh; -extern int list_only; extern int sanitize_paths; extern int filesfrom_fd; extern int remote_protocol; @@ -52,6 +52,8 @@ extern char *files_from; char *auth_user; int read_only = 0; +int daemon_log_format_has_i = 0; +int daemon_log_format_has_o_or_i = 0; int module_id = -1; /* Length of lp_path() string when in daemon mode & not chrooted, else 0. */ @@ -169,7 +171,7 @@ int start_inband_exchange(char *user, char *path, int f_in, int f_out, /* Old servers may just drop the connection here, rather than sending a proper EXIT command. Yuck. */ - kludge_around_eof = list_only && (protocol_version < 25); + kluge_around_eof = list_only && protocol_version < 25 ? 1 : 0; while (1) { if (!read_line(f_in, line, sizeof line - 1)) { @@ -202,7 +204,7 @@ int start_inband_exchange(char *user, char *path, int f_in, int f_out, rprintf(FINFO,"%s\n", line); } } - kludge_around_eof = False; + kluge_around_eof = 0; for (i = 0; i < sargc; i++) { io_printf(f_out, "%s\n", sargs[i]); @@ -283,6 +285,14 @@ static int rsync_module(int f_in, int f_out, int i) if (lp_read_only(i)) read_only = 1; + if (lp_transfer_logging(i)) { + if (strstr(lp_log_format(i), "%i") != NULL) + daemon_log_format_has_i = 1; + if (daemon_log_format_has_i + || strstr(lp_log_format(i), "%o") != NULL) + daemon_log_format_has_o_or_i = 1; + } + am_root = (MY_UID() == 0); if (am_root) { @@ -488,8 +498,24 @@ static int rsync_module(int f_in, int f_out, int i) * get the error back to the client. This means getting * the protocol setup finished first in later versions. */ setup_protocol(f_out, f_in); - if (files_from && !am_sender && strcmp(files_from, "-") != 0) - write_byte(f_out, 0); + if (!am_sender) { + /* Since we failed in our option parsing, we may not + * have finished parsing that the client sent us a + * --files-from option, so look for it manually. + * Without this, the socket would be in the wrong + * state for the upcoming error message. */ + if (!files_from) { + int i; + for (i = 0; i < argc; i++) { + if (strncmp(argv[i], "--files-from", 12) == 0) { + files_from = ""; + break; + } + } + } + if (files_from) + write_byte(f_out, 0); + } io_start_multiplex_out(); }