summaryrefslogtreecommitdiffstats
path: root/avahi-core/iface.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-05-20 14:54:00 +0000
committerLennart Poettering <lennart@poettering.net>2005-05-20 14:54:00 +0000
commit4de3df3db7df43474176533d0b5fac851dd4a9b4 (patch)
treed7116511e663e1f2f5add289364e0345fc4845e7 /avahi-core/iface.c
parentc565e9ad208e8c9aeaf94b02c56597a991b1597f (diff)
Add support for server state change callbacks
git-svn-id: file:///home/lennart/svn/public/avahi/trunk@78 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
Diffstat (limited to 'avahi-core/iface.c')
-rw-r--r--avahi-core/iface.c53
1 files changed, 36 insertions, 17 deletions
diff --git a/avahi-core/iface.c b/avahi-core/iface.c
index 61e5a4a..b2c49f7 100644
--- a/avahi-core/iface.c
+++ b/avahi-core/iface.c
@@ -37,25 +37,36 @@
#include "socket.h"
#include "announce.h"
-static void update_address_rr(AvahiInterfaceMonitor *m, AvahiInterfaceAddress *a, int remove) {
+static void update_address_rr(AvahiInterfaceMonitor *m, AvahiInterfaceAddress *a, gboolean remove) {
g_assert(m);
g_assert(a);
- if (!avahi_interface_address_relevant(a) || remove) {
+
+ if (avahi_interface_address_relevant(a) &&
+ !remove &&
+ m->server->config.register_addresses &&
+ (m->server->state == AVAHI_SERVER_RUNNING ||
+ m->server->state == AVAHI_SERVER_REGISTERING)) {
+
+ if (!a->entry_group) {
+ a->entry_group = avahi_entry_group_new(m->server, avahi_host_rr_entry_group_callback, NULL);
+ avahi_server_add_address(m->server, a->entry_group, a->interface->hardware->index, AF_UNSPEC, 0, NULL, &a->address);
+ avahi_entry_group_commit(a->entry_group);
+ }
+ } else {
+
if (a->entry_group) {
+
+ if (avahi_entry_group_get_state(a->entry_group) == AVAHI_ENTRY_GROUP_REGISTERING)
+ avahi_server_decrease_host_rr_pending(m->server);
+
avahi_entry_group_free(a->entry_group);
a->entry_group = NULL;
}
- } else {
- if (!a->entry_group && m->server->config.register_addresses) {
- a->entry_group = avahi_entry_group_new(m->server, NULL, NULL);
- avahi_server_add_address(m->server, a->entry_group, a->interface->hardware->index, AF_UNSPEC, 0, NULL, &a->address);
- avahi_entry_group_commit(a->entry_group);
- }
- }
+ }
}
-static void update_interface_rr(AvahiInterfaceMonitor *m, AvahiInterface *i, int remove) {
+static void update_interface_rr(AvahiInterfaceMonitor *m, AvahiInterface *i, gboolean remove) {
AvahiInterfaceAddress *a;
g_assert(m);
g_assert(i);
@@ -64,7 +75,7 @@ static void update_interface_rr(AvahiInterfaceMonitor *m, AvahiInterface *i, int
update_address_rr(m, a, remove);
}
-static void update_hw_interface_rr(AvahiInterfaceMonitor *m, AvahiHwInterface *hw, int remove) {
+static void update_hw_interface_rr(AvahiInterfaceMonitor *m, AvahiHwInterface *hw, gboolean remove) {
AvahiInterface *i;
g_assert(m);
@@ -483,17 +494,17 @@ AvahiHwInterface* avahi_interface_monitor_get_hw_interface(AvahiInterfaceMonitor
void avahi_interface_send_packet_unicast(AvahiInterface *i, AvahiDnsPacket *p, const AvahiAddress *a, guint16 port) {
g_assert(i);
g_assert(p);
- char t[64];
+/* char t[64]; */
if (!avahi_interface_relevant(i))
return;
g_assert(!a || a->family == i->protocol);
- if (a)
- g_message("unicast sending on '%s.%i' to %s:%u", i->hardware->name, i->protocol, avahi_address_snprint(t, sizeof(t), a), port);
- else
- g_message("multicast sending on '%s.%i'", i->hardware->name, i->protocol);
+/* if (a) */
+/* g_message("unicast sending on '%s.%i' to %s:%u", i->hardware->name, i->protocol, avahi_address_snprint(t, sizeof(t), a), port); */
+/* else */
+/* g_message("multicast sending on '%s.%i'", i->hardware->name, i->protocol); */
if (i->protocol == AF_INET && i->monitor->server->fd_ipv4 >= 0)
avahi_send_dns_packet_ipv4(i->monitor->server->fd_ipv4, i->hardware->index, p, a ? &a->data.ipv4 : NULL, port);
@@ -581,7 +592,6 @@ gboolean avahi_interface_match(AvahiInterface *i, gint index, guchar protocol) {
return TRUE;
}
-
void avahi_interface_monitor_walk(AvahiInterfaceMonitor *m, gint interface, guchar protocol, AvahiInterfaceMonitorWalkCallback callback, gpointer userdata) {
g_assert(m);
g_assert(callback);
@@ -611,3 +621,12 @@ void avahi_interface_monitor_walk(AvahiInterfaceMonitor *m, gint interface, guch
callback(m, i, userdata);
}
}
+
+void avahi_update_host_rrs(AvahiInterfaceMonitor *m, gboolean remove) {
+ AvahiInterface *i;
+
+ g_assert(m);
+
+ for (i = m->interfaces; i; i = i->interface_next)
+ update_interface_rr(m, i, remove);
+}