}
-/* 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) {
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));