X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/1c3e6e8b2611f85cdf3ada054ef2c419ecaf399c..ce66f41791ab9e3c684a2089da28f23943d720b8:/socket.c diff --git a/socket.c b/socket.c index 8d4a89db..5df3a500 100644 --- a/socket.c +++ b/socket.c @@ -3,7 +3,7 @@ * * Copyright (C) 1992-2001 Andrew Tridgell * Copyright (C) 2001, 2002 Martin Pool - * Copyright (C) 2003-2008 Wayne Davison + * Copyright (C) 2003-2009 Wayne Davison * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,7 +25,7 @@ * emulate it using the KAME implementation. */ #include "rsync.h" -#include "ifuncs.h" +#include "itypes.h" #include #include #include @@ -232,7 +232,7 @@ int open_socket_out(char *host, int port, const char *bind_addr, } *cp++ = '\0'; strlcpy(portbuf, cp, sizeof portbuf); - if (verbose >= 2) { + if (DEBUG_GTE(CONNECT, 1)) { rprintf(FINFO, "connection via http proxy %s port %s\n", h, portbuf); } @@ -361,7 +361,7 @@ int open_socket_out_wrapped(char *host, int port, const char *bind_addr, *t = '\0'; } - if (verbose >= 2) { + if (DEBUG_GTE(CONNECT, 1)) { rprintf(FINFO, "%sopening tcp connection to %s port %d\n", prog ? "Using RSYNC_CONNECT_PROG instead of " : "", host, port); @@ -473,7 +473,7 @@ static int *open_socket_in(int type, int port, const char *bind_addr, /* Only output the socket()/bind() messages if we were totally * unsuccessful, or if the daemon is being run with -vv. */ for (s = 0; s < ecnt; s++) { - if (!i || verbose > 1) + if (!i || DEBUG_GTE(BIND, 1)) rwrite(FLOG, errmsgs[s], strlen(errmsgs[s]), 0); free(errmsgs[s]); } @@ -578,7 +578,7 @@ void start_accept_loop(int port, int (*fn)(int, int)) fds = deffds; #endif - if (select(maxfd + 1, &fds, NULL, NULL, NULL) != 1) + if (select(maxfd + 1, &fds, NULL, NULL, NULL) < 1) continue; for (i = 0, fd = -1; sp[i] >= 0; i++) { @@ -823,22 +823,32 @@ static int socketpair_tcp(int fd[2]) **/ int sock_exec(const char *prog) { + pid_t pid; int fd[2]; if (socketpair_tcp(fd) != 0) { rsyserr(FERROR, errno, "socketpair_tcp failed"); return -1; } - if (verbose >= 2) + if (DEBUG_GTE(CMD, 1)) rprintf(FINFO, "Running socket program: \"%s\"\n", prog); - if (fork() == 0) { + + pid = fork(); + if (pid < 0) { + rsyserr(FERROR, errno, "fork"); + exit_cleanup(RERR_IPC); + } + + if (pid == 0) { close(fd[0]); - close(0); - close(1); - dup(fd[1]); - dup(fd[1]); + if (dup2(fd[1], STDIN_FILENO) < 0 + || dup2(fd[1], STDOUT_FILENO) < 0) { + fprintf(stderr, "Failed to run \"%s\"\n", prog); + exit(1); + } exit(system(prog)); } + close(fd[1]); return fd[0]; }