r10997: r11980@SERNOX (orig r10037): metze | 2005-09-05 14:21:40 +0200
authorStefan Metzmacher <metze@samba.org>
Fri, 14 Oct 2005 12:22:15 +0000 (12:22 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:39:52 +0000 (13:39 -0500)
 add struct nbt_peer_socket and use it instead of passing const char *addr, uint16 port everyhwere

 (tridge: can you review this please, (make test works)

 metze
(This used to be commit a599d7a4ae881c94be2c2d908a398838549942bb)

22 files changed:
source4/include/structs.h
source4/libcli/dgram/browse.c
source4/libcli/dgram/dgramsocket.c
source4/libcli/dgram/libdgram.h
source4/libcli/dgram/mailslot.c
source4/libcli/dgram/netlogon.c
source4/libcli/dgram/ntlogon.c
source4/libcli/nbt/libnbt.h
source4/libcli/nbt/namequery.c
source4/libcli/nbt/namerefresh.c
source4/libcli/nbt/nameregister.c
source4/libcli/nbt/namerelease.c
source4/libcli/nbt/nbtsocket.c
source4/librpc/idl/nbt.idl
source4/nbt_server/defense.c
source4/nbt_server/interfaces.c
source4/nbt_server/nodestatus.c
source4/nbt_server/packet.c
source4/nbt_server/query.c
source4/nbt_server/wins/winsserver.c
source4/nbt_server/wins/winswack.c
source4/torture/nbt/dgram.c

index e67eca5c5c442e2d7f3529e209b42a0cce578c63..bd0ebc5a27e4fc49f763c713de8a26d619045009 100644 (file)
@@ -246,6 +246,8 @@ struct nbt_name_refresh_wins;
 struct nbt_name_register_wins;
 struct nbt_name_request;
 
+struct nbt_peer_socket;
+
 struct nbt_dgram_packet;
 struct nbt_dgram_socket;
 struct dgram_mailslot_handler;
index a304db9c9d49635be1c2ded1d8f19a1aed41608f..d6813b36b9b3c9264b134219f38edcdeecc48b83 100644 (file)
@@ -29,7 +29,7 @@
 #include "librpc/gen_ndr/ndr_nbt.h"
 
 NTSTATUS dgram_mailslot_browse_send(struct nbt_dgram_socket *dgmsock,
-     struct nbt_name *dest_name, const char *dest_address, int dest_port,
+     struct nbt_name *dest_name, const struct nbt_peer_socket *dest,
      struct nbt_name *src_name, struct nbt_browse_packet *request)
 {
        NTSTATUS status;
@@ -45,7 +45,7 @@ NTSTATUS dgram_mailslot_browse_send(struct nbt_dgram_socket *dgmsock,
 
        status = dgram_mailslot_send(dgmsock, DGRAM_DIRECT_UNIQUE, 
                                     NBT_MAILSLOT_BROWSE,
-                                    dest_name, dest_address, dest_port
+                                    dest_name, dest, 
                                     src_name, &blob);
        talloc_free(tmp_ctx);
        return status;
@@ -59,6 +59,7 @@ NTSTATUS dgram_mailslot_browse_reply(struct nbt_dgram_socket *dgmsock,
        DATA_BLOB blob;
        TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
        struct nbt_name myname;
+       struct nbt_peer_socket dest;
 
        status = ndr_push_struct_blob(&blob, tmp_ctx, reply, 
                                      (ndr_push_flags_fn_t)ndr_push_nbt_browse_packet);
@@ -69,10 +70,12 @@ NTSTATUS dgram_mailslot_browse_reply(struct nbt_dgram_socket *dgmsock,
 
        make_nbt_name_client(&myname, lp_netbios_name());
 
+       dest.port = request->src_port;
+       dest.addr = request->src_addr;
        status = dgram_mailslot_send(dgmsock, DGRAM_DIRECT_UNIQUE, 
                                     mailslot_name,
                                     &request->data.msg.source_name,
-                                    request->source, request->src_port,
+                                    &dest,
                                     &myname, &blob);
        talloc_free(tmp_ctx);
        return status;
index e66e5ed52e5de76eed64bdb677630669ea1e3391..decbc0225cfd90002193138fa9c9988047557a96 100644 (file)
@@ -35,8 +35,7 @@ static void dgm_socket_recv(struct nbt_dgram_socket *dgmsock)
 {
        TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
        NTSTATUS status;
-       const char *src_addr;
-       int src_port;
+       struct nbt_peer_socket src;
        DATA_BLOB blob;
        size_t nread, dsize;
        struct nbt_dgram_packet *packet;
@@ -55,16 +54,16 @@ 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);
+                                &src.addr, &src.port);
        if (!NT_STATUS_IS_OK(status)) {
                talloc_free(tmp_ctx);
                return;
        }
-       talloc_steal(tmp_ctx, src_addr);
+       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) {
@@ -88,14 +87,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_addr, src_port);
+                       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_addr, src_port);
+                       dgmsock->incoming.handler(dgmsock, packet, &src);
                }
        }
 
@@ -116,10 +115,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.addr, req->dest.port);
                if (NT_STATUS_IS_ERR(status)) {
                        DEBUG(3,("Failed to send datagram of length %u to %s:%d\n",
-                                (unsigned)req->encoded.length, req->dest_addr, req->dest_port));
+                                (unsigned)req->encoded.length, req->dest.addr, req->dest.port));
                        DLIST_REMOVE(dgmsock->send_queue, req);
                        talloc_free(req);
                        continue;
