+
+int avahi_key_is_valid(AvahiKey *k) {
+ assert(k);
+
+ if (!avahi_is_valid_domain_name(k->name))
+ return 0;
+
+ return 1;
+}
+
+int avahi_record_is_valid(AvahiRecord *r) {
+ assert(r);
+
+ if (!avahi_key_is_valid(r->key))
+ return 0;
+
+ switch (r->key->type) {
+
+ case AVAHI_DNS_TYPE_PTR:
+ case AVAHI_DNS_TYPE_CNAME:
+ case AVAHI_DNS_TYPE_NS:
+ return avahi_is_valid_domain_name(r->data.ptr.name);
+
+ case AVAHI_DNS_TYPE_SRV:
+ return avahi_is_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 || strlst->size <= 0)
+ return 0;
+
+ return 1;
+ }
+ }
+
+ return 1;
+}
+
+static AvahiAddress *get_address(const AvahiRecord *r, AvahiAddress *a) {
+ assert(r);
+
+ switch (r->key->type) {
+ case AVAHI_DNS_TYPE_A:
+ a->proto = AVAHI_PROTO_INET;
+ a->data.ipv4 = r->data.a.address;
+ break;
+
+ case AVAHI_DNS_TYPE_AAAA:
+ a->proto = AVAHI_PROTO_INET6;
+ a->data.ipv6 = r->data.aaaa.address;
+ break;
+
+ default:
+ return NULL;
+ }
+
+ return a;
+}
+
+int avahi_record_is_link_local_address(const AvahiRecord *r) {
+ AvahiAddress a;
+
+ assert(r);
+
+ if (!get_address(r, &a))
+ return 0;
+
+ return avahi_address_is_link_local(&a);
+}