Fix include paths to new location of libutil.
[samba.git] / source4 / libcli / wrepl / winsrepl.c
index 1f7ca796b641e907e3d45d15fab83f773940e28d..84bda8c8585eaa99e497f7d982304abeff973ce7 100644 (file)
@@ -21,7 +21,7 @@
 
 #include "includes.h"
 #include "lib/events/events.h"
-#include "lib/util/dlinklist.h"
+#include "../lib/util/dlinklist.h"
 #include "lib/socket/socket.h"
 #include "libcli/wrepl/winsrepl.h"
 #include "librpc/gen_ndr/ndr_winsrepl.h"
@@ -29,6 +29,8 @@
 #include "libcli/composite/composite.h"
 #include "system/network.h"
 #include "lib/socket/netif.h"
+#include "param/param.h"
+#include "libcli/resolve/resolve.h"
 
 static struct wrepl_request *wrepl_request_finished(struct wrepl_request *req, NTSTATUS status);
 
@@ -100,8 +102,7 @@ static NTSTATUS wrepl_finish_recv(void *private, DATA_BLOB packet_blob_in)
        blob.length = packet_blob_in.length - 4;
        
        /* we have a full request - parse it */
-       ndr_err = ndr_pull_struct_blob(&blob,
-                                      req->packet, req->packet,
+       ndr_err = ndr_pull_struct_blob(&blob, req->packet, wrepl_socket->iconv_convenience, req->packet,
                                       (ndr_pull_flags_fn_t)ndr_pull_wrepl_packet);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
@@ -162,7 +163,8 @@ static int wrepl_socket_destructor(struct wrepl_socket *sock)
   operations will use that event context
 */
 struct wrepl_socket *wrepl_socket_init(TALLOC_CTX *mem_ctx, 
-                                      struct event_context *event_ctx)
+                                      struct event_context *event_ctx,
+                                      struct smb_iconv_convenience *iconv_convenience)
 {
        struct wrepl_socket *wrepl_socket;
        NTSTATUS status;
@@ -170,13 +172,11 @@ struct wrepl_socket *wrepl_socket_init(TALLOC_CTX *mem_ctx,
        wrepl_socket = talloc_zero(mem_ctx, struct wrepl_socket);
        if (!wrepl_socket) return NULL;
 
-       if (event_ctx == NULL) {
-               wrepl_socket->event.ctx = event_context_init(wrepl_socket);
-       } else {
-               wrepl_socket->event.ctx = talloc_reference(wrepl_socket, event_ctx);
-       }
+       wrepl_socket->event.ctx = talloc_reference(wrepl_socket, event_ctx);
        if (!wrepl_socket->event.ctx) goto failed;
 
+       wrepl_socket->iconv_convenience = iconv_convenience;
+
        status = socket_create("ip", SOCKET_TYPE_STREAM, &wrepl_socket->sock, 0);
        if (!NT_STATUS_IS_OK(status)) goto failed;
 
@@ -307,10 +307,19 @@ static void wrepl_connect_handler(struct composite_context *creq)
        composite_done(result);
 }
 
+const char *wrepl_best_ip(struct loadparm_context *lp_ctx, const char *peer_ip)
+{
+       struct interface *ifaces;
+       load_interfaces(lp_ctx, lp_interfaces(lp_ctx), &ifaces);
+       return iface_best_ip(ifaces, peer_ip);
+}
+
+
 /*
   connect a wrepl_socket to a WINS server
 */
 struct composite_context *wrepl_connect_send(struct wrepl_socket *wrepl_socket,
+                                            struct resolve_context *resolve_ctx,
                                             const char *our_ip, const char *peer_ip)
 {
        struct composite_context *result;
@@ -329,10 +338,6 @@ struct composite_context *wrepl_connect_send(struct wrepl_socket *wrepl_socket,
        state->result           = result;
        state->wrepl_socket     = wrepl_socket;
 
-       if (!our_ip) {
-               our_ip = iface_best_ip(peer_ip);
-       }
-
        us = socket_address_from_strings(state, wrepl_socket->sock->backend_name, 
                                         our_ip, 0);
        if (composite_nomem(us, result)) return result;
@@ -342,7 +347,8 @@ struct composite_context *wrepl_connect_send(struct wrepl_socket *wrepl_socket,
        if (composite_nomem(peer, result)) return result;
 
        state->creq = socket_connect_send(wrepl_socket->sock, us, peer,
-                                         0, wrepl_socket->event.ctx);
+                                         0, resolve_ctx,
+                                         wrepl_socket->event.ctx);
        composite_continue(result, state->creq, wrepl_connect_handler, state);
        return result;
 }
@@ -368,9 +374,10 @@ NTSTATUS wrepl_connect_recv(struct composite_context *result)
 /*
   connect a wrepl_socket to a WINS server - sync API
 */
-NTSTATUS wrepl_connect(struct wrepl_socket *wrepl_socket, const char *our_ip, const char *peer_ip)
+NTSTATUS wrepl_connect(struct wrepl_socket *wrepl_socket, struct resolve_context *resolve_ctx,
+                      const char *our_ip, const char *peer_ip)
 {
-       struct composite_context *c_req = wrepl_connect_send(wrepl_socket, our_ip, peer_ip);
+       struct composite_context *c_req = wrepl_connect_send(wrepl_socket, resolve_ctx, our_ip, peer_ip);
        return wrepl_connect_recv(c_req);
 }
 
@@ -487,7 +494,7 @@ struct wrepl_request *wrepl_request_send(struct wrepl_socket *wrepl_socket,
        }
 
        wrap.packet = *packet;
-       ndr_err = ndr_push_struct_blob(&blob, req, &wrap,
+       ndr_err = ndr_push_struct_blob(&blob, req, wrepl_socket->iconv_convenience, &wrap, 
                                       (ndr_push_flags_fn_t)ndr_push_wrepl_wrap);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                status = ndr_map_error2ntstatus(ndr_err);