Ignore:
File:
1 edited

Legend:

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

    r716357f r959d2ec  
    5454        dns_question_t *question;
    5555        dns_host_info_t *info;
     56        char *sname, *cname;
     57        size_t eoff;
    5658        int rc;
    5759
     
    8385        }
    8486
     87        /* Start with the caller-provided name */
     88        sname = str_dup(name);
     89
    8590        list_foreach(amsg->answer, link) {
    8691                dns_rr_t *rr = list_get_instance(link, dns_rr_t, msg);
     
    8994                        rr->name, rr->rtype, rr->rclass, rr->rdata_size);
    9095
     96                if (rr->rtype == DTYPE_CNAME && rr->rclass == DC_IN &&
     97                    str_cmp(rr->name, sname) == 0) {
     98                        log_msg(LOG_DEFAULT, LVL_DEBUG, "decode cname (%p, %zu, %zu)",
     99                            amsg->pdu.data, amsg->pdu.size, rr->roff);
     100                        rc = dns_name_decode(&amsg->pdu, rr->roff, &cname, &eoff);
     101                        if (rc != EOK) {
     102                                log_msg(LOG_DEFAULT, LVL_DEBUG,
     103                                    "error decoding cname");
     104                                assert(rc == EINVAL || rc == ENOMEM);
     105                                dns_message_destroy(msg);
     106                                dns_message_destroy(amsg);
     107                                return rc;
     108                        }
     109
     110                        log_msg(LOG_DEFAULT, LVL_DEBUG, "name = '%s' "
     111                            "cname = '%s'", sname, cname);
     112
     113                        free(sname);
     114                        /* Continue looking for the more canonical name */
     115                        sname = cname;
     116                }
     117
    91118                if (rr->rtype == DTYPE_A && rr->rclass == DC_IN &&
    92                         rr->rdata_size == sizeof(uint32_t)) {
     119                        rr->rdata_size == sizeof(uint32_t) &&
     120                            str_cmp(rr->name, sname) == 0) {
    93121
    94122                        info = calloc(1, sizeof(dns_host_info_t));
    95123                        if (info == NULL) {
     124                                dns_message_destroy(msg);
    96125                                dns_message_destroy(amsg);
    97126                                return ENOMEM;
    98127                        }
    99128
    100                         info->name = str_dup(rr->name);
     129                        info->cname = str_dup(rr->name);
    101130                        info->addr.ipv4 = dns_uint32_t_decode(rr->rdata, rr->rdata_size);
    102                         log_msg(LOG_DEFAULT, LVL_DEBUG, "info->addr = %x",
    103                             info->addr.ipv4);
     131                        log_msg(LOG_DEFAULT, LVL_DEBUG, "info->name = '%s' "
     132                            "info->addr = %x", info->cname, info->addr.ipv4);
    104133
    105134                        dns_message_destroy(msg);
     
    112141        dns_message_destroy(msg);
    113142        dns_message_destroy(amsg);
    114         log_msg(LOG_DEFAULT, LVL_DEBUG, "No A/IN found, fail");
     143        log_msg(LOG_DEFAULT, LVL_DEBUG, "'%s' not resolved, fail", sname);
    115144
    116145        return EIO;
     
    119148void dns_hostinfo_destroy(dns_host_info_t *info)
    120149{
    121         free(info->name);
     150        free(info->cname);
    122151        free(info);
    123152}
Note: See TracChangeset for help on using the changeset viewer.