Changeset d531bd6 in mainline


Ignore:
Timestamp:
2013-05-08T09:24:24Z (11 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.

Location:
uspace/srv/net/dnsrsrv
Files:
4 edited

Legend:

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

    r06fe3b6 rd531bd6  
    135135}
    136136
    137 static int dns_name_decode(uint8_t *buf, size_t size, size_t boff, char **rname,
     137int dns_name_decode(uint8_t *buf, size_t size, size_t boff, char **rname,
    138138    size_t *eoff)
    139139{
     
    405405
    406406        memcpy(rr->rdata, bp, rdlength);
     407        rr->roff = bp - buf;
    407408        bp += rdlength;
    408409        bsz -= rdlength;
     
    491492                return ENOMEM;
    492493
    493         if (size < sizeof(dns_header_t))
    494                 return EINVAL;
     494        if (size < sizeof(dns_header_t)) {
     495                rc = EINVAL;
     496                goto error;
     497        }
     498
     499        /* Store a copy of raw message data for string decompression */
     500
     501        msg->raw = malloc(size);
     502        if (msg->raw == NULL) {
     503                rc = EINVAL;
     504                goto error;
     505        }
     506
     507        memcpy(msg->raw, data, size);
     508        msg->raw_size = size;
     509        log_msg(LOG_DEFAULT, LVL_NOTE, "dns_message_decode: msg->raw = %p, msg->raw_size=%zu",
     510            msg->raw, msg->raw_size);
    495511
    496512        hdr = data;
     
    605621        }
    606622
     623        free(msg->raw);
    607624        free(msg);
    608625}
  • uspace/srv/net/dnsrsrv/dns_msg.h

    r06fe3b6 rd531bd6  
    4747extern dns_message_t *dns_message_new(void);
    4848extern void dns_message_destroy(dns_message_t *);
     49extern int dns_name_decode(uint8_t *, size_t, size_t, char **, size_t *);
    4950extern uint32_t dns_uint32_t_decode(uint8_t *, size_t);
    5051
  • uspace/srv/net/dnsrsrv/dns_type.h

    r06fe3b6 rd531bd6  
    4343#include "dns_std.h"
    4444
    45 /** Unencoded DNS message */
     45/** DNS message */
    4646typedef struct {
     47        /** Raw message data */
     48        void *raw;
     49        /** Raw message size */
     50        size_t raw_size;
     51
    4752        /** Identifier */
    4853        uint16_t id;
     
    95100        /** Number of bytes in @c *rdata */
    96101        size_t rdata_size;
     102        /** Offset in the raw message */
     103        size_t roff;
    97104} dns_rr_t;
    98105
  • 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.