Changeset 3a0a4d8 in mainline for uspace/srv/net/dnsrsrv/query.c


Ignore:
Timestamp:
2013-09-12T07:54:05Z (12 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
95027b5
Parents:
47f5a77 (diff), 64f3d3b (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

merge mainline changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/dnsrsrv/query.c

    r47f5a77 r3a0a4d8  
    3939#include <stdlib.h>
    4040#include <str.h>
    41 
     41#include <net/socket_codes.h>
    4242#include "dns_msg.h"
    4343#include "dns_std.h"
     
    4848static uint16_t msg_id;
    4949
    50 int dns_name2host(const char *name, dns_host_info_t **rinfo)
     50static int dns_name_query(const char *name, dns_qtype_t qtype,
     51    dns_host_info_t *info)
    5152{
    52         dns_message_t *msg;
    53         dns_message_t *amsg;
    54         dns_question_t *question;
    55         dns_host_info_t *info;
    56         char *sname, *cname;
    57         size_t eoff;
    58         int rc;
    59 
    60         question = calloc(1, sizeof(dns_question_t));
    61         if (question == NULL)
    62                 return ENOMEM;
    63 
    64         question->qname = (char *)name;
    65         question->qtype = DTYPE_A;
     53        /* Start with the caller-provided name */
     54        char *sname = str_dup(name);
     55        if (sname == NULL)
     56                return ENOMEM;
     57       
     58        char *qname = str_dup(name);
     59        if (qname == NULL) {
     60                free(sname);
     61                return ENOMEM;
     62        }
     63       
     64        dns_question_t *question = calloc(1, sizeof(dns_question_t));
     65        if (question == NULL) {
     66                free(qname);
     67                free(sname);
     68                return ENOMEM;
     69        }
     70       
     71        question->qname = qname;
     72        question->qtype = qtype;
    6673        question->qclass = DC_IN;
    67 
    68         msg = dns_message_new();
    69         if (msg == NULL)
    70                 return ENOMEM;
    71 
    72         list_append(&question->msg, &msg->question);
    73 
     74       
     75        dns_message_t *msg = dns_message_new();
     76        if (msg == NULL) {
     77                free(question);
     78                free(qname);
     79                free(sname);
     80                return ENOMEM;
     81        }
     82       
    7483        msg->id = msg_id++;
    7584        msg->qr = QR_QUERY;
     
    7988        msg->rd = true;
    8089        msg->ra = false;
    81 
    82         rc = dns_request(msg, &amsg);
     90       
     91        list_append(&question->msg, &msg->question);
     92       
     93        dns_message_t *amsg;
     94        int rc = dns_request(msg, &amsg);
    8395        if (rc != EOK) {
     96                dns_message_destroy(msg);
     97                free(sname);
    8498                return rc;
    8599        }
    86 
    87         /* Start with the caller-provided name */
    88         sname = str_dup(name);
    89 
    90         list_foreach(amsg->answer, link) {
    91                 dns_rr_t *rr = list_get_instance(link, dns_rr_t, msg);
    92 
     100       
     101        list_foreach(amsg->answer, msg, dns_rr_t, rr) {
    93102                log_msg(LOG_DEFAULT, LVL_DEBUG, " - '%s' %u/%u, dsize %zu",
    94                         rr->name, rr->rtype, rr->rclass, rr->rdata_size);
    95 
    96                 if (rr->rtype == DTYPE_CNAME && rr->rclass == DC_IN &&
    97                     str_cmp(rr->name, sname) == 0) {
     103                    rr->name, rr->rtype, rr->rclass, rr->rdata_size);
     104               
     105                if ((rr->rtype == DTYPE_CNAME) && (rr->rclass == DC_IN) &&
     106                    (str_cmp(rr->name, sname) == 0)) {
     107                       
    98108                        log_msg(LOG_DEFAULT, LVL_DEBUG, "decode cname (%p, %zu, %zu)",
    99109                            amsg->pdu.data, amsg->pdu.size, rr->roff);
     110                       
     111                        char *cname;
     112                        size_t eoff;
    100113                        rc = dns_name_decode(&amsg->pdu, rr->roff, &cname, &eoff);
    101114                        if (rc != EOK) {
    102                                 log_msg(LOG_DEFAULT, LVL_DEBUG,
    103                                     "error decoding cname");
    104                                 assert(rc == EINVAL || rc == ENOMEM);
     115                                assert((rc == EINVAL) || (rc == ENOMEM));
     116                               
     117                                log_msg(LOG_DEFAULT, LVL_DEBUG, "error decoding cname");
     118                               
    105119                                dns_message_destroy(msg);
    106120                                dns_message_destroy(amsg);
     121                                free(sname);
     122                               
    107123                                return rc;
    108124                        }
    109 
     125                       
    110126                        log_msg(LOG_DEFAULT, LVL_DEBUG, "name = '%s' "
    111127                            "cname = '%s'", sname, cname);
    112 
     128                       
     129                        /* Continue looking for the more canonical name */
    113130                        free(sname);
    114                         /* Continue looking for the more canonical name */
    115131                        sname = cname;
    116132                }
    117 
    118                 if (rr->rtype == DTYPE_A && rr->rclass == DC_IN &&
    119                         rr->rdata_size == sizeof(uint32_t) &&
    120                             str_cmp(rr->name, sname) == 0) {
    121 
    122                         info = calloc(1, sizeof(dns_host_info_t));
    123                         if (info == NULL) {
     133               
     134                if ((qtype == DTYPE_A) && (rr->rtype == DTYPE_A) &&
     135                    (rr->rclass == DC_IN) && (rr->rdata_size == sizeof(addr32_t)) &&
     136                    (str_cmp(rr->name, sname) == 0)) {
     137                       
     138                        info->cname = str_dup(rr->name);
     139                        if (info->cname == NULL) {
    124140                                dns_message_destroy(msg);
    125141                                dns_message_destroy(amsg);
     142                                free(sname);
     143                               
    126144                                return ENOMEM;
    127145                        }
    128 
    129                         info->cname = str_dup(rr->name);
     146                       
    130147                        inet_addr_set(dns_uint32_t_decode(rr->rdata, rr->rdata_size),
    131148                            &info->addr);
     
    133150                        dns_message_destroy(msg);
    134151                        dns_message_destroy(amsg);
    135                         *rinfo = info;
     152                        free(sname);
     153                       
    136154                        return EOK;
    137155                }
    138         }
    139 
     156               
     157                if ((qtype == DTYPE_AAAA) && (rr->rtype == DTYPE_AAAA) &&
     158                    (rr->rclass == DC_IN) && (rr->rdata_size == sizeof(addr128_t)) &&
     159                    (str_cmp(rr->name, sname) == 0)) {
     160               
     161                        info->cname = str_dup(rr->name);
     162                        if (info->cname == NULL) {
     163                                dns_message_destroy(msg);
     164                                dns_message_destroy(amsg);
     165                                free(sname);
     166                               
     167                                return ENOMEM;
     168                        }
     169                       
     170                        addr128_t addr;
     171                        dns_addr128_t_decode(rr->rdata, rr->rdata_size, addr);
     172                       
     173                        inet_addr_set6(addr, &info->addr);
     174                       
     175                        dns_message_destroy(msg);
     176                        dns_message_destroy(amsg);
     177                        free(sname);
     178                       
     179                        return EOK;
     180                }
     181        }
     182       
     183        log_msg(LOG_DEFAULT, LVL_DEBUG, "'%s' not resolved, fail", sname);
     184       
    140185        dns_message_destroy(msg);
    141186        dns_message_destroy(amsg);
    142         log_msg(LOG_DEFAULT, LVL_DEBUG, "'%s' not resolved, fail", sname);
    143 
     187        free(sname);
     188       
    144189        return EIO;
     190}
     191
     192int dns_name2host(const char *name, dns_host_info_t **rinfo, uint16_t af)
     193{
     194        dns_host_info_t *info = calloc(1, sizeof(dns_host_info_t));
     195        if (info == NULL)
     196                return ENOMEM;
     197       
     198        int rc;
     199       
     200        switch (af) {
     201        case AF_NONE:
     202                rc = dns_name_query(name, DTYPE_AAAA, info);
     203               
     204                if (rc != EOK)
     205                        rc = dns_name_query(name, DTYPE_A, info);
     206               
     207                break;
     208        case AF_INET:
     209                rc = dns_name_query(name, DTYPE_A, info);
     210                break;
     211        case AF_INET6:
     212                rc = dns_name_query(name, DTYPE_AAAA, info);
     213                break;
     214        default:
     215                rc = EINVAL;
     216        }
     217       
     218        if (rc == EOK)
     219                *rinfo = info;
     220        else
     221                free(info);
     222       
     223        return rc;
    145224}
    146225
Note: See TracChangeset for help on using the changeset viewer.