+ return ret;
+}
+
+static void hexstring(gchar *s, size_t sl, const void *p, size_t pl) {
+ static const gchar hex[] = "0123456789abcdef";
+ gboolean b = FALSE;
+ const guint8 *k = p;
+
+ while (sl > 1 && pl > 0) {
+ *(s++) = hex[(b ? *k : *k >> 4) & 0xF];
+
+ if (b) {
+ k++;
+ pl--;
+ }
+
+ b = !b;
+
+ sl--;
+ }
+
+ if (sl > 0)
+ *s = 0;
+}
+
+gint avahi_server_add_dns_server_address(
+ AvahiServer *s,
+ AvahiEntryGroup *g,
+ gint interface,
+ guchar protocol,
+ const gchar *domain,
+ AvahiDNSServerType type,
+ const AvahiAddress *address,
+ guint16 port /** should be 53 */) {
+
+ AvahiRecord *r;
+ gint ret;
+ gchar n[64] = "ip-";
+
+ g_assert(s);
+ g_assert(address);
+ g_assert(type == AVAHI_DNS_SERVER_UPDATE || type == AVAHI_DNS_SERVER_RESOLVE);
+ g_assert(address->family == AVAHI_PROTO_INET || address->family == AVAHI_PROTO_INET6);
+
+ if (address->family == AVAHI_PROTO_INET) {
+ hexstring(n+3, sizeof(n)-3, &address->data, 4);
+ r = avahi_record_new_full(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_A, AVAHI_DEFAULT_TTL_HOST_NAME);
+ r->data.a.address = address->data.ipv4;
+ } else {
+ hexstring(n+3, sizeof(n)-3, &address->data, 6);
+ r = avahi_record_new_full(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_AAAA, AVAHI_DEFAULT_TTL_HOST_NAME);
+ r->data.aaaa.address = address->data.ipv6;
+ }
+
+ ret = avahi_server_add(s, g, interface, protocol, AVAHI_ENTRY_UNIQUE | AVAHI_ENTRY_ALLOWMUTIPLE, r);
+ avahi_record_unref(r);
+
+ ret |= avahi_server_add_dns_server_name(s, g, interface, protocol, domain, type, n, port);
+
+ return ret;