-// @TODO: aquire mutex in case we call meshlink_* methods?
-
-
-static void discovery_resolve_callback(
- AvahiSServiceResolver *resolver,
- AVAHI_GCC_UNUSED AvahiIfIndex interface,
- AVAHI_GCC_UNUSED AvahiProtocol protocol,
- AvahiResolverEvent event,
- const char *name,
- const char *type,
- const char *domain,
- const char *host_name,
- const AvahiAddress *address,
- uint16_t port,
- AvahiStringList *txt,
- AvahiLookupResultFlags flags,
- AVAHI_GCC_UNUSED void* userdata)
-{
-
- meshlink_handle_t *mesh = userdata;
-
- /* Called whenever a service has been resolved successfully or timed out */
-
- switch (event)
- {
- case AVAHI_RESOLVER_FAILURE:
- fprintf(stderr, "(Resolver) Failed to resolve service '%s' of type '%s' in domain '%s': %s\n", name, type, domain, avahi_strerror(avahi_server_errno(mesh->avahi_server)));
- break;
-
- case AVAHI_RESOLVER_FOUND:
- {
- char straddr[AVAHI_ADDRESS_STR_MAX], *strtxt;
-
- fprintf(stderr, "(Resolver) Service '%s' of type '%s' in domain '%s':\n", name, type, domain);
-
- avahi_address_snprint(straddr, sizeof(straddr), address);
- strtxt = avahi_string_list_to_string(txt);
- fprintf(stderr,
- "\t%s:%u (%s)\n"
- "\tTXT=%s\n"
- "\tcookie is %u\n"
- "\tis_local: %i\n"
- "\twide_area: %i\n"
- "\tmulticast: %i\n"
- "\tcached: %i\n",
- host_name, port, straddr,
- strtxt,
- avahi_string_list_get_service_cookie(txt),
- !!(flags & AVAHI_LOOKUP_RESULT_LOCAL),
- !!(flags & AVAHI_LOOKUP_RESULT_WIDE_AREA),
- !!(flags & AVAHI_LOOKUP_RESULT_MULTICAST),
- !!(flags & AVAHI_LOOKUP_RESULT_CACHED));
- avahi_free(strtxt);
-
- // retrieve fingerprint
- AvahiStringList *fgli = avahi_string_list_find(txt, MESHLINK_MDNS_FINGERPRINT_KEY);
- meshlink_node_t *node = meshlink_get_node(mesh, name);
-
- fprintf(stderr, "%p, %p, %s, %s\n", fgli, node, avahi_string_list_get_text(fgli), meshlink_get_fingerprint(mesh, node));
-
- if( node && fgli && strcmp(avahi_string_list_get_text(fgli)+strlen(MESHLINK_MDNS_FINGERPRINT_KEY)+1, meshlink_get_fingerprint(mesh, node)) == 0 )
- {
- fprintf(stderr, "Node %s is part of the mesh network - updating ip address.\n", node->name);
-
- struct sockaddr_storage naddr;
- memset(&naddr, 0, sizeof(naddr));
-
- switch(address->proto)
- {
- case AVAHI_PROTO_INET:
- {
- struct sockaddr_in* naddr_in = (struct sockaddr_in*)&naddr;
- naddr_in->sin_family = AF_INET;
- naddr_in->sin_port = port;
- naddr_in->sin_addr.s_addr = address->data.ipv4.address;
- }
- break;
-
- case AVAHI_PROTO_INET6:
- {
- struct sockaddr_in6* naddr_in = (struct sockaddr_in6*)&naddr;
- naddr_in->sin6_family = AF_INET6;
- naddr_in->sin6_port = port;
- memcpy(naddr_in->sin6_addr.s6_addr, address->data.ipv6.address, sizeof(naddr_in->sin6_addr.s6_addr));
- }
- break;
-
- default:
- naddr.ss_family = AF_UNKNOWN;
- }
-
- if(naddr.ss_family == AF_INET || naddr.ss_family == AF_INET6)
- {
- meshlink_hint_address(mesh, node->name, (struct sockaddr*)&naddr);
- }
- }
- else
- {
- fprintf(stderr, "Node %s is not part of the mesh network - ignoring ip address.\n", node ? node->name : "n/a");
- }
- }
- }
-
- avahi_s_service_resolver_free(resolver);