X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/8dad7fc6eace2c406c279ce98a00653085c700ca..b31c92edcc11995daa5c90ec280010a1e2c5b64d:/clientserver.c diff --git a/clientserver.c b/clientserver.c index 87916017..531944aa 100644 --- a/clientserver.c +++ b/clientserver.c @@ -87,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) @@ -498,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(); }