Annotation of embedaddon/strongswan/src/libstrongswan/plugins/unbound/unbound_rr.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2012 Reto Guadagnini
                      3:  * HSR Hochschule fuer Technik Rapperswil
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or modify it
                      6:  * under the terms of the GNU General Public License as published by the
                      7:  * Free Software Foundation; either version 2 of the License, or (at your
                      8:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                      9:  *
                     10:  * This program is distributed in the hope that it will be useful, but
                     11:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     12:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     13:  * for more details.
                     14:  */
                     15: 
                     16: #include <resolver/rr.h>
                     17: 
                     18: #include <library.h>
                     19: #include <utils/debug.h>
                     20: 
                     21: #include <stdlib.h>
                     22: #include <string.h>
                     23: 
                     24: #include "unbound_rr.h"
                     25: 
                     26: typedef struct private_unbound_rr_t private_unbound_rr_t;
                     27: 
                     28: /**
                     29:  * private data of an unbound_rr_t object.
                     30:  */
                     31: struct private_unbound_rr_t {
                     32: 
                     33:        /**
                     34:         * Public data
                     35:         */
                     36:        unbound_rr_t public;
                     37: 
                     38:        /**
                     39:         * Owner name
                     40:         */
                     41:        char* name;
                     42: 
                     43:        /**
                     44:         * Type
                     45:         */
                     46:        rr_type_t type;
                     47: 
                     48:        /**
                     49:         * Class
                     50:         */
                     51:        rr_class_t class;
                     52: 
                     53:        /**
                     54:         * TTL
                     55:         */
                     56:        uint32_t ttl;
                     57: 
                     58:        /**
                     59:         * Size of the rdata field in octets
                     60:         */
                     61:        uint16_t size;
                     62: 
                     63:        /**
                     64:         * RDATA field (array of bytes in network order)
                     65:         */
                     66:        u_char *rdata;
                     67: };
                     68: 
                     69: METHOD(rr_t, get_name, char *,
                     70:        private_unbound_rr_t *this)
                     71: {
                     72:        return this->name;
                     73: }
                     74: 
                     75: METHOD(rr_t, get_type, rr_type_t,
                     76:        private_unbound_rr_t *this)
                     77: {
                     78:        return this->type;
                     79: }
                     80: 
                     81: METHOD(rr_t, get_class, rr_class_t,
                     82:        private_unbound_rr_t *this)
                     83: {
                     84:        return this->class;
                     85: }
                     86: 
                     87: METHOD(rr_t, get_ttl, uint32_t,
                     88:        private_unbound_rr_t *this)
                     89: {
                     90:        return this->ttl;
                     91: }
                     92: 
                     93: METHOD(rr_t, get_rdata, chunk_t,
                     94:        private_unbound_rr_t *this)
                     95: {
                     96:        return chunk_create(this->rdata, this->size);
                     97: }
                     98: 
                     99: METHOD(rr_t, destroy, void,
                    100:        private_unbound_rr_t *this)
                    101: {
                    102:        free(this->name);
                    103:        free(this->rdata);
                    104:        free(this);
                    105: }
                    106: 
                    107: /*
                    108:  * Described in header.
                    109:  */
                    110: unbound_rr_t *unbound_rr_create_frm_ldns_rr(ldns_rr *rr)
                    111: {
                    112:        private_unbound_rr_t *this;
                    113:        ldns_status status;
                    114:        ldns_buffer *buf;
                    115:        int i;
                    116: 
                    117:        INIT(this,
                    118:                .public = {
                    119:                        .interface = {
                    120:                                .get_name = _get_name,
                    121:                                .get_type = _get_type,
                    122:                                .get_class = _get_class,
                    123:                                .get_ttl = _get_ttl,
                    124:                                .get_rdata = _get_rdata,
                    125:                                .destroy = _destroy,
                    126:                        },
                    127:                },
                    128:        );
                    129: 
                    130:        this->name = ldns_rdf2str(ldns_rr_owner(rr));
                    131:        if (!this->name)
                    132:        {
                    133:                DBG1(DBG_LIB, "failed to parse the owner name of a DNS RR");
                    134:                _destroy(this);
                    135:                return NULL;
                    136:        }
                    137: 
                    138:        this->type = (rr_type_t)ldns_rr_get_type(rr);
                    139:        this->class = (rr_class_t)ldns_rr_get_class(rr);
                    140:        this->ttl = ldns_rr_ttl(rr);
                    141:        for(i = 0; i < ldns_rr_rd_count(rr); i++)
                    142:        {
                    143:                this->size += ldns_rdf_size(ldns_rr_rdf(rr, i));
                    144:        }
                    145: 
                    146:        /**
                    147:         * The ldns library splits the RDATA field of a RR in various rdf.
                    148:         * Here we reassemble these rdf to get the RDATA field of the RR.
                    149:         */
                    150:        buf = ldns_buffer_new(LDNS_MIN_BUFLEN);
                    151:        /* The buffer will be resized automatically by ldns_rr_rdata2buffer_wire() */
                    152:        status = ldns_rr_rdata2buffer_wire(buf, rr);
                    153: 
                    154:        if (status != LDNS_STATUS_OK)
                    155:        {
                    156:                DBG1(DBG_LIB, "failed to get the RDATA field of a DNS RR");
                    157:                ldns_buffer_free(buf);
                    158:                _destroy(this);
                    159:                return NULL;
                    160:        }
                    161: 
                    162:        this->rdata = ldns_buffer_export(buf);
                    163:        ldns_buffer_free(buf);
                    164: 
                    165:        return &this->public;
                    166: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>