summaryrefslogtreecommitdiffstats
path: root/avahi-core/server.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-06-24 01:00:13 +0000
committerLennart Poettering <lennart@poettering.net>2005-06-24 01:00:13 +0000
commit9f9f4f6ea2405edc642d322c19f6f13e31920046 (patch)
tree2a4a3a8ecbe0f942a140a98b4f1621d183575297 /avahi-core/server.c
parent697d33e34648286fd42ff6086087e0111726f749 (diff)
* update todo list
* add avvahi-dnsconfd * implement AvahiDNSServerBrowser * Update special browse/register RRs to match current RFC * add support to avahi-daemon to publish name server information * add support to avahi-daemon to publish /etc/resolv.conf DNS server information * add new simple protocol command: "BROWSE-DNS-SERVERS" * cleanup final configure message git-svn-id: file:///home/lennart/svn/public/avahi/trunk@143 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
Diffstat (limited to 'avahi-core/server.c')
-rw-r--r--avahi-core/server.c104
1 files changed, 102 insertions, 2 deletions
diff --git a/avahi-core/server.c b/avahi-core/server.c
index 356a917..0e92e27 100644
--- a/avahi-core/server.c
+++ b/avahi-core/server.c
@@ -1151,7 +1151,7 @@ static void register_browse_domain(AvahiServer *s) {
return;
s->browse_domain_entry_group = avahi_entry_group_new(s, NULL, NULL);
- avahi_server_add_ptr(s, s->browse_domain_entry_group, 0, AF_UNSPEC, 0, "_browse._dns-sd._udp.local", s->domain_name);
+ avahi_server_add_ptr(s, s->browse_domain_entry_group, 0, AF_UNSPEC, 0, "b._dns-sd._udp.local", s->domain_name);
avahi_entry_group_commit(s->browse_domain_entry_group);
}
@@ -1318,6 +1318,7 @@ AvahiServer *avahi_server_new(GMainContext *c, const AvahiServerConfig *sc, Avah
AVAHI_LLIST_HEAD_INIT(AvahiServiceTypeBrowser, s->service_type_browsers);
AVAHI_LLIST_HEAD_INIT(AvahiServiceBrowser, s->service_browsers);
AVAHI_LLIST_HEAD_INIT(AvahiServiceResolver, s->service_resolvers);
+ AVAHI_LLIST_HEAD_INIT(AvahiDNSServerBrowser, s->dns_server_browsers);
s->legacy_unicast_reflect_slots = NULL;
s->legacy_unicast_reflect_id = 0;
@@ -1360,7 +1361,9 @@ void avahi_server_free(AvahiServer* s) {
free_group(s, s->groups);
free_slots(s);
-
+
+ while (s->dns_server_browsers)
+ avahi_dns_server_browser_free(s->dns_server_browsers);
while (s->host_name_resolvers)
avahi_host_name_resolver_free(s->host_name_resolvers);
while (s->address_resolvers)
@@ -1767,6 +1770,103 @@ gint avahi_server_add_service(
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 == AF_INET || address->family == AF_INET6);
+
+ if (address->family == AF_INET) {
+ hexstring(n+2, sizeof(n)-2, &address->data, 4);
+ r = avahi_record_new_full(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_A);
+ r->data.a.address = address->data.ipv4;
+ } else {
+ hexstring(n+2, sizeof(n)-2, &address->data, 6);
+ r = avahi_record_new_full(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_AAAA);
+ 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;
+}
+
+gint avahi_server_add_dns_server_name(
+ AvahiServer *s,
+ AvahiEntryGroup *g,
+ gint interface,
+ guchar protocol,
+ const gchar *domain,
+ AvahiDNSServerType type,
+ const gchar *name,
+ guint16 port /** should be 53 */) {
+
+ gint ret = -1;
+ gchar t[256];
+ AvahiRecord *r;
+
+ g_assert(s);
+ g_assert(name);
+ g_assert(type == AVAHI_DNS_SERVER_UPDATE || type == AVAHI_DNS_SERVER_RESOLVE);
+
+ if (domain) {
+ while (domain[0] == '.')
+ domain++;
+ } else
+ domain = s->domain_name;
+
+ snprintf(t, sizeof(t), "%s.%s", type == AVAHI_DNS_SERVER_RESOLVE ? "_domain._udp" : "_dns-update._udp", domain);
+
+ r = avahi_record_new_full(t, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV);
+ r->data.srv.priority = 0;
+ r->data.srv.weight = 0;
+ r->data.srv.port = port;
+ r->data.srv.name = avahi_normalize_name(name);
+ ret = avahi_server_add(s, g, interface, protocol, AVAHI_ENTRY_NULL, r);
+ avahi_record_unref(r);
+
+ return ret;
+}
+
+
static void post_query_callback(AvahiInterfaceMonitor *m, AvahiInterface *i, gpointer userdata) {
AvahiKey *k = userdata;