#include "iface.h"
#include "socket.h"
#include "browse.h"
+#include "log.h"
-#define AVAHI_HOST_RR_HOLDOFF_MSEC 1000
+#define AVAHI_HOST_RR_HOLDOFF_MSEC 2000
static void free_entry(AvahiServer*s, AvahiEntry *e) {
AvahiEntry *t;
g_assert(i);
g_assert(k);
-/* g_message("Posting responses matching [%s]", txt = avahi_key_to_string(k)); */
+/* avahi_log_debug("Posting responses matching [%s]", txt = avahi_key_to_string(k)); */
/* g_free(txt); */
if (avahi_key_is_pattern(k)) {
gint cmp;
n = e->by_key_next;
- if (e->dead || !avahi_entry_probing(s, e, i))
+ if (e->dead)
continue;
if ((cmp = avahi_record_lexicographical_compare(e->record, record)) == 0) {
ours = TRUE;
break;
- } else if (cmp > 0)
- won = TRUE;
- else /* cmp < 0 */
- lost = TRUE;
+ } else {
+
+ if (avahi_entry_probing(s, e, i)) {
+ if (cmp > 0)
+ won = TRUE;
+ else /* cmp < 0 */
+ lost = TRUE;
+ }
+ }
}
t = avahi_record_to_string(record);
if (!ours) {
if (won)
- g_message("Recieved conflicting probe [%s]. Local host won.", t);
+ avahi_log_debug("xxx Recieved conflicting probe [%s]. Local host won.", t);
else if (lost) {
- g_message("Recieved conflicting probe [%s]. Local host lost. Withdrawing.", t);
+ avahi_log_debug("yyy Recieved conflicting probe [%s]. Local host lost. Withdrawing.", t);
withdraw_rrset(s, record->key);
}
}
g_assert(record);
-/* g_message("CHECKING FOR CONFLICT: [%s]", t); */
+/* avahi_log_debug("CHECKING FOR CONFLICT: [%s]", t); */
for (e = g_hash_table_lookup(s->entries_by_key, record->key); e; e = n) {
n = e->by_key_next;
/* Either our entry or the other is intended to be unique, so let's check */
- if (avahi_entry_registered(s, e, i)) {
-
- if (avahi_record_equal_no_ttl(e->record, record)) {
- ours = TRUE; /* We have an identical record, so this is no conflict */
+ if (avahi_record_equal_no_ttl(e->record, record)) {
+ ours = TRUE; /* We have an identical record, so this is no conflict */
+
+ /* Check wheter there is a TTL conflict */
+ if (record->ttl <= e->record->ttl/2 &&
+ avahi_entry_registered(s, e, i)) {
+ gchar *t;
+ /* Refresh */
+ t = avahi_record_to_string(record);
- /* Check wheter there is a TTL conflict */
- if (record->ttl <= e->record->ttl/2) {
- gchar *t;
- /* Refresh */
- t = avahi_record_to_string(record);
-
- g_message("Recieved record with bad TTL [%s]. Refreshing.", t);
- avahi_server_prepare_matching_responses(s, i, e->record->key, FALSE);
- valid = FALSE;
-
- g_free(t);
- }
+ avahi_log_debug("Recieved record with bad TTL [%s]. Refreshing.", t);
+ avahi_server_prepare_matching_responses(s, i, e->record->key, FALSE);
+ valid = FALSE;
+
+ g_free(t);
+ }
+
+ /* There's no need to check the other entries of this RRset */
+ break;
+
+ } else {
+
+ if (avahi_entry_registered(s, e, i)) {
- /* There's no need to check the other entries of this RRset */
- break;
- } else {
/* A conflict => we have to return to probe mode */
conflict = TRUE;
conflicting_entry = e;
- }
- } else if (avahi_entry_probing(s, e, i)) {
+ } else if (avahi_entry_probing(s, e, i)) {
- if (!avahi_record_equal_no_ttl(record, e->record)) {
-
/* We are currently registering a matching record, but
* someone else already claimed it, so let's
* withdraw */
}
}
-/* g_message("ours=%i conflict=%i", ours, conflict); */
+/* avahi_log_debug("ours=%i conflict=%i", ours, conflict); */
if (!ours && conflict) {
gchar *t;
t = avahi_record_to_string(record);
if (withdraw_immediately) {
- g_message("Recieved conflicting record [%s] with local record to be. Withdrawing.", t);
+ avahi_log_debug("Recieved conflicting record [%s] with local record to be. Withdrawing.", t);
withdraw_rrset(s, record->key);
} else {
g_assert(conflicting_entry);
- g_message("Recieved conflicting record [%s]. Resetting our record.", t);
+ avahi_log_debug("Recieved conflicting record [%s]. Resetting our record.", t);
avahi_entry_return_to_initial_state(s, conflicting_entry, i);
/* Local unique records are returned to probin
avahi_dns_packet_inc_field(reply, AVAHI_DNS_FIELD_ANCOUNT);
else {
gchar *t = avahi_record_to_string(r);
- g_warning("Record [%s] not fitting in legacy unicast packet, dropping.", t);
+ avahi_log_warn("Record [%s] not fitting in legacy unicast packet, dropping.", t);
g_free(t);
}
avahi_dns_packet_free(reply);
gchar *t = avahi_record_to_string(r);
- g_warning("Record [%s] too large, doesn't fit in any packet!", t);
+ avahi_log_warn("Record [%s] too large, doesn't fit in any packet!", t);
g_free(t);
break;
} else
g_assert(i);
g_assert(a);
-/* g_message("query"); */
+/* avahi_log_debug("query"); */
g_assert(avahi_record_list_empty(s->record_list));
gboolean unicast_response = FALSE;
if (!(key = avahi_dns_packet_consume_key(p, &unicast_response))) {
- g_warning("Packet too short (1)");
+ avahi_log_warn("Packet too short (1)");
goto fail;
}
gboolean unique = FALSE;
if (!(record = avahi_dns_packet_consume_record(p, &unique))) {
- g_warning("Packet too short (2)");
+ avahi_log_warn("Packet too short (2)");
goto fail;
}
gboolean unique = FALSE;
if (!(record = avahi_dns_packet_consume_record(p, &unique))) {
- g_warning("Packet too short (3)");
+ avahi_log_warn("Packet too short (3)");
goto fail;
}
g_assert(i);
g_assert(a);
-/* g_message("response"); */
+/* avahi_log_debug("response"); */
for (n = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_ANCOUNT) +
avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_ARCOUNT); n > 0; n--) {
/* gchar *txt; */
if (!(record = avahi_dns_packet_consume_record(p, &cache_flush))) {
- g_warning("Packet too short (4)");
+ avahi_log_warn("Packet too short (4)");
break;
}
if (record->key->type != AVAHI_DNS_TYPE_ANY) {
-/* g_message("Handling response: %s", txt = avahi_record_to_string(record)); */
+/* avahi_log_debug("Handling response: %s", txt = avahi_record_to_string(record)); */
/* g_free(txt); */
if (handle_conflict(s, i, record, cache_flush, a)) {
if (!s->config.enable_reflector)
return;
-/* g_message("legacy unicast reflectr"); */
+/* avahi_log_debug("legacy unicast reflectr"); */
/* Reflecting legacy unicast queries is a little more complicated
than reflecting normal queries, since we must route the
if (!(slot = allocate_slot(s))) {
/* No slot available, we drop this legacy unicast query */
- g_warning("No slot available for legacy unicast reflection, dropping query packet.");
+ avahi_log_warn("No slot available for legacy unicast reflection, dropping query packet.");
return;
}
socklen_t l = sizeof(lsa);
if (getsockname(s->fd_legacy_unicast_ipv4, &lsa, &l) != 0)
- g_warning("getsockname(): %s", strerror(errno));
+ avahi_log_warn("getsockname(): %s", strerror(errno));
else
return lsa.sin_port == ((struct sockaddr_in*) sa)->sin_port;
socklen_t l = sizeof(lsa);
if (getsockname(s->fd_legacy_unicast_ipv6, &lsa, &l) != 0)
- g_warning("getsockname(): %s", strerror(errno));
+ avahi_log_warn("getsockname(): %s", strerror(errno));
else
return lsa.sin6_port == ((struct sockaddr_in6*) sa)->sin6_port;
}
if (!(i = avahi_interface_monitor_get_interface(s->monitor, iface, sa->sa_family)) ||
!avahi_interface_relevant(i)) {
- g_warning("Recieved packet from invalid interface.");
+ avahi_log_warn("Recieved packet from invalid interface.");
return;
}
-/* g_message("new packet recieved on interface '%s.%i'.", i->hardware->name, i->protocol); */
+/* avahi_log_debug("new packet recieved on interface '%s.%i'.", i->hardware->name, i->protocol); */
port = avahi_port_from_sockaddr(sa);
avahi_address_from_sockaddr(sa, &a);
return;
if (avahi_dns_packet_check_valid(p) < 0) {
- g_warning("Recieved invalid packet.");
+ avahi_log_warn("Recieved invalid packet.");
return;
}
gboolean legacy_unicast = FALSE;
if (avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_ARCOUNT) != 0) {
- g_warning("Invalid query packet.");
+ avahi_log_warn("Invalid query packet.");
return;
}
if ((avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_ANCOUNT) != 0 ||
avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_NSCOUNT) != 0)) {
- g_warning("Invalid legacy unicast query packet.");
+ avahi_log_warn("Invalid legacy unicast query packet.");
return;
}
handle_query_packet(s, p, i, &a, port, legacy_unicast);
-/* g_message("Handled query"); */
+/* avahi_log_debug("Handled query"); */
} else {
if (port != AVAHI_MDNS_PORT) {
- g_warning("Recieved repsonse with invalid source port %u on interface '%s.%i'", port, i->hardware->name, i->protocol);
+ avahi_log_warn("Recieved repsonse with invalid source port %u on interface '%s.%i'", port, i->hardware->name, i->protocol);
return;
}
if (ttl != 255) {
- g_warning("Recieved response with invalid TTL %u on interface '%s.%i'.", ttl, i->hardware->name, i->protocol);
+ avahi_log_warn("Recieved response with invalid TTL %u on interface '%s.%i'.", ttl, i->hardware->name, i->protocol);
if (s->config.check_response_ttl)
return;
}
if (avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_QDCOUNT) != 0 ||
avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_ANCOUNT) == 0 ||
avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_NSCOUNT) != 0) {
- g_warning("Invalid response packet.");
+ avahi_log_warn("Invalid response packet.");
return;
}
handle_response_packet(s, p, i, &a);
-/* g_message("Handled response"); */
+/* avahi_log_debug("Handled response"); */
}
}
if (!(i = avahi_interface_monitor_get_interface(s->monitor, iface, sa->sa_family)) ||
!avahi_interface_relevant(i)) {
- g_warning("Recieved packet from invalid interface.");
+ avahi_log_warn("Recieved packet from invalid interface.");
return;
}
-/* g_message("new legacy unicast packet recieved on interface '%s.%i'.", i->hardware->name, i->protocol); */
+/* avahi_log_debug("new legacy unicast packet recieved on interface '%s.%i'.", i->hardware->name, i->protocol); */
port = avahi_port_from_sockaddr(sa);
avahi_address_from_sockaddr(sa, &a);
return;
if (avahi_dns_packet_check_valid(p) < 0 || avahi_dns_packet_is_query(p)) {
- g_warning("Recieved invalid packet.");
+ avahi_log_warn("Recieved invalid packet.");
return;
}
if (!(slot = find_slot(s, avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_ID)))) {
- g_warning("Recieved legacy unicast response with unknown id");
+ avahi_log_warn("Recieved legacy unicast response with unknown id");
return;
}
s->register_time_event = avahi_time_event_queue_add(s->time_event_queue, &tv, register_time_event_callback, s);
}
-void avahi_server_set_host_name(AvahiServer *s, const gchar *host_name) {
+gint avahi_server_set_host_name(AvahiServer *s, const gchar *host_name) {
g_assert(s);
g_assert(host_name);
update_fqdn(s);
delayed_register_stuff(s);
+ return 0;
}
-void avahi_server_set_domain_name(AvahiServer *s, const gchar *domain_name) {
+gint avahi_server_set_domain_name(AvahiServer *s, const gchar *domain_name) {
g_assert(s);
g_assert(domain_name);
update_fqdn(s);
delayed_register_stuff(s);
+ return 0;
}
}
if (s->fd_ipv4 < 0 && s->config.use_ipv4)
- g_message("Failed to create IPv4 socket, proceeding in IPv6 only mode");
+ avahi_log_debug("Failed to create IPv4 socket, proceeding in IPv6 only mode");
else if (s->fd_ipv6 < 0 && s->config.use_ipv6)
- g_message("Failed to create IPv6 socket, proceeding in IPv4 only mode");
+ avahi_log_debug("Failed to create IPv6 socket, proceeding in IPv4 only mode");
s->fd_legacy_unicast_ipv4 = s->fd_ipv4 >= 0 && s->config.enable_reflector ? avahi_open_legacy_unicast_socket_ipv4() : -1;
s->fd_legacy_unicast_ipv6 = s->fd_ipv6 >= 0 && s->config.enable_reflector ? avahi_open_legacy_unicast_socket_ipv6() : -1;
-
+
if (c)
g_main_context_ref(s->context = c);
else
g_free(s);
}
-void avahi_server_add(
+gint avahi_server_add(
AvahiServer *s,
AvahiEntryGroup *g,
gint interface,
AVAHI_LLIST_PREPEND(AvahiEntry, by_group, g->entries, e);
avahi_announce_entry(s, e);
+
+ return 0;
}
+
const AvahiRecord *avahi_server_iterate(AvahiServer *s, AvahiEntryGroup *g, void **state) {
AvahiEntry **e = (AvahiEntry**) state;
g_assert(s);
avahi_dump_caches(s->monitor, f);
}
-void avahi_server_add_ptr(
+gint avahi_server_add_ptr(
AvahiServer *s,
AvahiEntryGroup *g,
gint interface,
r->data.ptr.name = avahi_normalize_name(dest);
avahi_server_add(s, g, interface, protocol, flags, r);
avahi_record_unref(r);
+ return 0;
}
-void avahi_server_add_address(
+gint avahi_server_add_address(
AvahiServer *s,
AvahiEntryGroup *g,
gint interface,
}
g_free(n);
+
+ return 0;
}
-void avahi_server_add_text_strlst(
+gint avahi_server_add_text_strlst(
AvahiServer *s,
AvahiEntryGroup *g,
gint interface,
r->data.txt.string_list = strlst;
avahi_server_add(s, g, interface, protocol, flags, r);
avahi_record_unref(r);
+
+ return 0;
}
-void avahi_server_add_text_va(
+gint avahi_server_add_text_va(
AvahiServer *s,
AvahiEntryGroup *g,
gint interface,
g_assert(s);
avahi_server_add_text_strlst(s, g, interface, protocol, flags, name, avahi_string_list_new_va(va));
+ return 0;
}
-void avahi_server_add_text(
+gint avahi_server_add_text(
AvahiServer *s,
AvahiEntryGroup *g,
gint interface,
va_start(va, name);
avahi_server_add_text_va(s, g, interface, protocol, flags, name, va);
va_end(va);
+
+ return 0;
}
static void escape_service_name(gchar *d, guint size, const gchar *s) {
*(d++) = 0;
}
-void avahi_server_add_service_strlst(
+gint avahi_server_add_service_strlst(
AvahiServer *s,
AvahiEntryGroup *g,
gint interface,
snprintf(enum_ptr, sizeof(enum_ptr), "_services._dns-sd._udp.%s", domain);
avahi_server_add_ptr(s, g, interface, protocol, AVAHI_ENTRY_NULL, enum_ptr, ptr_name);
+
+ return 0;
}
-void avahi_server_add_service_va(
+gint avahi_server_add_service_va(
AvahiServer *s,
AvahiEntryGroup *g,
gint interface,
g_assert(name);
avahi_server_add_service_strlst(s, g, interface, protocol, type, name, domain, host, port, avahi_string_list_new_va(va));
+ return 0;
}
-void avahi_server_add_service(
+gint avahi_server_add_service(
AvahiServer *s,
AvahiEntryGroup *g,
gint interface,
va_start(va, port);
avahi_server_add_service_va(s, g, interface, protocol, type, name, domain, host, port, va);
va_end(va);
+ return 0;
}
static void post_query_callback(AvahiInterfaceMonitor *m, AvahiInterface *i, gpointer userdata) {
g->server->need_entry_cleanup = TRUE;
}
-void avahi_entry_group_commit(AvahiEntryGroup *g) {
+gint avahi_entry_group_commit(AvahiEntryGroup *g) {
g_assert(g);
g_assert(!g->dead);
if (g->state != AVAHI_ENTRY_GROUP_UNCOMMITED)
- return;
+ return -1;
avahi_entry_group_change_state(g, AVAHI_ENTRY_GROUP_REGISTERING);
avahi_announce_group(g->server, g);
avahi_entry_group_check_probed(g, FALSE);
+
+ return 0;
}
gboolean avahi_entry_commited(AvahiEntry *e) {