My version of Matt's improvements related to missing source args:
[rsync/rsync.git] / socket.c
index 89f285a..3e70af2 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 1992-2001 Andrew Tridgell <tridge@samba.org>
  * Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
- * 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 <netinet/tcp.h>
 
 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];
 }