4 #include <sys/socket.h>
10 flxKey *flx_key_new(const gchar *name, guint16 class, guint16 type) {
16 k->name = flx_normalize_name(name);
23 flxKey *flx_key_ref(flxKey *k) {
25 g_assert(k->ref >= 1);
31 void flx_key_unref(flxKey *k) {
33 g_assert(k->ref >= 1);
35 if ((--k->ref) <= 0) {
41 flxRecord *flx_record_new(flxKey *k, gconstpointer data, guint16 size, guint32 ttl) {
49 r = g_new(flxRecord, 1);
51 r->key = flx_key_ref(k);
52 r->data = g_memdup(data, size);
59 flxRecord *flx_record_new_full(const gchar *name, guint16 class, guint16 type, gconstpointer data, guint16 size, guint32 ttl) {
63 k = flx_key_new(name, class, type);
64 r = flx_record_new(k, data, size, ttl);
70 flxRecord *flx_record_ref(flxRecord *r) {
72 g_assert(r->ref >= 1);
78 void flx_record_unref(flxRecord *r) {
80 g_assert(r->ref >= 1);
82 if ((--r->ref) <= 0) {
83 flx_key_unref(r->key);
89 const gchar *flx_dns_class_to_string(guint16 class) {
90 if (class == FLX_DNS_CLASS_IN)
96 const gchar *flx_dns_type_to_string(guint16 type) {
100 case FLX_DNS_TYPE_AAAA:
102 case FLX_DNS_TYPE_PTR:
104 case FLX_DNS_TYPE_HINFO:
106 case FLX_DNS_TYPE_TXT:
114 gchar *flx_key_to_string(flxKey *k) {
115 return g_strdup_printf("%s\t%s\t%s",
117 flx_dns_class_to_string(k->class),
118 flx_dns_type_to_string(k->type));
121 gchar *flx_record_to_string(flxRecord *r) {
123 char t[256] = "<unparsable>";
125 if (r->key->type == FLX_DNS_TYPE_A)
126 inet_ntop(AF_INET, r->data, t, sizeof(t));
127 else if (r->key->type == FLX_DNS_TYPE_AAAA)
128 inet_ntop(AF_INET6, r->data, t, sizeof(t));
129 else if (r->key->type == FLX_DNS_TYPE_PTR || r->key->type == FLX_DNS_TYPE_TXT) {
136 memcpy(t, r->data, l);
138 } else if (r->key->type == FLX_DNS_TYPE_HINFO) {
141 if ((s2 = memchr(r->data, 0, r->size))) {
143 if (memchr(s2, 0, r->size - ((char*) s2 - (char*) r->data)))
144 snprintf(t, sizeof(t), "'%s' '%s'", (char*) r->data, s2);
148 p = flx_key_to_string(r->key);
149 s = g_strdup_printf("%s %s", p, t);
155 gboolean flx_key_equal(const flxKey *a, const flxKey *b) {
159 return strcmp(a->name, b->name) == 0 && a->type == b->type && a->class == b->class;
162 guint flx_key_hash(const flxKey *k) {
165 return g_str_hash(k->name) + k->type + k->class;