r10638: - add wrepl_socket_merge() function that creates a wrepl_socket on top
authorStefan Metzmacher <metze@samba.org>
Fri, 30 Sep 2005 01:55:29 +0000 (01:55 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:39:14 +0000 (13:39 -0500)
  of an existing socket, that is needed to handle WREPL_REPL_UPDATE
  in the server, because we need to flig the connection and act as client on it

metze
(This used to be commit 131e5dfe695d427e992b840439743f880b14d82d)

source4/include/structs.h
source4/libcli/wrepl/winsrepl.c

index 9d30e64dbc2ad2758e8b421b9cfa56a4a9a4a20e..ea904207530f914d1d057a10c92dd9480abe2634 100644 (file)
@@ -298,3 +298,5 @@ struct ldb_map_objectclass;
 struct param_context;
 struct param_section;
 struct param;
+
+struct socket_context;
index aae77feb294b3b8cfafc0b71ccc847923dc64d01..aba3fc817e27f239f2e1da1f4aa46d2928f11bef 100644 (file)
@@ -327,9 +327,52 @@ struct wrepl_socket *wrepl_socket_init(TALLOC_CTX *mem_ctx,
                                         socket_get_fd(wrepl_socket->sock), 
                                         EVENT_FD_WRITE,
                                         wrepl_connect_handler, wrepl_socket);
+       if (wrepl_socket->fde == NULL) {
+               goto failed;
+       }
 
        set_blocking(socket_get_fd(wrepl_socket->sock), False);
 
+       talloc_set_destructor(wrepl_socket, wrepl_socket_destructor);
+
+       return wrepl_socket;
+
+failed:
+       talloc_free(wrepl_socket);
+       return NULL;
+}
+
+/*
+  initialise a wrepl_socket from an already existing connection
+*/
+struct wrepl_socket *wrepl_socket_merge(TALLOC_CTX *mem_ctx, 
+                                       struct event_context *event_ctx,
+                                       struct socket_context *socket)
+{
+       struct wrepl_socket *wrepl_socket;
+
+       wrepl_socket = talloc(mem_ctx, struct wrepl_socket);
+       if (wrepl_socket == NULL) goto failed;
+
+       wrepl_socket->event_ctx = talloc_reference(wrepl_socket, event_ctx);
+       if (wrepl_socket->event_ctx == NULL) goto failed;
+
+       wrepl_socket->sock = socket;
+       talloc_steal(wrepl_socket, wrepl_socket->sock);
+
+       wrepl_socket->send_queue        = NULL;
+       wrepl_socket->recv_queue        = NULL;
+       wrepl_socket->request_timeout   = WREPL_SOCKET_REQUEST_TIMEOUT;
+       wrepl_socket->dead              = False;
+
+       wrepl_socket->fde = event_add_fd(wrepl_socket->event_ctx, wrepl_socket,
+                                        socket_get_fd(wrepl_socket->sock), 
+                                        0,
+                                        wrepl_handler, wrepl_socket);
+       if (wrepl_socket->fde == NULL) {
+               goto failed;
+       }
+
        talloc_set_destructor(wrepl_socket, wrepl_socket_destructor);
        
        return wrepl_socket;