@@ -201,7 +200,7 @@ failed:
 NTSTATUS dgram_set_incoming_handler(struct nbt_dgram_socket *dgmsock,
                                    void (*handler)(struct nbt_dgram_socket *, 
                                                    struct nbt_dgram_packet *, 
-                                                   const char *, int ),
+                                                   const struct nbt_peer_socket *),
                                    void *private)
 {
        dgmsock->incoming.handler = handler;
@@ -216,8 +215,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 char *dest_addr,
-                       int dest_port)
+                       const struct nbt_peer_socket *dest)
 {
        struct nbt_dgram_request *req;
        NTSTATUS status = NT_STATUS_NO_MEMORY;
@@ -225,9 +223,9 @@ NTSTATUS nbt_dgram_send(struct nbt_dgram_socket *dgmsock,
        req = talloc(dgmsock, struct nbt_dgram_request);
        if (req == NULL) goto failed;
 
-       req->dest_addr = talloc_strdup(req, dest_addr);
-       if (req->dest_addr == NULL) goto failed;
-       req->dest_port = dest_port;
+       req->dest.port = dest->port;
+       req->dest.addr = talloc_strdup(req, dest->addr);
+       if (req->dest.addr == NULL) goto failed;
 
        status = ndr_push_struct_blob(&req->encoded, req, packet, 
                                      (ndr_push_flags_fn_t)ndr_push_nbt_dgram_packet);
index 5bddd220d043d51b5111c577e53d16e0dad580e4..f913e90d8839d6b9801ba824e90a70f141d14fa4 100644 (file)
@@ -22,7 +22,6 @@
 
 #include "librpc/gen_ndr/ndr_nbt.h"
 
-
 /*
   a datagram name request
 */
@@ -30,8 +29,7 @@ struct nbt_dgram_request {
        struct nbt_dgram_request *next, *prev;
 
        /* where to send the request */
-       const char *dest_addr;
-       int dest_port;
+       struct nbt_peer_socket dest;
 
        /* the encoded request */
        DATA_BLOB encoded;
@@ -56,7 +54,7 @@ struct nbt_dgram_socket {
        /* what to do with incoming request packets */
        struct {
                void (*handler)(struct nbt_dgram_socket *, struct nbt_dgram_packet *, 
-                               const char *, int );
+                               const struct nbt_peer_socket *src);
                void *private;
        } incoming;
 };
@@ -72,7 +70,7 @@ struct nbt_dgram_socket {
 
 typedef void (*dgram_mailslot_handler_t)(struct dgram_mailslot_handler *, 
                                         struct nbt_dgram_packet *, 
-                                        const char *, int );
+                                        const struct nbt_peer_socket *src);
 
 struct dgram_mailslot_handler {
        struct dgram_mailslot_handler *next, *prev;
@@ -88,12 +86,11 @@ struct dgram_mailslot_handler {
 /* prototypes */
 NTSTATUS nbt_dgram_send(struct nbt_dgram_socket *dgmsock,
                        struct nbt_dgram_packet *packet,
-                       const char *dest_addr,
-                       int dest_port);
+                       const struct nbt_peer_socket *dest);
 NTSTATUS dgram_set_incoming_handler(struct nbt_dgram_socket *dgmsock,
                                    void (*handler)(struct nbt_dgram_socket *, 
                                                    struct nbt_dgram_packet *, 
-                                                   const char *, int ),
+                                                   const struct nbt_peer_socket *),
                                    void *private);
 struct nbt_dgram_socket *nbt_dgram_socket_init(TALLOC_CTX *mem_ctx, 
                                               struct event_context *event_ctx);
@@ -116,15 +113,13 @@ NTSTATUS dgram_mailslot_send(struct nbt_dgram_socket *dgmsock,
                             enum dgram_msg_type msg_type,
                             const char *mailslot_name,
                             struct nbt_name *dest_name,
-                            const char *dest_address,
-                            int dest_port,
+                            const struct nbt_peer_socket *dest,
                             struct nbt_name *src_name,
                             DATA_BLOB *request);
 
 NTSTATUS dgram_mailslot_netlogon_send(struct nbt_dgram_socket *dgmsock,
                                      struct nbt_name *dest_name,
-                                     const char *dest_address,
-                                     int dest_port,
+                                     const struct nbt_peer_socket *dest,
                                      struct nbt_name *src_name,
                                      struct nbt_netlogon_packet *request);
 NTSTATUS dgram_mailslot_netlogon_reply(struct nbt_dgram_socket *dgmsock,
@@ -139,8 +134,7 @@ NTSTATUS dgram_mailslot_netlogon_parse(struct dgram_mailslot_handler *dgmslot,
 NTSTATUS dgram_mailslot_ntlogon_send(struct nbt_dgram_socket *dgmsock,
                                      enum dgram_msg_type msg_type,
                                      struct nbt_name *dest_name,
-                                     const char *dest_address,
-                                     int dest_port,
+                                     const struct nbt_peer_socket *dest,
                                      struct nbt_name *src_name,
                                      struct nbt_ntlogon_packet *request);
 NTSTATUS dgram_mailslot_ntlogon_reply(struct nbt_dgram_socket *dgmsock,
index 14e7e49fc1bbe9abd5d4124fecd214f8e794d7b2..d5214844223f40c14c00f9baebdcb7163f1e2b87 100644 (file)
@@ -152,27 +152,27 @@ NTSTATUS dgram_mailslot_send(struct nbt_dgram_socket *dgmsock,
                             enum dgram_msg_type msg_type,
                             const char *mailslot_name,
                             struct nbt_name *dest_name,
-                            const char *dest_address,
-                            int dest_port,
+                            const struct nbt_peer_socket *_dest,
                             struct nbt_name *src_name,
                             DATA_BLOB *request)
 {
        TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
        struct nbt_dgram_packet packet;
+       struct nbt_peer_socket dest = *_dest;
        struct dgram_message *msg;
        struct dgram_smb_packet *smb;
        struct smb_trans_body *trans;
        NTSTATUS status;
 
-       if (dest_port == 0) {
-               dest_port = lp_dgram_port();
+       if (dest.port == 0) {
+               dest.port = lp_dgram_port();
        }
 
        ZERO_STRUCT(packet);
        packet.msg_type = msg_type;
        packet.flags = DGRAM_FLAG_FIRST | DGRAM_NODE_NBDD;
        packet.dgram_id = generate_random() % UINT16_MAX;
-       packet.source = socket_get_my_addr(dgmsock->sock, tmp_ctx);
+       packet.src_addr = socket_get_my_addr(dgmsock->sock, tmp_ctx);
        packet.src_port = socket_get_my_port(dgmsock->sock);
 
        msg = &packet.data.msg;
@@ -199,7 +199,7 @@ NTSTATUS dgram_mailslot_send(struct nbt_dgram_socket *dgmsock,
        trans->mailslot_name = mailslot_name;
        trans->data = *request;
 
-       status = nbt_dgram_send(dgmsock, &packet, dest_address, dest_port);
+       status = nbt_dgram_send(dgmsock, &packet, &dest);
 
        talloc_free(tmp_ctx);
 
index dda77689dee620b70a55427f6f8b9185524973e6..0627fe900cd9855ceb064f321da7320833948e5c 100644 (file)
@@ -33,8 +33,7 @@
 */
 NTSTATUS dgram_mailslot_netlogon_send(struct nbt_dgram_socket *dgmsock,
                                      struct nbt_name *dest_name,
-                                     const char *dest_address,
-                                     int dest_port,
+                                     const struct nbt_peer_socket *dest,
                                      struct nbt_name *src_name,
                                      struct nbt_netlogon_packet *request)
 {
@@ -52,7 +51,7 @@ NTSTATUS dgram_mailslot_netlogon_send(struct nbt_dgram_socket *dgmsock,
 
        status = dgram_mailslot_send(dgmsock, DGRAM_DIRECT_UNIQUE, 
                                     NBT_MAILSLOT_NETLOGON,
-                                    dest_name, dest_address, dest_port
+                                    dest_name, dest, 
                                     src_name, &blob);
        talloc_free(tmp_ctx);
        return status;
@@ -71,6 +70,7 @@ NTSTATUS dgram_mailslot_netlogon_reply(struct nbt_dgram_socket *dgmsock,
        DATA_BLOB blob;
        TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
        struct nbt_name myname;
+       struct nbt_peer_socket dest;
 
        status = ndr_push_struct_blob(&blob, tmp_ctx, reply, 
                                      (ndr_push_flags_fn_t)ndr_push_nbt_netlogon_packet);
@@ -81,10 +81,12 @@ NTSTATUS dgram_mailslot_netlogon_reply(struct nbt_dgram_socket *dgmsock,
 
        make_nbt_name_client(&myname, lp_netbios_name());
 
+       dest.port = request->src_port;
+       dest.addr = request->src_addr;
        status = dgram_mailslot_send(dgmsock, DGRAM_DIRECT_UNIQUE, 
                                     mailslot_name,
                                     &request->data.msg.source_name,
-                                    request->source, request->src_port,
+                                    &dest,
                                     &myname, &blob);
        talloc_free(tmp_ctx);
        return status;
index efa5d4ab9e975984cb6dc2825941c826d4b447be..2bdce6f853763981436ecf30f6df9eade93c3b7c 100644 (file)
@@ -34,8 +34,7 @@
 NTSTATUS dgram_mailslot_ntlogon_send(struct nbt_dgram_socket *dgmsock,
                                     enum dgram_msg_type msg_type,
                                     struct nbt_name *dest_name,
-                                    const char *dest_address,
-                                    int dest_port,
+                                    const struct nbt_peer_socket *dest,
                                     struct nbt_name *src_name,
                                     struct nbt_ntlogon_packet *request)
 {
@@ -53,7 +52,7 @@ NTSTATUS dgram_mailslot_ntlogon_send(struct nbt_dgram_socket *dgmsock,
 
        status = dgram_mailslot_send(dgmsock, msg_type,
                                     NBT_MAILSLOT_NTLOGON,
-                                    dest_name, dest_address, dest_port
+                                    dest_name, dest, 
                                     src_name, &blob);
        talloc_free(tmp_ctx);
        return status;
@@ -72,6 +71,7 @@ NTSTATUS dgram_mailslot_ntlogon_reply(struct nbt_dgram_socket *dgmsock,
        DATA_BLOB blob;
        TALLOC_CTX *tmp_ctx = talloc_new(dgmsock);
        struct nbt_name myname;
+       struct nbt_peer_socket dest;
 
        status = ndr_push_struct_blob(&blob, tmp_ctx, reply, 
                                      (ndr_push_flags_fn_t)ndr_push_nbt_ntlogon_packet);
@@ -82,10 +82,12 @@ NTSTATUS dgram_mailslot_ntlogon_reply(struct nbt_dgram_socket *dgmsock,
 
        make_nbt_name_client(&myname, lp_netbios_name());
 
+       dest.port = request->src_port;
+       dest.addr = request->src_addr;
        status = dgram_mailslot_send(dgmsock, DGRAM_DIRECT_UNIQUE, 
                                     mailslot_name,
                                     &request->data.msg.source_name,
-                                    request->source, request->src_port,
+                                    &dest,
                                     &myname, &blob);
        talloc_free(tmp_ctx);
        return status;
index 5a53510ccf2a1e74afc16144a0d1678cd39a69a4..218b5e5921b8b5983b679128e7876d5b9c2498d0 100644 (file)
@@ -31,6 +31,12 @@ enum nbt_request_state {NBT_REQUEST_SEND,
                        NBT_REQUEST_TIMEOUT,
                        NBT_REQUEST_ERROR};
 
+/* where to send the request/replies */
+struct nbt_peer_socket {
+       const char *addr;
+       int port;
+};
+
 /*
   a nbt name request
 */
@@ -45,8 +51,7 @@ struct nbt_name_request {
        struct nbt_name_socket *nbtsock;
 
        /* where to send the request */
-       const char *dest_addr;
-       int dest_port;
+       struct nbt_peer_socket dest;
 
        /* timeout between retries */
        int timeout;
@@ -75,8 +80,7 @@ struct nbt_name_request {
        uint_t num_replies;
        struct nbt_name_reply {
                struct nbt_name_packet *packet;
-               const char *reply_addr;
-               int reply_port;
+               struct nbt_peer_socket dest;
        } *replies;
 
        /* information on what to do on completion */
@@ -110,14 +114,14 @@ struct nbt_name_socket {
        /* what to do with incoming request packets */
        struct {
                void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *, 
-                               const char *, int );
+                               const struct nbt_peer_socket *);
                void *private;
        } incoming;
 
        /* what to do with unexpected replies */
        struct {
                void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *, 
-                               const char *, int );
+                               const struct nbt_peer_socket *);
                void *private;
        } unexpected;
 };
index f222148f4d6fccb2b8dd314c285e40a4be96d6f5..c0a1e274e20df6538f1d99538f11e89d058952d3 100644 (file)
@@ -31,6 +31,7 @@ struct nbt_name_request *nbt_name_query_send(struct nbt_name_socket *nbtsock,
 {
        struct nbt_name_request *req;
        struct nbt_name_packet *packet;
+       struct nbt_peer_socket dest;
 
        packet = talloc_zero(nbtsock, struct nbt_name_packet);
        if (packet == NULL) return NULL;
@@ -50,8 +51,10 @@ struct nbt_name_request *nbt_name_query_send(struct nbt_name_socket *nbtsock,
        packet->questions[0].name = io->in.name;
        packet->questions[0].question_type = NBT_QTYPE_NETBIOS;
        packet->questions[0].question_class = NBT_QCLASS_IP;
-       
-       req = nbt_name_request_send(nbtsock, io->in.dest_addr, lp_nbt_port(), packet,
+
+       dest.port = lp_nbt_port();
+       dest.addr = io->in.dest_addr;
+       req = nbt_name_request_send(nbtsock, &dest, packet,
                                    io->in.timeout, io->in.retries, False);
        if (req == NULL) goto failed;
 
@@ -81,7 +84,7 @@ NTSTATUS nbt_name_query_recv(struct nbt_name_request *req,
        }
        
        packet = req->replies[0].packet;
-       io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].reply_addr);
+       io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].dest.addr);
 
        if ((packet->operation & NBT_RCODE) != 0) {
                status = nbt_rcode_to_ntstatus(packet->operation & NBT_RCODE);
@@ -137,6 +140,7 @@ struct nbt_name_request *nbt_name_status_send(struct nbt_name_socket *nbtsock,
 {
        struct nbt_name_request *req;
        struct nbt_name_packet *packet;
+       struct nbt_peer_socket dest;
 
        packet = talloc_zero(nbtsock, struct nbt_name_packet);
        if (packet == NULL) return NULL;
@@ -150,8 +154,10 @@ struct nbt_name_request *nbt_name_status_send(struct nbt_name_socket *nbtsock,
        packet->questions[0].name = io->in.name;
        packet->questions[0].question_type = NBT_QTYPE_STATUS;
        packet->questions[0].question_class = NBT_QCLASS_IP;
-       
-       req = nbt_name_request_send(nbtsock, io->in.dest_addr, lp_nbt_port(), packet,
+
+       dest.port = lp_nbt_port();
+       dest.addr = io->in.dest_addr;
+       req = nbt_name_request_send(nbtsock, &dest, packet,
                                    io->in.timeout, io->in.retries, False);
        if (req == NULL) goto failed;
 
@@ -181,7 +187,7 @@ NTSTATUS nbt_name_status_recv(struct nbt_name_request *req,
        }
        
        packet = req->replies[0].packet;
-       io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].reply_addr);
+       io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].dest.addr);
 
        if ((packet->operation & NBT_RCODE) != 0) {
                status = nbt_rcode_to_ntstatus(packet->operation & NBT_RCODE);
index d9f2070d4c2b55defa0813b9a4fac3681d857228..e6464885f77094c376a946f32f2bc315da210c3f 100644 (file)
@@ -32,6 +32,7 @@ struct nbt_name_request *nbt_name_refresh_send(struct nbt_name_socket *nbtsock,
 {
        struct nbt_name_request *req;
        struct nbt_name_packet *packet;
+       struct nbt_peer_socket dest;
 
        packet = talloc_zero(nbtsock, struct nbt_name_packet);
        if (packet == NULL) return NULL;
@@ -64,8 +65,10 @@ struct nbt_name_request *nbt_name_refresh_send(struct nbt_name_socket *nbtsock,
        packet->additional[0].rdata.netbios.addresses[0].nb_flags = io->in.nb_flags;
        packet->additional[0].rdata.netbios.addresses[0].ipaddr = 
                talloc_strdup(packet->additional, io->in.address);
-       
-       req = nbt_name_request_send(nbtsock, io->in.dest_addr, lp_nbt_port(), packet,
+
+       dest.port = lp_nbt_port();
+       dest.addr = io->in.dest_addr;
+       req = nbt_name_request_send(nbtsock, &dest, packet,
                                    io->in.timeout, io->in.retries, False);
        if (req == NULL) goto failed;
 
@@ -94,7 +97,7 @@ NTSTATUS nbt_name_refresh_recv(struct nbt_name_request *req,
        }
        
        packet = req->replies[0].packet;
-       io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].reply_addr);
+       io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].dest.addr);
 
        if (packet->ancount != 1 ||
            packet->answers[0].rr_type != NBT_QTYPE_NETBIOS ||
index 4dac50078087f164a45cdc4dd0d901203a19c2de..4f3e046274a49c60d9a1167373ee93373879e574 100644 (file)
@@ -32,6 +32,7 @@ struct nbt_name_request *nbt_name_register_send(struct nbt_name_socket *nbtsock,
 {
        struct nbt_name_request *req;
        struct nbt_name_packet *packet;
+       struct nbt_peer_socket dest;
 
        packet = talloc_zero(nbtsock, struct nbt_name_packet);
        if (packet == NULL) return NULL;
@@ -72,8 +73,10 @@ struct nbt_name_request *nbt_name_register_send(struct nbt_name_socket *nbtsock,
        packet->additional[0].rdata.netbios.addresses[0].ipaddr = 
                talloc_strdup(packet->additional, io->in.address);
        if (packet->additional[0].rdata.netbios.addresses[0].ipaddr == NULL) goto failed;
-       
-       req = nbt_name_request_send(nbtsock, io->in.dest_addr, lp_nbt_port(), packet,
+
+       dest.port = lp_nbt_port();
+       dest.addr = io->in.dest_addr;
+       req = nbt_name_request_send(nbtsock, &dest, packet,
                                    io->in.timeout, io->in.retries, False);
        if (req == NULL) goto failed;
 
@@ -102,7 +105,7 @@ NTSTATUS nbt_name_register_recv(struct nbt_name_request *req,
        }
        
        packet = req->replies[0].packet;
-       io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].reply_addr);
+       io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].dest.addr);
 
        if (packet->ancount != 1 ||
            packet->answers[0].rr_type != NBT_QTYPE_NETBIOS ||
index 208c73d3860fcb1e6b098ae086243e53c4011ce9..0a0cd452766c152a6c44e319fd66daad60e61be6 100644 (file)
@@ -31,6 +31,7 @@ struct nbt_name_request *nbt_name_release_send(struct nbt_name_socket *nbtsock,
 {
        struct nbt_name_request *req;
        struct nbt_name_packet *packet;
+       struct nbt_peer_socket dest;
 
        packet = talloc_zero(nbtsock, struct nbt_name_packet);
        if (packet == NULL) return NULL;
@@ -63,8 +64,10 @@ struct nbt_name_request *nbt_name_release_send(struct nbt_name_socket *nbtsock,
        packet->additional[0].rdata.netbios.addresses[0].nb_flags = io->in.nb_flags;
        packet->additional[0].rdata.netbios.addresses[0].ipaddr = 
                talloc_strdup(packet->additional, io->in.address);
-       
-       req = nbt_name_request_send(nbtsock, io->in.dest_addr, lp_nbt_port(), packet,
+
+       dest.port = lp_nbt_port();
+       dest.addr = io->in.dest_addr;
+       req = nbt_name_request_send(nbtsock, &dest, packet,
                                    io->in.timeout, io->in.retries, False);
        if (req == NULL) goto failed;
 
@@ -93,7 +96,7 @@ NTSTATUS nbt_name_release_recv(struct nbt_name_request *req,
        }
        
        packet = req->replies[0].packet;
-       io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].reply_addr);
+       io->out.reply_from = talloc_steal(mem_ctx, req->replies[0].dest.addr);
 
        if (packet->ancount != 1 ||
            packet->answers[0].rr_type != NBT_QTYPE_NETBIOS ||
index f40ec84e77b2fca637885ea8de52f045a1d50a95..905541e74a2ac8c64c7d46a3edc9d29ac90040d2 100644 (file)
@@ -73,7 +73,7 @@ static void nbt_name_socket_send(struct nbt_name_socket *nbtsock)
                
                len = req->encoded.length;
                status = socket_sendto(nbtsock->sock, &req->encoded, &len, 0, 
-                                      req->dest_addr, req->dest_port);
+                                      req->dest.addr, req->dest.port);
                if (NT_STATUS_IS_ERR(status)) goto failed;              
 
                if (!NT_STATUS_IS_OK(status)) {
@@ -153,8 +153,7 @@ static void nbt_name_socket_recv(struct nbt_name_socket *nbtsock)
 {
        TALLOC_CTX *tmp_ctx = talloc_new(nbtsock);
        NTSTATUS status;
-       const char *src_addr;
-       int src_port;
+       struct nbt_peer_socket src;
        DATA_BLOB blob;
        size_t nread, dsize;
        struct nbt_name_packet *packet;
@@ -173,12 +172,12 @@ static void nbt_name_socket_recv(struct nbt_name_socket *nbtsock)
        }
 
        status = socket_recvfrom(nbtsock->sock, blob.data, blob.length, &nread, 0,
-                                &src_addr, &src_port);
+                                &src.addr, &src.port);
        if (!NT_STATUS_IS_OK(status)) {
                talloc_free(tmp_ctx);
                return;
        }
-       talloc_steal(tmp_ctx, src_addr);
+       talloc_steal(tmp_ctx, src.addr);
        blob.length = nread;
 
        packet = talloc(tmp_ctx, struct nbt_name_packet);
@@ -199,7 +198,7 @@ static void nbt_name_socket_recv(struct nbt_name_socket *nbtsock)
 
        if (DEBUGLVL(10)) {
                DEBUG(10,("Received nbt packet of length %d from %s:%d\n", 
-                         (int)blob.length, src_addr, src_port));
+                         (int)blob.length, src.addr, src.port));
                NDR_PRINT_DEBUG(nbt_name_packet, packet);
        }
 
@@ -207,7 +206,7 @@ static void nbt_name_socket_recv(struct nbt_name_socket *nbtsock)
           handler, if any */
        if (!(packet->operation & NBT_FLAG_REPLY)) {
                if (nbtsock->incoming.handler) {
-                       nbtsock->incoming.handler(nbtsock, packet, src_addr, src_port);
+                       nbtsock->incoming.handler(nbtsock, packet, &src);
                }
                talloc_free(tmp_ctx);
                return;
@@ -217,7 +216,7 @@ static void nbt_name_socket_recv(struct nbt_name_socket *nbtsock)
        req = idr_find(nbtsock->idr, packet->name_trn_id);
        if (req == NULL) {
                if (nbtsock->unexpected.handler) {
-                       nbtsock->unexpected.handler(nbtsock, packet, src_addr, src_port);
+                       nbtsock->unexpected.handler(nbtsock, packet, &src);
                } else {
                        DEBUG(2,("Failed to match request for incoming name packet id 0x%04x on %p\n",
                                 packet->name_trn_id, nbtsock));
@@ -259,8 +258,8 @@ static void nbt_name_socket_recv(struct nbt_name_socket *nbtsock)
                goto done;
        }
 
-       req->replies[req->num_replies].reply_addr = talloc_steal(req, src_addr);
-       req->replies[req->num_replies].reply_port = src_port;
+       req->replies[req->num_replies].dest.addr = talloc_steal(req, src.addr);
+       req->replies[req->num_replies].dest.port = src.port;
        req->replies[req->num_replies].packet     = talloc_steal(req, packet);
        req->num_replies++;
 
@@ -349,7 +348,7 @@ failed:
   send off a nbt name request
 */
 struct nbt_name_request *nbt_name_request_send(struct nbt_name_socket *nbtsock, 
-                                              const char *dest_addr, int dest_port,
+                                              const struct nbt_peer_socket *dest,
                                               struct nbt_name_packet *request,
                                               int timeout, int retries,
                                               BOOL allow_multiple_replies)
@@ -362,14 +361,14 @@ struct nbt_name_request *nbt_name_request_send(struct nbt_name_socket *nbtsock,
        if (req == NULL) goto failed;
 
        req->nbtsock                = nbtsock;
-       req->dest_port              = dest_port;
        req->allow_multiple_replies = allow_multiple_replies;
        req->state                  = NBT_REQUEST_SEND;
        req->is_reply               = False;
        req->timeout                = timeout;
        req->num_retries            = retries;
-       req->dest_addr              = talloc_strdup(req, dest_addr);
-       if (req->dest_addr == NULL) goto failed;
+       req->dest.port              = dest->port;
+       req->dest.addr              = talloc_strdup(req, dest->addr);
+       if (req->dest.addr == NULL) goto failed;
 
        /* we select a random transaction id unless the user supplied one */
        if (request->name_trn_id == 0) {
@@ -398,7 +397,7 @@ struct nbt_name_request *nbt_name_request_send(struct nbt_name_socket *nbtsock,
 
        if (DEBUGLVL(10)) {
                DEBUG(10,("Queueing nbt packet to %s:%d\n", 
-                         req->dest_addr, req->dest_port));
+                         req->dest.addr, req->dest.port));
                NDR_PRINT_DEBUG(nbt_name_packet, request);
        }
 
@@ -416,7 +415,7 @@ failed:
   send off a nbt name reply
 */
 NTSTATUS nbt_name_reply_send(struct nbt_name_socket *nbtsock, 
-                            const char *dest_addr, int dest_port,
+                            const struct nbt_peer_socket *dest,
                             struct nbt_name_packet *request)
 {
        struct nbt_name_request *req;
@@ -426,9 +425,9 @@ NTSTATUS nbt_name_reply_send(struct nbt_name_socket *nbtsock,
        NT_STATUS_HAVE_NO_MEMORY(req);
 
        req->nbtsock   = nbtsock;
-       req->dest_addr = talloc_strdup(req, dest_addr);
-       if (req->dest_addr == NULL) goto failed;
-       req->dest_port = dest_port;
+       req->dest.port = dest->port;
+       req->dest.addr = talloc_strdup(req, dest->addr);
+       if (req->dest.addr == NULL) goto failed;
        req->state     = NBT_REQUEST_SEND;
        req->is_reply = True;
 
@@ -481,7 +480,7 @@ NTSTATUS nbt_name_request_recv(struct nbt_name_request *req)
 */
 NTSTATUS nbt_set_incoming_handler(struct nbt_name_socket *nbtsock,
                                  void (*handler)(struct nbt_name_socket *, struct nbt_name_packet *, 
-                                                 const char *, int ),
+                                                 const struct nbt_peer_socket *),
                                  void *private)
 {
        nbtsock->incoming.handler = handler;
index e3c72480fcba1b04b5bfc06a02a5076251386a7c..e188c61d86d72d4b538c761c1822e1bd9edd3d19 100644 (file)
                dgram_msg_type msg_type;
                dgram_flags    flags;
                uint16         dgram_id;
-               ipv4address    source;
+               ipv4address    src_addr;
                uint16         src_port;
                [switch_is(msg_type)] dgram_data data;
        } nbt_dgram_packet;
index 8d71b31c65bf12baa2e729046907678002f0db11..f8c73c6a3a6505b157f1d69dbdea4533a93bb694 100644 (file)
 */
 void nbtd_request_defense(struct nbt_name_socket *nbtsock, 
                          struct nbt_name_packet *packet, 
-                         const char *src_address, int src_port)
+                         const struct nbt_peer_socket *src)
 {
        struct nbtd_iface_name *iname;
        struct nbt_name *name;
        struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, 
                                                       struct nbtd_interface);
 
-       NBTD_ASSERT_PACKET(packet, src_address, packet->qdcount == 1);
-       NBTD_ASSERT_PACKET(packet, src_address, packet->arcount == 1);
-       NBTD_ASSERT_PACKET(packet, src_address
+       NBTD_ASSERT_PACKET(packet, src->addr, packet->qdcount == 1);
+       NBTD_ASSERT_PACKET(packet, src->addr, packet->arcount == 1);
+       NBTD_ASSERT_PACKET(packet, src->addr
                           packet->questions[0].question_type == NBT_QTYPE_NETBIOS);
-       NBTD_ASSERT_PACKET(packet, src_address
+       NBTD_ASSERT_PACKET(packet, src->addr
                           packet->questions[0].question_class == NBT_QCLASS_IP);
-       NBTD_ASSERT_PACKET(packet, src_address
+       NBTD_ASSERT_PACKET(packet, src->addr
                          packet->additional[0].rr_type == NBT_QTYPE_NETBIOS);
-       NBTD_ASSERT_PACKET(packet, src_address
+       NBTD_ASSERT_PACKET(packet, src->addr
                          packet->additional[0].rr_class == NBT_QCLASS_IP);
-       NBTD_ASSERT_PACKET(packet, src_address
+       NBTD_ASSERT_PACKET(packet, src->addr
                          packet->additional[0].rdata.netbios.length == 6);
 
        /* see if we have the requested name on this interface */
@@ -60,10 +60,9 @@ void nbtd_request_defense(struct nbt_name_socket *nbtsock,
            !IS_GROUP_NAME(name, iname->nb_flags)) {
                DEBUG(2,("Defending name %s on %s against %s\n",
                         nbt_name_string(packet, name), 
-                        iface->bcast_address, src_address));
-               nbtd_name_registration_reply(nbtsock, packet, 
-                                            src_address, src_port, NBT_RCODE_ACT);
+                        iface->bcast_address, src->addr));
+               nbtd_name_registration_reply(nbtsock, packet, src, NBT_RCODE_ACT);
        } else {
-               nbtd_winsserver_request(nbtsock, packet, src_address, src_port);
+               nbtd_winsserver_request(nbtsock, packet, src);
        }
 }
index aa22e5d4ad25df1dd0839104362b90ee0e44926a..23276123d51aae43607d8107b17a09fc11bfff72 100644 (file)
@@ -32,7 +32,7 @@
 */
 static void nbtd_request_handler(struct nbt_name_socket *nbtsock, 
                                 struct nbt_name_packet *packet, 
-                                const char *src_address, int src_port)
+                                const struct nbt_peer_socket *src)
 {
        struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, 
                                                       struct nbtd_interface);
@@ -41,32 +41,32 @@ static void nbtd_request_handler(struct nbt_name_socket *nbtsock,
        nbtsrv->stats.total_received++;
 
        /* see if its from one of our own interfaces - if so, then ignore it */
-       if (nbtd_self_packet(nbtsock, packet, src_address, src_port)) {
-               DEBUG(10,("Ignoring self packet from %s:%d\n", src_address, src_port));
+       if (nbtd_self_packet(nbtsock, packet, src)) {
+               DEBUG(10,("Ignoring self packet from %s:%d\n", src->addr, src->port));
                return;
        }
 
        switch (packet->operation & NBT_OPCODE) {
        case NBT_OPCODE_QUERY:
                nbtsrv->stats.query_count++;
-               nbtd_request_query(nbtsock, packet, src_address, src_port);
+               nbtd_request_query(nbtsock, packet, src);
                break;
 
        case NBT_OPCODE_REGISTER:
        case NBT_OPCODE_REFRESH:
        case NBT_OPCODE_REFRESH2:
                nbtsrv->stats.register_count++;
-               nbtd_request_defense(nbtsock, packet, src_address, src_port);
+               nbtd_request_defense(nbtsock, packet, src);
                break;
 
        case NBT_OPCODE_RELEASE:
        case NBT_OPCODE_MULTI_HOME_REG:
                nbtsrv->stats.release_count++;
-               nbtd_winsserver_request(nbtsock, packet, src_address, src_port);
+               nbtd_winsserver_request(nbtsock, packet, src);
                break;
 
        default:
-               nbtd_bad_packet(packet, src_address, "Unexpected opcode");
+               nbtd_bad_packet(packet, src, "Unexpected opcode");
                break;
        }
 }
index daae7b8a78496655a8edf6fc5bc98284695793f6..ccbdc2b933726b77a747da172691f7c430da0389 100644 (file)
@@ -30,7 +30,7 @@
 */
 static void nbtd_node_status_reply(struct nbt_name_socket *nbtsock, 
                                   struct nbt_name_packet *request_packet, 
-                                  const char *src_address, int src_port,
+                                  const struct nbt_peer_socket *src,
                                   struct nbt_name *name, 
                                   struct nbtd_interface *iface)
 {
@@ -84,10 +84,10 @@ static void nbtd_node_status_reply(struct nbt_name_socket *nbtsock,
        ZERO_STRUCT(packet->answers[0].rdata.status.statistics);
 
        DEBUG(7,("Sending node status reply for %s to %s:%d\n", 
-                nbt_name_string(packet, name), src_address, src_port));
+                nbt_name_string(packet, name), src->addr, src->port));
        
        nbtsrv->stats.total_sent++;
-       nbt_name_reply_send(nbtsock, src_address, src_port, packet);
+       nbt_name_reply_send(nbtsock, src, packet);
 
 failed:
        talloc_free(packet);
@@ -99,16 +99,16 @@ failed:
 */
 void nbtd_query_status(struct nbt_name_socket *nbtsock, 
                       struct nbt_name_packet *packet, 
-                      const char *src_address, int src_port)
+                      const struct nbt_peer_socket *src)
 {
        struct nbt_name *name;
        struct nbtd_iface_name *iname;
        struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, 
                                                       struct nbtd_interface);
 
-       NBTD_ASSERT_PACKET(packet, src_address, packet->qdcount == 1);
-       NBTD_ASSERT_PACKET(packet, src_address, packet->questions[0].question_type == NBT_QTYPE_STATUS);
-       NBTD_ASSERT_PACKET(packet, src_address, packet->questions[0].question_class == NBT_QCLASS_IP);
+       NBTD_ASSERT_PACKET(packet, src->addr, packet->qdcount == 1);
+       NBTD_ASSERT_PACKET(packet, src->addr, packet->questions[0].question_type == NBT_QTYPE_STATUS);
+       NBTD_ASSERT_PACKET(packet, src->addr, packet->questions[0].question_class == NBT_QCLASS_IP);
 
        /* see if we have the requested name on this interface */
        name = &packet->questions[0].name;
@@ -116,10 +116,10 @@ void nbtd_query_status(struct nbt_name_socket *nbtsock,
        iname = nbtd_find_iname(iface, name, NBT_NM_ACTIVE);
        if (iname == NULL) {
                DEBUG(7,("Node status query for %s from %s - not found on %s\n",
-                        nbt_name_string(packet, name), src_address, iface->ip_address));
+                        nbt_name_string(packet, name), src->addr, iface->ip_address));
                return;
        }
 
-       nbtd_node_status_reply(nbtsock, packet, src_address, src_port
+       nbtd_node_status_reply(nbtsock, packet, src, 
                               &iname->name, iface);
 }
index c1e0c4411bfb516548b0b36826139d3b9c4bce3c..9c9983b63c63f26695d2f3c7327c937d6d295b9b 100644 (file)
@@ -28,9 +28,9 @@
   we received a badly formed packet - log it
 */
 void nbtd_bad_packet(struct nbt_name_packet *packet, 
-                    const char *src_address, const char *reason)
+                    const struct nbt_peer_socket *src, const char *reason)
 {
-       DEBUG(2,("nbtd: bad packet '%s' from %s\n", reason, src_address));
+       DEBUG(2,("nbtd: bad packet '%s' from %s:%d\n", reason, src->addr, src->port));
        if (DEBUGLVL(5)) {
                NDR_PRINT_DEBUG(nbt_name_packet, packet);               
        }
@@ -43,7 +43,7 @@ void nbtd_bad_packet(struct nbt_name_packet *packet,
 */
 BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock, 
                      struct nbt_name_packet *packet, 
-                     const char *src_address, int src_port)
+                     const struct nbt_peer_socket *src)
 {
        struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, 
                                                       struct nbtd_interface);
@@ -55,7 +55,7 @@ BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock,
        }
 
        /* if its not from the nbt port, then it wasn't a broadcast from us */
-       if (src_port != lp_nbt_port()) {
+       if (src->port != lp_nbt_port()) {
                return False;
        }
 
@@ -69,7 +69,7 @@ BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock,
        /* we have to loop over our interface list, seeing if its from
           one of our own interfaces */
        for (iface=nbtsrv->interfaces;iface;iface=iface->next) {
-               if (strcmp(src_address, iface->ip_address) == 0) {
+               if (strcmp(src->addr, iface->ip_address) == 0) {
                        return True;
                }
        }
@@ -83,7 +83,7 @@ BOOL nbtd_self_packet(struct nbt_name_socket *nbtsock,
 */
 void nbtd_name_query_reply(struct nbt_name_socket *nbtsock, 
                           struct nbt_name_packet *request_packet, 
-                          const char *src_address, int src_port,
+                          const struct nbt_peer_socket *src,
                           struct nbt_name *name, uint32_t ttl,
                           uint16_t nb_flags, const char **addresses)
 {
@@ -132,10 +132,10 @@ void nbtd_name_query_reply(struct nbt_name_socket *nbtsock,
        }
 
        DEBUG(7,("Sending name query reply for %s at %s to %s:%d\n", 
-                nbt_name_string(packet, name), addresses[0], src_address, src_port));
+                nbt_name_string(packet, name), addresses[0], src->addr, src->port));
        
        nbtsrv->stats.total_sent++;
-       nbt_name_reply_send(nbtsock, src_address, src_port, packet);
+       nbt_name_reply_send(nbtsock, src, packet);
 
 failed:
        talloc_free(packet);
@@ -147,7 +147,7 @@ failed:
 */
 void nbtd_negative_name_query_reply(struct nbt_name_socket *nbtsock, 
                                    struct nbt_name_packet *request_packet, 
-                                   const char *src_address, int src_port)
+                                   const struct nbt_peer_socket *src)
 {
        struct nbt_name_packet *packet;
        struct nbt_name *name = &request_packet->questions[0].name;
@@ -176,10 +176,10 @@ void nbtd_negative_name_query_reply(struct nbt_name_socket *nbtsock,
        ZERO_STRUCT(packet->answers[0].rdata);
 
        DEBUG(7,("Sending negative name query reply for %s to %s:%d\n", 
-                nbt_name_string(packet, name), src_address, src_port));
+                nbt_name_string(packet, name), src->addr, src->port));
        
        nbtsrv->stats.total_sent++;
-       nbt_name_reply_send(nbtsock, src_address, src_port, packet);
+       nbt_name_reply_send(nbtsock, src, packet);
 
 failed:
        talloc_free(packet);
@@ -190,7 +190,7 @@ failed:
 */
 void nbtd_name_registration_reply(struct nbt_name_socket *nbtsock, 
                                  struct nbt_name_packet *request_packet, 
-                                 const char *src_address, int src_port,
+                                 const struct nbt_peer_socket *src,
                                  uint8_t rcode)
 {
        struct nbt_name_packet *packet;
@@ -223,10 +223,10 @@ void nbtd_name_registration_reply(struct nbt_name_socket *nbtsock,
 
        DEBUG(7,("Sending %s name registration reply for %s to %s:%d\n", 
                 rcode==0?"positive":"negative",
-                nbt_name_string(packet, name), src_address, src_port));
+                nbt_name_string(packet, name), src->addr, src->port));
        
        nbtsrv->stats.total_sent++;
-       nbt_name_reply_send(nbtsock, src_address, src_port, packet);
+       nbt_name_reply_send(nbtsock, src, packet);
 
 failed:
        talloc_free(packet);
@@ -238,7 +238,7 @@ failed:
 */
 void nbtd_name_release_reply(struct nbt_name_socket *nbtsock, 
                             struct nbt_name_packet *request_packet, 
-                            const char *src_address, int src_port,
+                            const struct nbt_peer_socket *src,
                             uint8_t rcode)
 {
        struct nbt_name_packet *packet;
@@ -269,10 +269,10 @@ void nbtd_name_release_reply(struct nbt_name_socket *nbtsock,
 
        DEBUG(7,("Sending %s name release reply for %s to %s:%d\n", 
                 rcode==0?"positive":"negative",
-                nbt_name_string(packet, name), src_address, src_port));
+                nbt_name_string(packet, name), src->addr, src->port));
        
        nbtsrv->stats.total_sent++;
-       nbt_name_reply_send(nbtsock, src_address, src_port, packet);
+       nbt_name_reply_send(nbtsock, src, packet);
 
 failed:
        talloc_free(packet);
@@ -284,7 +284,7 @@ failed:
 */
 void nbtd_wack_reply(struct nbt_name_socket *nbtsock, 
                     struct nbt_name_packet *request_packet, 
-                    const char *src_address, int src_port,
+                    const struct nbt_peer_socket *src,
                     uint32_t ttl)
 {
        struct nbt_name_packet *packet;
@@ -316,10 +316,10 @@ void nbtd_wack_reply(struct nbt_name_socket *nbtsock,
        RSSVAL(packet->answers[0].rdata.data.data, 0, request_packet->operation);
 
        DEBUG(7,("Sending WACK reply for %s to %s:%d\n", 
-                nbt_name_string(packet, name), src_address, src_port));
+                nbt_name_string(packet, name), src->addr, src->port));
        
        nbtsrv->stats.total_sent++;
-       nbt_name_reply_send(nbtsock, src_address, src_port, packet);
+       nbt_name_reply_send(nbtsock, src, packet);
 
 failed:
        talloc_free(packet);
index c51a146adf8d7760561b7342ab94b634677cc033..c64ac5986a8bdaff774154bf0eea42c9bf739610 100644 (file)
@@ -31,7 +31,7 @@
 */
 void nbtd_request_query(struct nbt_name_socket *nbtsock, 
                        struct nbt_name_packet *packet, 
-                       const char *src_address, int src_port)
+                       const struct nbt_peer_socket *src)
 {
        struct nbtd_iface_name *iname;
        struct nbt_name *name;
@@ -41,14 +41,14 @@ void nbtd_request_query(struct nbt_name_socket *nbtsock,
        /* see if its a node status query */
        if (packet->qdcount == 1 &&
            packet->questions[0].question_type == NBT_QTYPE_STATUS) {
-               nbtd_query_status(nbtsock, packet, src_address, src_port);
+               nbtd_query_status(nbtsock, packet, src);
                return;
        }
 
-       NBTD_ASSERT_PACKET(packet, src_address, packet->qdcount == 1);
-       NBTD_ASSERT_PACKET(packet, src_address
+       NBTD_ASSERT_PACKET(packet, src->addr, packet->qdcount == 1);
+       NBTD_ASSERT_PACKET(packet, src->addr
                           packet->questions[0].question_type == NBT_QTYPE_NETBIOS);
-       NBTD_ASSERT_PACKET(packet, src_address
+       NBTD_ASSERT_PACKET(packet, src->addr
                           packet->questions[0].question_class == NBT_QCLASS_IP);
 
        /* see if we have the requested name on this interface */
@@ -65,13 +65,12 @@ void nbtd_request_query(struct nbt_name_socket *nbtsock,
                /* if the name does not exist, then redirect to WINS
                   server if recursion has been asked for */
                if (packet->operation & NBT_FLAG_RECURSION_DESIRED) {
-                       nbtd_winsserver_request(nbtsock, packet, src_address, src_port);
+                       nbtd_winsserver_request(nbtsock, packet, src);
                        return;
                }
 
                /* otherwise send a negative reply */
-               nbtd_negative_name_query_reply(nbtsock, packet, 
-                                              src_address, src_port);
+               nbtd_negative_name_query_reply(nbtsock, packet, src);
                return;
        }
 
@@ -80,11 +79,11 @@ void nbtd_request_query(struct nbt_name_socket *nbtsock,
        if (!(iname->nb_flags & NBT_NM_ACTIVE) && 
            (packet->operation & NBT_FLAG_BROADCAST)) {
                DEBUG(7,("Query for %s from %s - name not active yet on %s\n",
-                        nbt_name_string(packet, name), src_address, iface->ip_address));
+                        nbt_name_string(packet, name), src->addr, iface->ip_address));
                return;
        }
 
-       nbtd_name_query_reply(nbtsock, packet, src_address, src_port,
+       nbtd_name_query_reply(nbtsock, packet, src,
                              &iname->name, iname->ttl, iname->nb_flags, 
                              nbtd_address_list(iface, packet));
 }
index 5470a38c97d469d9c7b076c040f065c7587a6738..c9758b31621ab4791f07e62485e9feab6d67fdfb 100644 (file)
@@ -41,7 +41,7 @@ uint32_t wins_server_ttl(struct wins_server *winssrv, uint32_t ttl)
 */
 static uint8_t wins_register_new(struct nbt_name_socket *nbtsock, 
                                 struct nbt_name_packet *packet, 
-                                const char *src_address, int src_port)
+                                const struct nbt_peer_socket *src)
 {
        struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, 
                                                       struct nbtd_interface);
@@ -56,7 +56,7 @@ static uint8_t wins_register_new(struct nbt_name_socket *nbtsock,
        rec.nb_flags      = nb_flags;
        rec.state         = WINS_REC_ACTIVE;
        rec.expire_time   = time(NULL) + ttl;
-       rec.registered_by = src_address;
+       rec.registered_by = src->addr;
        if (IS_GROUP_NAME(name, nb_flags)) {
                rec.addresses     = str_list_make(packet, "255.255.255.255", NULL);
        } else {
@@ -77,7 +77,7 @@ static uint8_t wins_register_new(struct nbt_name_socket *nbtsock,
 static uint8_t wins_update_ttl(struct nbt_name_socket *nbtsock, 
                               struct nbt_name_packet *packet, 
                               struct winsdb_record *rec,
-                              const char *src_address, int src_port)
+                              const struct nbt_peer_socket *src)
 {
        struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, 
                                                       struct nbtd_interface);
@@ -89,7 +89,7 @@ static uint8_t wins_update_ttl(struct nbt_name_socket *nbtsock,
        if (now + ttl > rec->expire_time) {
                rec->expire_time   = now + ttl;
        }
-       rec->registered_by = src_address;
+       rec->registered_by = src->addr;
 
        DEBUG(5,("WINS: refreshed registration of %s at %s\n",
                 nbt_name_string(packet, rec->name), address));
@@ -102,7 +102,7 @@ static uint8_t wins_update_ttl(struct nbt_name_socket *nbtsock,
 */
 static void nbtd_winsserver_register(struct nbt_name_socket *nbtsock, 
                                     struct nbt_name_packet *packet, 
-                                    const char *src_address, int src_port)
+                                    const struct nbt_peer_socket *src)
 {
        struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, 
                                                       struct nbtd_interface);
@@ -121,11 +121,11 @@ static void nbtd_winsserver_register(struct nbt_name_socket *nbtsock,
 
        rec = winsdb_load(winssrv, name, packet);
        if (rec == NULL) {
-               rcode = wins_register_new(nbtsock, packet, src_address, src_port);
+               rcode = wins_register_new(nbtsock, packet, src);
                goto done;
        } else if (rec->state != WINS_REC_ACTIVE) {
                winsdb_delete(winssrv, rec);
-               rcode = wins_register_new(nbtsock, packet, src_address, src_port);
+               rcode = wins_register_new(nbtsock, packet, src);
                goto done;
        }
 
@@ -140,31 +140,31 @@ static void nbtd_winsserver_register(struct nbt_name_socket *nbtsock,
        /* if its an active unique name, and the registration is for a group, then
           see if the unique name owner still wants the name */
        if (!(rec->nb_flags & NBT_NM_GROUP) && (nb_flags & NBT_NM_GROUP)) {
-               wins_register_wack(nbtsock, packet, rec, src_address, src_port);
+               wins_register_wack(nbtsock, packet, rec, src);
                return;
        }
 
        /* if the registration is for a group, then just update the expiry time 
           and we are done */
        if (IS_GROUP_NAME(name, nb_flags)) {
-               wins_update_ttl(nbtsock, packet, rec, src_address, src_port);
+               wins_update_ttl(nbtsock, packet, rec, src);
                goto done;
        }
 
        /* if the registration is for an address that is currently active, then 
           just update the expiry time */
        if (str_list_check(rec->addresses, address)) {
-               wins_update_ttl(nbtsock, packet, rec, src_address, src_port);
+               wins_update_ttl(nbtsock, packet, rec, src);
                goto done;
        }
 
        /* we have to do a WACK to see if the current owner is willing
           to give up its claim */      
-       wins_register_wack(nbtsock, packet, rec, src_address, src_port);
+       wins_register_wack(nbtsock, packet, rec, src);
        return;
 
 done:
-       nbtd_name_registration_reply(nbtsock, packet, src_address, src_port, rcode);
+       nbtd_name_registration_reply(nbtsock, packet, src, rcode);
 }
 
 
@@ -174,7 +174,7 @@ done:
 */
 static void nbtd_winsserver_query(struct nbt_name_socket *nbtsock, 
                                  struct nbt_name_packet *packet, 
-                                 const char *src_address, int src_port)
+                                 const struct nbt_peer_socket *src)
 {
        struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, 
                                                       struct nbtd_interface);
@@ -184,11 +184,11 @@ static void nbtd_winsserver_query(struct nbt_name_socket *nbtsock,
 
        rec = winsdb_load(winssrv, name, packet);
        if (rec == NULL || rec->state != WINS_REC_ACTIVE) {
-               nbtd_negative_name_query_reply(nbtsock, packet, src_address, src_port);
+               nbtd_negative_name_query_reply(nbtsock, packet, src);
                return;
        }
 
-       nbtd_name_query_reply(nbtsock, packet, src_address, src_port, name, 
+       nbtd_name_query_reply(nbtsock, packet, src, name, 
                              0, rec->nb_flags, rec->addresses);
 }
 
@@ -197,7 +197,7 @@ static void nbtd_winsserver_query(struct nbt_name_socket *nbtsock,
 */
 static void nbtd_winsserver_release(struct nbt_name_socket *nbtsock, 
                                    struct nbt_name_packet *packet, 
-                                   const char *src_address, int src_port)
+                                   const struct nbt_peer_socket *src)
 {
        struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, 
                                                       struct nbtd_interface);
@@ -214,7 +214,7 @@ static void nbtd_winsserver_release(struct nbt_name_socket *nbtsock,
 
        /* we only allow releases from an owner - other releases are
           silently ignored */
-       if (str_list_check(rec->addresses, src_address)) {
+       if (str_list_check(rec->addresses, src->addr)) {
                const char *address = packet->additional[0].rdata.netbios.addresses[0].ipaddr;
 
                DEBUG(4,("WINS: released name %s at %s\n", nbt_name_string(rec, rec->name), address));
@@ -227,7 +227,7 @@ static void nbtd_winsserver_release(struct nbt_name_socket *nbtsock,
 
 done:
        /* we match w2k3 by always giving a positive reply to name releases. */
-       nbtd_name_release_reply(nbtsock, packet, src_address, src_port, NBT_RCODE_OK);
+       nbtd_name_release_reply(nbtsock, packet, src, NBT_RCODE_OK);
 }
 
 
@@ -236,7 +236,7 @@ done:
 */
 void nbtd_winsserver_request(struct nbt_name_socket *nbtsock, 
                             struct nbt_name_packet *packet, 
-                            const char *src_address, int src_port)
+                            const struct nbt_peer_socket *src)
 {
        struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, 
                                                       struct nbtd_interface);
@@ -247,18 +247,18 @@ void nbtd_winsserver_request(struct nbt_name_socket *nbtsock,
 
        switch (packet->operation & NBT_OPCODE) {
        case NBT_OPCODE_QUERY:
-               nbtd_winsserver_query(nbtsock, packet, src_address, src_port);
+               nbtd_winsserver_query(nbtsock, packet, src);
                break;
 
        case NBT_OPCODE_REGISTER:
        case NBT_OPCODE_REFRESH:
        case NBT_OPCODE_REFRESH2:
        case NBT_OPCODE_MULTI_HOME_REG:
-               nbtd_winsserver_register(nbtsock, packet, src_address, src_port);
+               nbtd_winsserver_register(nbtsock, packet, src);
                break;
 
        case NBT_OPCODE_RELEASE:
-               nbtd_winsserver_release(nbtsock, packet, src_address, src_port);
+               nbtd_winsserver_release(nbtsock, packet, src);
                break;
        }
 
index 8c7841d0954efba2285cba2804d9c1cd8269fc61..c9f102fdc8663cf990d26633d066ecd374b1244f 100644 (file)
@@ -30,8 +30,7 @@ struct wack_state {
        struct nbt_name_socket *nbtsock;
        struct nbt_name_packet *request_packet;
        struct winsdb_record *rec;
-       const char *src_address;
-       int src_port;
+       struct nbt_peer_socket src;
        const char **owner_addresses;
        const char *reg_address;
        struct nbt_name_query query;
@@ -44,9 +43,9 @@ struct wack_state {
 static void wins_wack_deny(struct wack_state *state)
 {
        nbtd_name_registration_reply(state->nbtsock, state->request_packet, 
-                                    state->src_address, state->src_port, NBT_RCODE_ACT);
-       DEBUG(4,("WINS: denied name registration request for %s from %s\n",
-                nbt_name_string(state, state->rec->name), state->src_address));
+                                    &state->src, NBT_RCODE_ACT);
+       DEBUG(4,("WINS: denied name registration request for %s from %s:%d\n",
+                nbt_name_string(state, state->rec->name), state->src.addr, state->src.port));
        talloc_free(state);
 }
 
@@ -68,7 +67,7 @@ static void wins_wack_allow(struct wack_state *state)
        }
 
        nbtd_name_registration_reply(state->nbtsock, state->request_packet, 
-                                    state->src_address, state->src_port, NBT_RCODE_OK);
+                                    &state->src, NBT_RCODE_OK);
 
        rec->addresses = str_list_add(rec->addresses, state->reg_address);
        if (rec->addresses == NULL) goto failed;
@@ -77,7 +76,7 @@ static void wins_wack_allow(struct wack_state *state)
        if (now + ttl > rec->expire_time) {
                rec->expire_time = now + ttl;
        }
-       rec->registered_by = state->src_address;
+       rec->registered_by = state->src.addr;
 
        winsdb_modify(state->winssrv, rec);
 
@@ -158,7 +157,7 @@ failed:
 void wins_register_wack(struct nbt_name_socket *nbtsock, 
                        struct nbt_name_packet *packet, 
                        struct winsdb_record *rec,
-                       const char *src_address, int src_port)
+                       const struct nbt_peer_socket *src)
 {
        struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private, 
                                                       struct nbtd_interface);
@@ -175,11 +174,11 @@ void wins_register_wack(struct nbt_name_socket *nbtsock,
        state->nbtsock         = nbtsock;
        state->request_packet  = talloc_steal(state, packet);
        state->rec             = talloc_steal(state, rec);
-       state->src_port        = src_port;
        state->owner_addresses = rec->addresses;
        state->reg_address     = packet->additional[0].rdata.netbios.addresses[0].ipaddr;
-       state->src_address     = talloc_strdup(state, src_address);
-       if (state->src_address == NULL) goto failed;
+       state->src.port        = src->port;
+       state->src.addr        = talloc_strdup(state, src->addr);
+       if (state->src.addr == NULL) goto failed;
 
        /* setup a name query to the first address */
        state->query.in.name        = *rec->name;
@@ -198,7 +197,7 @@ void wins_register_wack(struct nbt_name_socket *nbtsock,
        /* send a WACK to the client, specifying the maximum time it could
           take to check with the owner, plus some slack */
        ttl = 5 + 4 * str_list_length(rec->addresses);
-       nbtd_wack_reply(nbtsock, packet, src_address, src_port, ttl);
+       nbtd_wack_reply(nbtsock, packet, src, ttl);
 
        req = nbt_name_query_send(nbtsock, &state->query);
        if (req == NULL) goto failed;
@@ -209,5 +208,5 @@ void wins_register_wack(struct nbt_name_socket *nbtsock,
 
 failed:
        talloc_free(state);
-       nbtd_name_registration_reply(nbtsock, packet, src_address, src_port, NBT_RCODE_SVR);    
+       nbtd_name_registration_reply(nbtsock, packet, src, NBT_RCODE_SVR);      
 }
index ded2b49ea855acff375ee0c0f2f8b5a698d9356f..f63ada51ae53c9b35e7c738c7cf1f384b42e8fa0 100644 (file)
 */
 static void netlogon_handler(struct dgram_mailslot_handler *dgmslot, 
                             struct nbt_dgram_packet *packet, 
-                            const char *src_address, int src_port)
+                            const struct nbt_peer_socket *src)
 {
        NTSTATUS status;
        struct nbt_netlogon_packet netlogon;
        int *replies = dgmslot->private;
 
-       printf("netlogon reply from %s:%d\n", src_address, src_port);
+       printf("netlogon reply from %s:%d\n", src->addr, src->port);
 
        status = dgram_mailslot_netlogon_parse(dgmslot, dgmslot, packet, &netlogon);
        if (!NT_STATUS_IS_OK(status)) {
                printf("Failed to parse netlogon packet from %s:%d\n",
-                      src_address, src_port);
+                      src->addr, src->port);
                return;
        }
 
@@ -62,6 +62,7 @@ static BOOL nbt_test_netlogon(TALLOC_CTX *mem_ctx,
 {
        struct dgram_mailslot_handler *dgmslot;
        struct nbt_dgram_socket *dgmsock = nbt_dgram_socket_init(mem_ctx, NULL);
+       struct nbt_peer_socket dest;
        const char *myaddress = talloc_strdup(dgmsock, iface_best_ip(address));
        struct nbt_netlogon_packet logon;
        struct nbt_name myname;
@@ -81,7 +82,6 @@ static BOOL nbt_test_netlogon(TALLOC_CTX *mem_ctx,
        /* setup a temporary mailslot listener for replies */
        dgmslot = dgram_mailslot_temp(dgmsock, NBT_MAILSLOT_GETDC,
                                      netlogon_handler, &replies);
-       
 
        ZERO_STRUCT(logon);
        logon.command = NETLOGON_QUERY_FOR_PDC;
@@ -94,14 +94,15 @@ static BOOL nbt_test_netlogon(TALLOC_CTX *mem_ctx,
 
        make_nbt_name_client(&myname, TEST_NAME);
 
-       status = dgram_mailslot_netlogon_send(dgmsock, &name, address, 
-                                             0, &myname, &logon);
+       dest.port = 0;
+       dest.addr = address;
+       status = dgram_mailslot_netlogon_send(dgmsock, &name, &dest,
+                                             &myname, &logon);
        if (!NT_STATUS_IS_OK(status)) {
                printf("Failed to send netlogon request - %s\n", nt_errstr(status));
                goto failed;
        }
 
-
        while (timeval_elapsed(&tv) < 5 && replies == 0) {
                event_loop_once(dgmsock->event_ctx);
        }
@@ -121,6 +122,7 @@ static BOOL nbt_test_netlogon2(TALLOC_CTX *mem_ctx,
 {
        struct dgram_mailslot_handler *dgmslot;
        struct nbt_dgram_socket *dgmsock = nbt_dgram_socket_init(mem_ctx, NULL);
+       struct nbt_peer_socket dest;
        const char *myaddress = talloc_strdup(dgmsock, iface_best_ip(address));
        struct nbt_netlogon_packet logon;
        struct nbt_name myname;
@@ -154,8 +156,10 @@ static BOOL nbt_test_netlogon2(TALLOC_CTX *mem_ctx,
 
        make_nbt_name_client(&myname, TEST_NAME);
 
-       status = dgram_mailslot_netlogon_send(dgmsock, &name, address, 
-                                             0, &myname, &logon);
+       dest.port = 0;
+       dest.addr = address;
+       status = dgram_mailslot_netlogon_send(dgmsock, &name, &dest,
+                                             &myname, &logon);
        if (!NT_STATUS_IS_OK(status)) {
                printf("Failed to send netlogon request - %s\n", nt_errstr(status));
                goto failed;
@@ -180,18 +184,18 @@ failed:
 */
 static void ntlogon_handler(struct dgram_mailslot_handler *dgmslot, 
                             struct nbt_dgram_packet *packet, 
-                            const char *src_address, int src_port)
+                            const struct nbt_peer_socket *src)
 {
        NTSTATUS status;
        struct nbt_ntlogon_packet ntlogon;
        int *replies = dgmslot->private;
 
-       printf("ntlogon reply from %s:%d\n", src_address, src_port);
+       printf("ntlogon reply from %s:%d\n", src->addr, src->port);
 
        status = dgram_mailslot_ntlogon_parse(dgmslot, dgmslot, packet, &ntlogon);
        if (!NT_STATUS_IS_OK(status)) {
                printf("Failed to parse ntlogon packet from %s:%d\n",
-                      src_address, src_port);
+                      src->addr, src->port);
                return;
        }
 
@@ -207,6 +211,7 @@ static BOOL nbt_test_ntlogon(TALLOC_CTX *mem_ctx,
 {
        struct dgram_mailslot_handler *dgmslot;
        struct nbt_dgram_socket *dgmsock = nbt_dgram_socket_init(mem_ctx, NULL);
+       struct nbt_peer_socket dest;
        const char *myaddress = talloc_strdup(dgmsock, iface_best_ip(address));
        struct nbt_ntlogon_packet logon;
        struct nbt_name myname;
@@ -255,9 +260,10 @@ static BOOL nbt_test_ntlogon(TALLOC_CTX *mem_ctx,
 
        make_nbt_name_client(&myname, TEST_NAME);
 
-       status = dgram_mailslot_ntlogon_send(dgmsock, DGRAM_DIRECT_UNIQUE,
-                                            &name, address, 
-                                             0, &myname, &logon);
+       dest.port = 0;
+       dest.addr = address;
+       status = dgram_mailslot_ntlogon_send(dgmsock, &name, &dest, 
+                                            &myname, &logon);
        if (!NT_STATUS_IS_OK(status)) {
                printf("Failed to send ntlogon request - %s\n", nt_errstr(status));
                goto failed;