s4:wrepl_server: use SOCKET_FLAG_NOCLOSE instead of a dup()
authorStefan Metzmacher <metze@samba.org>
Tue, 28 Sep 2010 00:33:23 +0000 (02:33 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 28 Sep 2010 01:48:10 +0000 (03:48 +0200)
The key thing is that we might have to turn the incomming
connection into a outgoing connection.

This change makes sense anyway, because we donate the fd to
tstream.

metze

source4/wrepl_server/wrepl_in_connection.c

index 5fd24351104e102add50d2c2df3f1a48eb9a3e8a..a32b842e04aa0f55bb83ee6ca03614af70782126 100644 (file)
@@ -104,7 +104,7 @@ static void wreplsrv_accept(struct stream_connection *conn)
        struct tsocket_address *peer_addr;
        char *peer_ip;
        struct tevent_req *subreq;
-       int rc, fd;
+       int rc;
 
        wrepl_conn = talloc_zero(conn, struct wreplsrv_in_connection);
        if (wrepl_conn == NULL) {
@@ -122,30 +122,15 @@ static void wreplsrv_accept(struct stream_connection *conn)
 
        TALLOC_FREE(conn->event.fde);
 
-       /*
-        * Clone the fd that the connection isn't closed if we create a client
-        * connection.
-        */
-       fd = dup(socket_get_fd(conn->socket));
-       if (fd == -1) {
-               char *reason;
-
-               reason = talloc_asprintf(conn,
-                                        "wrepl_accept: failed to duplicate the file descriptor - %s",
-                                        strerror(errno));
-               if (reason == NULL) {
-                       reason = strerror(errno);
-               }
-               stream_terminate_connection(conn, reason);
-       }
        rc = tstream_bsd_existing_socket(wrepl_conn,
-                                        fd,
+                                        socket_get_fd(conn->socket),
                                         &wrepl_conn->tstream);
        if (rc < 0) {
                stream_terminate_connection(conn,
                                            "wrepl_accept: out of memory");
                return;
        }
+       socket_set_flags(conn->socket, SOCKET_FLAG_NOCLOSE);
 
        wrepl_conn->conn = conn;
        wrepl_conn->service = service;