resolved-dns-rr.h revision 2e276efc7b0398a3086629a52970bdd4ab7252f9
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier#pragma once
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier/***
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier This file is part of systemd.
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier Copyright 2014 Lennart Poettering
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier systemd is free software; you can redistribute it and/or modify it
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier under the terms of the GNU Lesser General Public License as published by
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier the Free Software Foundation; either version 2.1 of the License, or
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier (at your option) any later version.
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier systemd is distributed in the hope that it will be useful, but
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier WITHOUT ANY WARRANTY; without even the implied warranty of
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier Lesser General Public License for more details.
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier You should have received a copy of the GNU Lesser General Public License
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier along with systemd; If not, see <http://www.gnu.org/licenses/>.
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier ***/
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier#include <inttypes.h>
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier#include <netinet/in.h>
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier#include "util.h"
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier#include "hashmap.h"
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier#include "in-addr-util.h"
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevaliertypedef struct DnsResourceKey DnsResourceKey;
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevaliertypedef struct DnsResourceRecord DnsResourceRecord;
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier/* DNS record classes, see RFC 1035 */
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalierenum {
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier DNS_CLASS_IN = 0x01,
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier DNS_CLASS_ANY = 0xFF,
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier _DNS_CLASS_MAX,
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier _DNS_CLASS_INVALID = -1
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier};
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier/* DNS record types, see RFC 1035 */
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalierenum {
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier /* Normal records */
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier DNS_TYPE_A = 0x01,
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier DNS_TYPE_NS = 0x02,
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier DNS_TYPE_CNAME = 0x05,
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier DNS_TYPE_SOA = 0x06,
1f532d7ef35210f11e75cfcab0535e65a37901f3Ronny Chevalier DNS_TYPE_PTR = 0x0C,
1f532d7ef35210f11e75cfcab0535e65a37901f3Ronny Chevalier DNS_TYPE_HINFO = 0x0D,
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier DNS_TYPE_MX = 0x0F,
e6b5c5d03cb28d2149dc1c124c2a315911b91f4fRonny Chevalier DNS_TYPE_TXT = 0x10,
DNS_TYPE_AAAA = 0x1C,
DNS_TYPE_SRV = 0x21,
DNS_TYPE_DNAME = 0x27,
DNS_TYPE_SSHFP = 0x2C,
/* Special records */
DNS_TYPE_ANY = 0xFF,
DNS_TYPE_OPT = 0x29, /* EDNS0 option */
DNS_TYPE_TKEY = 0xF9,
DNS_TYPE_TSIG = 0xFA,
DNS_TYPE_IXFR = 0xFB,
DNS_TYPE_AXFR = 0xFC,
_DNS_TYPE_MAX,
_DNS_TYPE_INVALID = -1
};
struct DnsResourceKey {
unsigned n_ref;
uint16_t class, type;
char *_name; /* don't access directy, use DNS_RESOURCE_KEY_NAME()! */
};
struct DnsResourceRecord {
unsigned n_ref;
DnsResourceKey *key;
uint32_t ttl;
union {
struct {
void *data;
uint16_t size;
} generic;
/* struct { */
/* uint16_t priority; */
/* uint16_t weight; */
/* uint16_t port; */
/* char *name; */
/* } srv; */
struct {
char *name;
} ptr, ns, cname;
struct {
char *cpu;
char *os;
} hinfo;
struct {
char **strings;
} txt;
struct {
struct in_addr in_addr;
} a;
struct {
struct in6_addr in6_addr;
} aaaa;
struct {
char *mname;
char *rname;
uint32_t serial;
uint32_t refresh;
uint32_t retry;
uint32_t expire;
uint32_t minimum;
} soa;
struct {
uint16_t priority;
char *exchange;
} mx;
};
};
static inline const char* DNS_RESOURCE_KEY_NAME(const DnsResourceKey *key) {
if (_unlikely_(!key))
return NULL;
if (key->_name)
return key->_name;
return (char*) key + sizeof(DnsResourceKey);
}
DnsResourceKey* dns_resource_key_new(uint16_t class, uint16_t type, const char *name);
DnsResourceKey* dns_resource_key_new_consume(uint16_t class, uint16_t type, char *name);
DnsResourceKey* dns_resource_key_ref(DnsResourceKey *key);
DnsResourceKey* dns_resource_key_unref(DnsResourceKey *key);
int dns_resource_key_equal(const DnsResourceKey *a, const DnsResourceKey *b);
int dns_resource_key_match_rr(const DnsResourceKey *key, const DnsResourceRecord *rr);
int dns_resource_key_match_cname(const DnsResourceKey *key, const DnsResourceRecord *rr);
unsigned long dns_resource_key_hash_func(const void *i, const uint8_t hash_key[HASH_KEY_SIZE]);
int dns_resource_key_compare_func(const void *a, const void *b);
int dns_resource_key_to_string(const DnsResourceKey *key, char **ret);
DEFINE_TRIVIAL_CLEANUP_FUNC(DnsResourceKey*, dns_resource_key_unref);
DnsResourceRecord* dns_resource_record_new(DnsResourceKey *key);
DnsResourceRecord* dns_resource_record_new_full(uint16_t class, uint16_t type, const char *name);
DnsResourceRecord* dns_resource_record_ref(DnsResourceRecord *rr);
DnsResourceRecord* dns_resource_record_unref(DnsResourceRecord *rr);
int dns_resource_record_new_reverse(DnsResourceRecord **ret, int family, const union in_addr_union *address, const char *name);
int dns_resource_record_equal(const DnsResourceRecord *a, const DnsResourceRecord *b);
int dns_resource_record_to_string(const DnsResourceRecord *rr, char **ret);
DEFINE_TRIVIAL_CLEANUP_FUNC(DnsResourceRecord*, dns_resource_record_unref);
const char *dns_type_to_string(uint16_t type);
int dns_type_from_string(const char *name, uint16_t *type);
const char *dns_class_to_string(uint16_t type);
int dns_class_from_string(const char *name, uint16_t *class);