X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/36349ea0bea8eb341b69a90792ec2147fde19573..08e5094d7fc2e863b10438a4154580ea95576d59:/util.c diff --git a/util.c b/util.c index 7c589b37..d8d4e9d6 100644 --- a/util.c +++ b/util.c @@ -82,12 +82,22 @@ int fd_pair(int fd[2]) } -/* this is derived from CVS code */ +/* this is derived from CVS code + + note that in the child STDIN is set to blocking and STDOUT + is set to non-blocking. This is necessary as rsh relies on stdin being blocking + and ssh relies on stdout being non-blocking + + if blocking_io is set then use blocking io on both fds. That can be + used to cope with badly broken rsh implementations like the one on + solaris. + */ int piped_child(char **command,int *f_in,int *f_out) { int pid; int to_child_pipe[2]; int from_child_pipe[2]; + extern int blocking_io; if (fd_pair(to_child_pipe) < 0 || fd_pair(from_child_pipe) < 0) { @@ -116,6 +126,9 @@ int piped_child(char **command,int *f_in,int *f_out) if (from_child_pipe[1] != STDOUT_FILENO) close(from_child_pipe[1]); umask(orig_umask); set_blocking(STDIN_FILENO); + if (blocking_io) { + set_blocking(STDOUT_FILENO); + } execvp(command[0], command); rprintf(FERROR,"Failed to exec %s : %s\n", command[0],strerror(errno));