X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/4875d6b64dd0ed8d451746cc0cc609cff36192bd..b31c92edcc11995daa5c90ec280010a1e2c5b64d:/clientserver.c diff --git a/clientserver.c b/clientserver.c index 4007bffe..531944aa 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. */ @@ -85,15 +87,12 @@ int start_socket_client(char *host, char *path, int argc, char *argv[]) return -1; } - if ((p = strchr(host, '@')) != NULL) { + if ((p = strrchr(host, '@')) != NULL) { user = host; host = p+1; *p = '\0'; } - if (rsync_port == 0) - rsync_port = RSYNC_PORT; - fd = open_socket_out_wrapped(host, rsync_port, bind_address, default_af_hint); if (fd == -1) @@ -169,7 +168,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 +201,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 +282,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) { @@ -398,7 +405,7 @@ static int rsync_module(int f_in, int f_out, int i) io_printf(f_out, "@ERROR: setgid failed\n"); return -1; } -#if HAVE_SETGROUPS +#ifdef HAVE_SETGROUPS /* Get rid of any supplementary groups this process * might have inheristed. */ if (setgroups(1, &gid)) { @@ -488,8 +495,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(); }