X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/08f15335b5b469b29cbdacd0fc5ba48d76acf280..14175f1e7700e4e800692fc2c466cbd27a60176e:/util.c diff --git a/util.c b/util.c index a0e2707e..7c589b37 100644 --- a/util.c +++ b/util.c @@ -26,19 +26,63 @@ extern int verbose; -/* create a file descriptor - like pipe() but use socketpair if - possible (because of blocking issues on pipes */ + +/**************************************************************************** +Set a fd into nonblocking mode +****************************************************************************/ +void set_nonblocking(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); + } +} + +/**************************************************************************** +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) + + always set non-blocking + */ int fd_pair(int fd[2]) { + int ret; + #if HAVE_SOCKETPAIR - return socketpair(AF_UNIX, SOCK_STREAM, 0, fd); + ret = socketpair(AF_UNIX, SOCK_STREAM, 0, fd); #else - return pipe(fd); + ret = pipe(fd); #endif + + if (ret == 0) { + set_nonblocking(fd[0]); + set_nonblocking(fd[1]); + } + + return ret; } -/* this is taken from CVS */ +/* this is derived from CVS code */ int piped_child(char **command,int *f_in,int *f_out) { int pid; @@ -71,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));