7 This file is part of avahi.
9 avahi is free software; you can redistribute it and/or modify it
10 under the terms of the GNU Lesser General Public License as
11 published by the Free Software Foundation; either version 2.1 of the
12 License, or (at your option) any later version.
14 avahi is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
17 Public License for more details.
19 You should have received a copy of the GNU Lesser General Public
20 License along with avahi; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
25 /** \file rr.h Functions and definitions for manipulating DNS resource record (RR) data. */
28 #include <sys/types.h>
30 #include <avahi-common/strlst.h>
31 #include <avahi-common/address.h>
32 #include <avahi-common/cdecl.h>
36 /** DNS record types, see RFC 1035 */
38 AVAHI_DNS_TYPE_A = 0x01,
39 AVAHI_DNS_TYPE_NS = 0x02,
40 AVAHI_DNS_TYPE_CNAME = 0x05,
41 AVAHI_DNS_TYPE_SOA = 0x06,
42 AVAHI_DNS_TYPE_PTR = 0x0C,
43 AVAHI_DNS_TYPE_HINFO = 0x0D,
44 AVAHI_DNS_TYPE_MX = 0x0F,
45 AVAHI_DNS_TYPE_TXT = 0x10,
46 AVAHI_DNS_TYPE_AAAA = 0x1C,
47 AVAHI_DNS_TYPE_SRV = 0x21,
48 AVAHI_DNS_TYPE_ANY = 0xFF /**< Special query type for requesting all records */
51 /** DNS record classes, see RFC 1035 */
53 AVAHI_DNS_CLASS_IN = 0x01, /**< Probably the only class we will ever use */
54 AVAHI_DNS_CLASS_ANY = 0xFF, /**< Special query type for requesting all records */
55 AVAHI_DNS_CACHE_FLUSH = 0x8000, /**< Not really a class but a bit which may be set in response packets, see mDNS spec for more information */
56 AVAHI_DNS_UNICAST_RESPONSE = 0x8000 /**< Not really a class but a bit which may be set in query packets, see mDNS spec for more information */
59 /** The default TTL for RRs which contain a host name of some kind. */
60 #define AVAHI_DEFAULT_TTL_HOST_NAME (120)
62 /** The default TTL for all other records. */
63 #define AVAHI_DEFAULT_TTL (75*60)
65 /** Encapsulates a DNS query key consisting of class, type and
66 name. Use avahi_key_ref()/avahi_key_unref() for manipulating the
67 reference counter. The structure is intended to be treated as "immutable", no
68 changes should be imposed after creation */
69 typedef struct AvahiKey {
70 int ref; /**< Reference counter */
71 char *name; /**< Record name */
72 uint16_t clazz; /**< Record class, one of the AVAHI_DNS_CLASS_xxx constants */
73 uint16_t type; /**< Record type, one of the AVAHI_DNS_TYPE_xxx constants */
76 /** Encapsulates a DNS resource record. The structure is intended to
77 * be treated as "immutable", no changes should be imposed after
79 typedef struct AvahiRecord {
80 int ref; /**< Reference counter */
81 AvahiKey *key; /**< Reference to the query key of this record */
83 uint32_t ttl; /**< DNS TTL of this record */
90 } generic; /**< Generic record data for unknown types */
97 } srv; /**< Data for SRV records */
101 } ptr, ns, cname; /**< Data for PTR, NS and CNAME records */
106 } hinfo; /**< Data for HINFO records */
109 AvahiStringList *string_list;
110 } txt; /**< Data for TXT records */
113 AvahiIPv4Address address;
114 } a; /**< Data for A records */
117 AvahiIPv6Address address;
118 } aaaa; /**< Data for AAAA records */
120 } data; /**< Record data */
124 /** Create a new AvahiKey object. The reference counter will be set to 1. */
125 AvahiKey *avahi_key_new(const char *name, uint16_t clazz, uint16_t type);
127 /** Increase the reference counter of an AvahiKey object by one */
128 AvahiKey *avahi_key_ref(AvahiKey *k);
130 /** Decrease the reference counter of an AvahiKey object by one */
131 void avahi_key_unref(AvahiKey *k);
133 /** Check whether two AvahiKey object contain the same
134 * data. AVAHI_DNS_CLASS_ANY/AVAHI_DNS_TYPE_ANY are treated like any
135 * other class/type. */
136 int avahi_key_equal(const AvahiKey *a, const AvahiKey *b);
138 /** Return a numeric hash value for a key for usage in hash tables. */
139 unsigned avahi_key_hash(const AvahiKey *k);
141 /** Create a new record object. Record data should be filled in right after creation. The reference counter is set to 1. */
142 AvahiRecord *avahi_record_new(AvahiKey *k, uint32_t ttl);
144 /** Create a new record object. Record data should be filled in right after creation. The reference counter is set to 1. */
145 AvahiRecord *avahi_record_new_full(const char *name, uint16_t clazz, uint16_t type, uint32_t ttl);
147 /** Increase the reference counter of an AvahiRecord by one. */
148 AvahiRecord *avahi_record_ref(AvahiRecord *r);
150 /** Decrease the reference counter of an AvahiRecord by one. */
151 void avahi_record_unref(AvahiRecord *r);
153 /** Return a textual representation of the specified DNS class. The
154 * returned pointer points to a read only internal string. */
155 const char *avahi_dns_class_to_string(uint16_t clazz);
157 /** Return a textual representation of the specified DNS class. The
158 * returned pointer points to a read only internal string. */
159 const char *avahi_dns_type_to_string(uint16_t type);
161 /** Create a textual representation of the specified key. avahi_free() the
163 char *avahi_key_to_string(const AvahiKey *k);
165 /** Create a textual representation of the specified record, similar
166 * in style to BIND zone file data. avahi_free() the result! */
167 char *avahi_record_to_string(const AvahiRecord *r);
169 /** Check whether two records are equal (regardless of the TTL */
170 int avahi_record_equal_no_ttl(const AvahiRecord *a, const AvahiRecord *b);
172 /** Check whether the specified key is valid */
173 int avahi_key_is_valid(AvahiKey *k);
175 /** Check whether the specified record is valid */
176 int avahi_record_is_valid(AvahiRecord *r);
178 /** Parse a binary rdata object and fill it into *record. This function is actually implemented in dns.c */
179 int avahi_rdata_parse(AvahiRecord *record, const void* rdata, size_t size);
181 /** Serialize an AvahiRecord object into binary rdata. This function is actually implemented in dns.c */
182 size_t avahi_rdata_serialize(AvahiRecord *record, void *rdata, size_t max_size);