X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-core%2Frr.c;h=1a30146bbe68ddfede2ca83001ec5da5da7d5e54;hb=9a5c4c803767ad7eaf77bac16a3c02bd14a4ce43;hp=f69d2e2a5feb9839d6facfb023524e598b4d4234;hpb=4de3df3db7df43474176533d0b5fac851dd4a9b4;p=catta diff --git a/avahi-core/rr.c b/avahi-core/rr.c index f69d2e2..1a30146 100644 --- a/avahi-core/rr.c +++ b/avahi-core/rr.c @@ -31,7 +31,6 @@ #include "util.h" #include "rr.h" -#include "dns.h" AvahiKey *avahi_key_new(const gchar *name, guint16 class, guint16 type) { AvahiKey *k; @@ -40,7 +39,7 @@ AvahiKey *avahi_key_new(const gchar *name, guint16 class, guint16 type) { k = g_new(AvahiKey, 1); k->ref = 1; k->name = avahi_normalize_name(name); - k->class = class; + k->clazz = class; k->type = type; /* g_message("%p %% ref=1", k); */ @@ -71,7 +70,7 @@ void avahi_key_unref(AvahiKey *k) { } } -AvahiRecord *avahi_record_new(AvahiKey *k) { +AvahiRecord *avahi_record_new(AvahiKey *k, guint32 ttl) { AvahiRecord *r; g_assert(k); @@ -82,19 +81,19 @@ AvahiRecord *avahi_record_new(AvahiKey *k) { memset(&r->data, 0, sizeof(r->data)); - r->ttl = AVAHI_DEFAULT_TTL; + r->ttl = ttl != (guint32) -1 ? ttl : AVAHI_DEFAULT_TTL; return r; } -AvahiRecord *avahi_record_new_full(const gchar *name, guint16 class, guint16 type) { +AvahiRecord *avahi_record_new_full(const gchar *name, guint16 class, guint16 type, guint32 ttl) { AvahiRecord *r; AvahiKey *k; g_assert(name); k = avahi_key_new(name, class, type); - r = avahi_record_new(k); + r = avahi_record_new(k, ttl); avahi_key_unref(k); return r; @@ -149,11 +148,15 @@ void avahi_record_unref(AvahiRecord *r) { const gchar *avahi_dns_class_to_string(guint16 class) { if (class & AVAHI_DNS_CACHE_FLUSH) return "FLUSH"; - - if (class == AVAHI_DNS_CLASS_IN) - return "IN"; - return NULL; + switch (class) { + case AVAHI_DNS_CLASS_IN: + return "IN"; + case AVAHI_DNS_CLASS_ANY: + return "ANY"; + default: + return NULL; + } } const gchar *avahi_dns_type_to_string(guint16 type) { @@ -179,11 +182,13 @@ const gchar *avahi_dns_type_to_string(guint16 type) { } } - gchar *avahi_key_to_string(const AvahiKey *k) { + g_assert(k); + g_assert(k->ref >= 1); + return g_strdup_printf("%s\t%s\t%s", k->name, - avahi_dns_class_to_string(k->class), + avahi_dns_class_to_string(k->clazz), avahi_dns_type_to_string(k->type)); } @@ -191,6 +196,9 @@ gchar *avahi_record_to_string(const AvahiRecord *r) { gchar *p, *s; char buf[257], *t = NULL, *d = NULL; + g_assert(r); + g_assert(r->ref >= 1); + switch (r->key->type) { case AVAHI_DNS_TYPE_A: inet_ntop(AF_INET, &r->data.a.address.address, t = buf, sizeof(buf)); @@ -245,7 +253,7 @@ gboolean avahi_key_equal(const AvahiKey *a, const AvahiKey *b) { return avahi_domain_equal(a->name, b->name) && a->type == b->type && - a->class == b->class; + a->clazz == b->clazz; } gboolean avahi_key_pattern_match(const AvahiKey *pattern, const AvahiKey *k) { @@ -261,23 +269,24 @@ gboolean avahi_key_pattern_match(const AvahiKey *pattern, const AvahiKey *k) { return avahi_domain_equal(pattern->name, k->name) && (pattern->type == k->type || pattern->type == AVAHI_DNS_TYPE_ANY) && - pattern->class == k->class; + (pattern->clazz == k->clazz || pattern->clazz == AVAHI_DNS_CLASS_ANY); } gboolean avahi_key_is_pattern(const AvahiKey *k) { g_assert(k); - return k->type == AVAHI_DNS_TYPE_ANY; + return + k->type == AVAHI_DNS_TYPE_ANY || + k->clazz == AVAHI_DNS_CLASS_ANY; } - guint avahi_key_hash(const AvahiKey *k) { g_assert(k); return avahi_domain_hash(k->name) + k->type + - k->class; + k->clazz; } static gboolean rdata_equal(const AvahiRecord *a, const AvahiRecord *b) { @@ -308,8 +317,8 @@ static gboolean rdata_equal(const AvahiRecord *a, const AvahiRecord *b) { case AVAHI_DNS_TYPE_HINFO: return - !g_utf8_collate(a->data.hinfo.cpu, b->data.hinfo.cpu) && - !g_utf8_collate(a->data.hinfo.os, b->data.hinfo.os); + !strcmp(a->data.hinfo.cpu, b->data.hinfo.cpu) && + !strcmp(a->data.hinfo.os, b->data.hinfo.os); case AVAHI_DNS_TYPE_TXT: return avahi_string_list_equal(a->data.txt.string_list, b->data.txt.string_list); @@ -457,7 +466,7 @@ static gint uint16_cmp(guint16 a, guint16 b) { gint avahi_record_lexicographical_compare(AvahiRecord *a, AvahiRecord *b) { gint r; -/* gchar *t1, *t2; */ +/* gchar *t1, *t2; */ g_assert(a); g_assert(b); @@ -471,7 +480,7 @@ gint avahi_record_lexicographical_compare(AvahiRecord *a, AvahiRecord *b) { if (a == b) return 0; - if ((r = uint16_cmp(a->key->class, b->key->class)) || + if ((r = uint16_cmp(a->key->clazz, b->key->clazz)) || (r = uint16_cmp(a->key->type, b->key->type))) return r; @@ -510,7 +519,15 @@ gint avahi_record_lexicographical_compare(AvahiRecord *a, AvahiRecord *b) { avahi_string_list_serialize(a->data.txt.string_list, ma, asize); avahi_string_list_serialize(b->data.txt.string_list, mb, bsize); - r = lexicographical_memcmp(ma, asize, mb, bsize); + if (asize && bsize) + r = lexicographical_memcmp(ma, asize, mb, bsize); + else if (asize && !bsize) + r = 1; + else if (!asize && bsize) + r = -1; + else + r = 0; + g_free(ma); g_free(mb); @@ -535,3 +552,49 @@ gboolean avahi_record_is_goodbye(AvahiRecord *r) { return r->ttl == 0; } + +gboolean avahi_key_valid(AvahiKey *k) { + g_assert(k); + + if (!avahi_valid_domain_name(k->name)) + return FALSE; + + return TRUE; +} + +gboolean avahi_record_valid(AvahiRecord *r) { + g_assert(r); + + if (!avahi_key_valid(r->key)) + return FALSE; + + switch (r->key->type) { + + case AVAHI_DNS_TYPE_PTR: + case AVAHI_DNS_TYPE_CNAME: + return avahi_valid_domain_name(r->data.ptr.name); + + case AVAHI_DNS_TYPE_SRV: + return avahi_valid_domain_name(r->data.srv.name); + + case AVAHI_DNS_TYPE_HINFO: + return + strlen(r->data.hinfo.os) <= 255 && + strlen(r->data.hinfo.cpu) <= 255; + + + case AVAHI_DNS_TYPE_TXT: { + + AvahiStringList *strlst; + + for (strlst = r->data.txt.string_list; strlst; strlst = strlst->next) + if (strlst->size > 255) + return FALSE; + + return TRUE; + } + } + + + return TRUE; +}