X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=rr.h;h=483fcaae7e1724d5bac5b787ccb91bf0ed47b12d;hb=ba8547ee3f34d8fe7bedb559530b2c0374f2089c;hp=f17c36f74edb05ecd09d69dc8b0afc9772eb3465;hpb=8e7f83aa5b6d910e80c56b31f4eb79b02e7ca67b;p=catta diff --git a/rr.h b/rr.h index f17c36f..483fcaa 100644 --- a/rr.h +++ b/rr.h @@ -3,6 +3,9 @@ #include +#include "strlst.h" +#include "address.h" + enum { FLX_DNS_TYPE_A = 0x01, FLX_DNS_TYPE_NS = 0x02, @@ -13,11 +16,13 @@ enum { FLX_DNS_TYPE_MX = 0x0F, FLX_DNS_TYPE_TXT = 0x10, FLX_DNS_TYPE_AAAA = 0x1C, - FLX_DNS_TYPE_SRV = 0x21 + FLX_DNS_TYPE_SRV = 0x21, + FLX_DNS_TYPE_ANY = 0xFF }; enum { - FLX_DNS_CLASS_IN = 0x01 + FLX_DNS_CLASS_IN = 0x01, + FLX_DNS_CACHE_FLUSH = 0x8000 }; #define FLX_DEFAULT_TTL (120*60) @@ -33,29 +38,78 @@ typedef struct { guint ref; flxKey *key; - gpointer data; - guint16 size; guint32 ttl; + + union { + struct { + gpointer data; + guint16 size; + } generic; + + struct { + guint16 priority; + guint16 weight; + guint16 port; + gchar *name; + } srv; + + struct { + gchar *name; + } ptr; /* and cname */ + + struct { + gchar *cpu; + gchar *os; + } hinfo; + + struct { + flxStringList *string_list; + } txt; + + struct { + flxIPv4Address address; + } a; + + struct { + flxIPv6Address address; + } aaaa; + + } data; + } flxRecord; flxKey *flx_key_new(const gchar *name, guint16 class, guint16 type); flxKey *flx_key_ref(flxKey *k); void flx_key_unref(flxKey *k); -gboolean flx_key_equal(const flxKey *a, const flxKey *b); +gboolean flx_key_equal(const flxKey *a, const flxKey *b); /* Treat FLX_DNS_CLASS_ANY like any other type */ +gboolean flx_key_pattern_match(const flxKey *pattern, const flxKey *k); /* If pattern.type is FLX_DNS_CLASS_ANY, k.type is ignored */ + +gboolean flx_key_is_pattern(const flxKey *k); + guint flx_key_hash(const flxKey *k); -flxRecord *flx_record_new(flxKey *k, gconstpointer data, guint16 size, guint32 ttl); -flxRecord *flx_record_new_full(const gchar *name, guint16 class, guint16 type, gconstpointer data, guint16 size, guint32 ttl); +flxRecord *flx_record_new(flxKey *k); +flxRecord *flx_record_new_full(const gchar *name, guint16 class, guint16 type); flxRecord *flx_record_ref(flxRecord *r); void flx_record_unref(flxRecord *r); const gchar *flx_dns_class_to_string(guint16 class); const gchar *flx_dns_type_to_string(guint16 type); -gchar *flx_key_to_string(flxKey *k); /* g_free() the result! */ -gchar *flx_record_to_string(flxRecord *r); /* g_free() the result! */ +gchar *flx_key_to_string(const flxKey *k); /* g_free() the result! */ +gchar *flx_record_to_string(const flxRecord *r); /* g_free() the result! */ gboolean flx_record_equal_no_ttl(const flxRecord *a, const flxRecord *b); +flxRecord *flx_record_copy(flxRecord *r); + +/* returns a maximum estimate for the space that is needed to store + * this key in a DNS packet */ +guint flx_key_get_estimate_size(flxKey *k); + +/* ditto */ +guint flx_record_get_estimate_size(flxRecord *r); + + #endif