r12804: This patch reworks the Samba4 sockets layer to use a socket_address
[mat/samba.git] / source4 / libcli / dgram / dgramsocket.c
index 143b9c309b563dc3eb7ed68865b808701aa84e39..326ec7e9083d9e3051485de3a7beb6a16ce3a246 100644 (file)
@@ -34,7 +34,7 @@ static void dgm_socket_recv(struct nbt_dgram_socket *dgmsock)
 {
        TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
        NTSTATUS status;
-       struct nbt_peer_socket src;
+       struct socket_address *src;
        DATA_BLOB blob;
        size_t nread, dsize;
        struct nbt_dgram_packet *packet;
@@ -53,16 +53,15 @@ static void dgm_socket_recv(struct nbt_dgram_socket *dgmsock)
        }
 
        status = socket_recvfrom(dgmsock->sock, blob.data, blob.length, &nread, 0,
-                                &src.addr, &src.port);
+                                tmp_ctx, &src);
        if (!NT_STATUS_IS_OK(status)) {
                talloc_free(tmp_ctx);
                return;
        }
-       talloc_steal(tmp_ctx, src.addr);
        blob.length = nread;
 
        DEBUG(2,("Received dgram packet of length %d from %s:%d\n", 
-                (int)blob.length, src.addr, src.port));
+                (int)blob.length, src->addr, src->port));
 
        packet = talloc(tmp_ctx, struct nbt_dgram_packet);
        if (packet == NULL) {
@@ -86,14 +85,14 @@ static void dgm_socket_recv(struct nbt_dgram_socket *dgmsock)
                struct dgram_mailslot_handler *dgmslot;
                dgmslot = dgram_mailslot_find(dgmsock, mailslot_name);
                if (dgmslot) {
-                       dgmslot->handler(dgmslot, packet, &src);
+                       dgmslot->handler(dgmslot, packet, src);
                } else {
                        DEBUG(2,("No mailslot handler for '%s'\n", mailslot_name));
                }
        } else {
                /* dispatch if there is a general handler */
                if (dgmsock->incoming.handler) {
-                       dgmsock->incoming.handler(dgmsock, packet, &src);
+                       dgmsock->incoming.handler(dgmsock, packet, src);
                }
        }
 
@@ -114,10 +113,10 @@ static void dgm_socket_send(struct nbt_dgram_socket *dgmsock)
                
                len = req->encoded.length;
                status = socket_sendto(dgmsock->sock, &req->encoded, &len, 0, 
-                                      req->dest.addr, req->dest.port);
+                                      req->dest);
                if (NT_STATUS_IS_ERR(status)) {
                        DEBUG(3,("Failed to send datagram of length %u to %s:%d: %s\n",
-                                (unsigned)req->encoded.length, req->dest.addr, req->dest.port, 
+                                (unsigned)req->encoded.length, req->dest->addr, req->dest->port, 
                                 nt_errstr(status)));
                        DLIST_REMOVE(dgmsock->send_queue, req);
                        talloc_free(req);
@@ -200,7 +199,7 @@ failed:
 NTSTATUS dgram_set_incoming_handler(struct nbt_dgram_socket *dgmsock,
                                    void (*handler)(struct nbt_dgram_socket *, 
                                                    struct nbt_dgram_packet *, 
-                                                   const struct nbt_peer_socket *),
+                                                   struct socket_address *),
                                    void *private)
 {
        dgmsock->incoming.handler = handler;
@@ -215,7 +214,7 @@ NTSTATUS dgram_set_incoming_handler(struct nbt_dgram_socket *dgmsock,
 */
 NTSTATUS nbt_dgram_send(struct nbt_dgram_socket *dgmsock,
                        struct nbt_dgram_packet *packet,
-                       const struct nbt_peer_socket *dest)
+                       struct socket_address *dest)
 {
        struct nbt_dgram_request *req;
        NTSTATUS status = NT_STATUS_NO_MEMORY;
@@ -223,9 +222,8 @@ NTSTATUS nbt_dgram_send(struct nbt_dgram_socket *dgmsock,
        req = talloc(dgmsock, struct nbt_dgram_request);
        if (req == NULL) goto failed;
 
-       req->dest.port = dest->port;
-       req->dest.addr = talloc_strdup(req, dest->addr);
-       if (req->dest.addr == NULL) goto failed;
+       req->dest = dest;
+       if (talloc_reference(req, dest) == NULL) goto failed;
 
        status = ndr_push_struct_blob(&req->encoded, req, packet, 
                                      (ndr_push_flags_fn_t)ndr_push_nbt_dgram_packet);