summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2000-04-09 02:16:42 +0000
committerAndrew Tridgell <tridge@samba.org>2000-04-09 02:16:42 +0000
commit36349ea0bea8eb341b69a90792ec2147fde19573 (patch)
treef2e514c890d6246e264f77ed079d0823625f9991 /util.c
parentec3f7d1b613b2c5f7ea5f83b25760c0de096acf1 (diff)
downloadrsync-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.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/util.c b/util.c
index 03a626eb..7c589b37 100644
--- a/util.c
+++ b/util.c
@@ -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));