#include <arpa/nameser.h>
#include <sys/socket.h>
-#include <ifaddrs.h>
#include <resolv.h>
#include <glob.h>
#include <stdio.h>
return t;
}
-void
-service_reply_a(struct interface *iface, int ttl)
-{
- struct ifaddrs *ifap, *ifa;
- struct sockaddr_in *sa;
- struct sockaddr_in6 *sa6;
-
- getifaddrs(&ifap);
-
- dns_init_answer();
- for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
- if (strcmp(ifa->ifa_name, iface->name))
- continue;
- if (ifa->ifa_addr->sa_family == AF_INET) {
- sa = (struct sockaddr_in *) ifa->ifa_addr;
- dns_add_answer(TYPE_A, (uint8_t *) &sa->sin_addr, 4, ttl);
- }
- if (ifa->ifa_addr->sa_family == AF_INET6) {
- uint8_t ll_prefix[] = {0xfe, 0x80 };
- sa6 = (struct sockaddr_in6 *) ifa->ifa_addr;
- if (!memcmp(&sa6->sin6_addr, &ll_prefix, 2))
- dns_add_answer(TYPE_AAAA, (uint8_t *) &sa6->sin6_addr, 16, ttl);
- }
- }
- dns_send_answer(iface, mdns_hostname_local);
-
- freeifaddrs(ifap);
-}
-
static void
-service_reply_single(struct interface *iface, struct service *s, const char *match, int ttl, int force)
+service_reply_single(struct interface *iface, struct service *s, int ttl, int force)
{
const char *host = service_name(s->service);
char *service = strstr(host, "._");
service++;
- if (match && strcmp(match, s->service))
- return;
-
s->t = t;
dns_init_answer();
{
struct service *s;
- vlist_for_each_element(&services, s, node)
- service_reply_single(iface, s, match, ttl, 0);
-
- if (match)
- return;
-
- if (ttl)
- service_reply_a(iface, ttl);
+ vlist_for_each_element(&services, s, node) {
+ if (!match || !strcmp(s->service, match))
+ service_reply_single(iface, s, ttl, 0);
+ }
}
void
else
dns_send_answer(iface, sdudp);
}
- service_reply(iface, s->service, ttl);
+ service_reply_single(iface, s, ttl, 0);
}
}
if (service_init_announce)
vlist_for_each_element(&interfaces, iface, node) {
s->t = 0;
- service_reply_single(iface, s, NULL, announce_ttl, 1);
+ service_reply_single(iface, s, announce_ttl, 1);
}
return;
}
s = container_of(node_old, struct service, node);
if (!node_new && service_init_announce)
vlist_for_each_element(&interfaces, iface, node)
- service_reply_single(iface, s, NULL, 0, 1);
+ service_reply_single(iface, s, 0, 1);
free(s);
}