X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/ba22c9e219ccd45fea318e7759a7fe4a7c3703dc..refs/heads/hacks/missing-args-b3.0.x:/socket.c diff --git a/socket.c b/socket.c index 89f285a2..3e70af2c 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-2007 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 @@ -31,6 +31,7 @@ #include extern char *bind_address; +extern char *sockopts; extern int default_af_hint; extern int connect_timeout; @@ -272,6 +273,7 @@ int open_socket_out(char *host, int port, const char *bind_addr, alarm(connect_timeout); } + set_socket_options(s, sockopts); while (connect(s, res->ai_addr, res->ai_addrlen) < 0) { if (connect_timeout < 0) exit_cleanup(RERR_CONTIMEOUT); @@ -433,6 +435,10 @@ static int *open_socket_in(int type, int port, const char *bind_addr, setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof one); + if (sockopts) + set_socket_options(s, sockopts); + else + set_socket_options(s, lp_socket_options()); #ifdef IPV6_V6ONLY if (resp->ai_family == AF_INET6) { @@ -572,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++) { @@ -817,6 +823,7 @@ static int socketpair_tcp(int fd[2]) **/ int sock_exec(const char *prog) { + pid_t pid; int fd[2]; if (socketpair_tcp(fd) != 0) { @@ -825,14 +832,23 @@ int sock_exec(const char *prog) } if (verbose >= 2) 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]; }