X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/50b31539c26885ec2ff9d566e771f7a1ac2a1e20..ab759cd27becb80df39eb1a90e88c74cd7e9be77:/main.c diff --git a/main.c b/main.c index 4f3fd909..008f2164 100644 --- a/main.c +++ b/main.c @@ -477,7 +477,7 @@ static int do_recv(int f_in,int f_out,struct file_list *flist,char *local_name) } if (fd_pair(error_pipe) < 0) { - rprintf(FERROR,"error pipe failed in do_recv\n"); + rsyserr(FERROR, errno, "pipe failed in do_recv"); exit_cleanup(RERR_SOCKETIO); } @@ -657,6 +657,16 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) if (protocol_version >= 23 && !read_batch) io_start_multiplex_in(); + /* We set our stderr file handle to blocking because ssh might have + * set it to non-blocking. This can be particularly troublesome if + * stderr is a clone of stdout, because ssh would have set our stdout + * to non-blocking at the same time (which can easily cause us to lose + * output from our print statements). This kluge shouldn't cause ssh + * any problems for how we use it. Note also that we delayed setting + * this until after the above protocol setup so that we know for sure + * that ssh is done twiddling its file descriptors. */ + set_blocking(STDERR_FILENO); + if (am_sender) { keep_dirlinks = 0; /* Must be disabled on the sender. */ io_start_buffering_out();