diff options
author | Andrew Tridgell <tridge@samba.org> | 2000-04-09 02:16:42 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2000-04-09 02:16:42 +0000 |
commit | 36349ea0bea8eb341b69a90792ec2147fde19573 (patch) | |
tree | f2e514c890d6246e264f77ed079d0823625f9991 /util.c | |
parent | ec3f7d1b613b2c5f7ea5f83b25760c0de096acf1 (diff) | |
download | rsync-36349ea0bea8eb341b69a90792ec2147fde19573.tar.gz |
a very simple fix - if I'd only thought if it last week :)
rsh relies on stdin being blocking
ssh relies on stdout being non-blocking
what we've done before is to set both stdin and stdout to either
blocking or non-blocking. Now I set stdin to blocking and stdout to
non-blocking. This seems to fix all cases I've tested.
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 23 |
1 files changed, 18 insertions, 5 deletions
@@ -28,10 +28,7 @@ extern int verbose; /**************************************************************************** -Set a fd into nonblocking mode. Uses POSIX O_NONBLOCK if available, -else -if SYSV use O_NDELAY -if BSD use FNDELAY +Set a fd into nonblocking mode ****************************************************************************/ void set_nonblocking(int fd) { @@ -45,6 +42,21 @@ void set_nonblocking(int fd) } } +/**************************************************************************** +Set a fd into blocking mode +****************************************************************************/ +void set_blocking(int fd) +{ + int val; + + if((val = fcntl(fd, F_GETFL, 0)) == -1) + return; + if (val & NONBLOCK_FLAG) { + val &= ~NONBLOCK_FLAG; + fcntl(fd, F_SETFL, val); + } +} + /* create a file descriptor pair - like pipe() but use socketpair if possible (because of blocking issues on pipes) @@ -70,7 +82,7 @@ int fd_pair(int fd[2]) } -/* this is taken from CVS */ +/* this is derived from CVS code */ int piped_child(char **command,int *f_in,int *f_out) { int pid; @@ -103,6 +115,7 @@ int piped_child(char **command,int *f_in,int *f_out) if (to_child_pipe[0] != STDIN_FILENO) close(to_child_pipe[0]); if (from_child_pipe[1] != STDOUT_FILENO) close(from_child_pipe[1]); umask(orig_umask); + set_blocking(STDIN_FILENO); execvp(command[0], command); rprintf(FERROR,"Failed to exec %s : %s\n", command[0],strerror(errno)); |