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


Ignore:
Timestamp:
2013-05-08T09:24:24Z (12 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9f029aa
Parents:
06fe3b6
Message:

Handle CNAME records.

File:
1 edited

Legend:

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

    r06fe3b6 rd531bd6  
    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->raw, amsg->raw_size, rr->roff);
     100                        rc = dns_name_decode(amsg->raw, amsg->raw_size, rr->roff,
     101                            &cname, &eoff);
     102                        if (rc != EOK) {
     103                                log_msg(LOG_DEFAULT, LVL_DEBUG,
     104                                    "error decoding cname");
     105                                assert(rc == EINVAL || rc == ENOMEM);
     106                                dns_message_destroy(msg);
     107                                dns_message_destroy(amsg);
     108                                return rc;
     109                        }
     110
     111                        log_msg(LOG_DEFAULT, LVL_DEBUG, "name = '%s' "
     112                            "cname = '%s'", sname, cname);
     113
     114                        free(sname);
     115                        /* Continue looking for the more canonical name */
     116                        sname = cname;
     117                }
     118
    91119                if (rr->rtype == DTYPE_A && rr->rclass == DC_IN &&
    92                         rr->rdata_size == sizeof(uint32_t)) {
     120                        rr->rdata_size == sizeof(uint32_t) &&
     121                            str_cmp(rr->name, sname) == 0) {
    93122
    94123                        info = calloc(1, sizeof(dns_host_info_t));
    95124                        if (info == NULL) {
     125                                dns_message_destroy(msg);
    96126                                dns_message_destroy(amsg);
    97127                                return ENOMEM;
     
    100130                        info->name = str_dup(rr->name);
    101131                        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);
     132                        log_msg(LOG_DEFAULT, LVL_DEBUG, "info->name = '%s' "
     133                            "info->addr = %x", info->name, info->addr.ipv4);
    104134
    105135                        dns_message_destroy(msg);
     
    112142        dns_message_destroy(msg);
    113143        dns_message_destroy(amsg);
    114         log_msg(LOG_DEFAULT, LVL_DEBUG, "No A/IN found, fail");
     144        log_msg(LOG_DEFAULT, LVL_DEBUG, "'%s' not resolved, fail", sname);
    115145
    116146        return EIO;
Note: See TracChangeset for help on using the changeset viewer.