r5304: removed lib/socket/socket.h from includes.h
[jelmer/samba4-debian.git] / source / libcli / nbt / namequery.c
index 36fbfc8dd0b8b81fb73d23396d46fba11adf485f..5907c45b875e6a70ca498ab6b2006d2efbe9ae4a 100644 (file)
@@ -53,7 +53,7 @@ struct nbt_name_request *nbt_name_query_send(struct nbt_name_socket *nbtsock,
        packet->questions[0].question_class = NBT_QCLASS_IP;
        
        req = nbt_name_request_send(nbtsock, io->in.dest_addr, lp_nbt_port(), packet,
-                                   timeval_current_ofs(io->in.timeout, 0), False);
+                                   io->in.timeout, io->in.retries, False);
        if (req == NULL) goto failed;
 
        talloc_free(packet);
@@ -72,8 +72,6 @@ NTSTATUS nbt_name_query_recv(struct nbt_name_request *req,
 {
        NTSTATUS status;
        struct nbt_name_packet *packet;
-       const char *addr;
-       struct in_addr in;
        int i;
 
        status = nbt_name_request_recv(req);
@@ -86,11 +84,17 @@ 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);
 
+       if ((packet->operation & NBT_RCODE) != 0) {
+               status = nbt_rcode_to_ntstatus(packet->operation & NBT_RCODE);
+               talloc_free(req);
+               return status;
+       }
+
        if (packet->ancount != 1 ||
            packet->answers[0].rr_type != NBT_QTYPE_NETBIOS ||
            packet->answers[0].rr_class != NBT_QCLASS_IP) {
                talloc_free(req);
-               return NT_STATUS_INVALID_NETWORK_RESPONSE;
+               return status;
        }
 
        io->out.name = packet->answers[0].name;
@@ -102,13 +106,8 @@ NTSTATUS nbt_name_query_recv(struct nbt_name_request *req,
        }
        
        for (i=0;i<io->out.num_addrs;i++) {
-               in.s_addr = htonl(packet->answers[0].rdata.netbios.addresses[i].ipaddr);
-               addr = inet_ntoa(in);
-               if (addr == NULL) {
-                       talloc_free(req);
-                       return NT_STATUS_NO_MEMORY;
-               }
-               io->out.reply_addrs[i] = talloc_strdup(mem_ctx, addr);
+               io->out.reply_addrs[i] = talloc_steal(mem_ctx, 
+                                                     packet->answers[0].rdata.netbios.addresses[i].ipaddr);
        }
 
        talloc_steal(mem_ctx, io->out.name.name);
@@ -153,7 +152,7 @@ struct nbt_name_request *nbt_name_status_send(struct nbt_name_socket *nbtsock,
        packet->questions[0].question_class = NBT_QCLASS_IP;
        
        req = nbt_name_request_send(nbtsock, io->in.dest_addr, lp_nbt_port(), packet,
-                                   timeval_current_ofs(io->in.timeout, 0), False);
+                                   io->in.timeout, io->in.retries, False);
        if (req == NULL) goto failed;
 
        talloc_free(packet);
@@ -184,6 +183,12 @@ 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);
 
+       if ((packet->operation & NBT_RCODE) != 0) {
+               status = nbt_rcode_to_ntstatus(packet->operation & NBT_RCODE);
+               talloc_free(req);
+               return status;
+       }
+
        if (packet->ancount != 1 ||
            packet->answers[0].rr_type != NBT_QTYPE_STATUS ||
            packet->answers[0].rr_class != NBT_QCLASS_IP) {