X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=dns.c;h=550befc24c1593ca2f7bcef14fed22456304908f;hb=9879d5fcafed84a912baa8e2e2d3e73df1a9236d;hp=63788f73ebdb708ea66ac2e83e920e152ca68aed;hpb=9bbaf3c1f7826a7ac637ac0e2e7c8d5b43bac89d;p=project%2Fmdnsd.git diff --git a/dns.c b/dns.c index 63788f7..550befc 100644 --- a/dns.c +++ b/dns.c @@ -15,6 +15,7 @@ #include #include +#include #include #include #include @@ -180,6 +181,35 @@ dns_send_answer(struct interface *iface, const char *answer) fprintf(stderr, "failed to send question\n"); } +void +dns_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 int scan_name(const uint8_t *buffer, int len) { @@ -330,12 +360,17 @@ parse_question(struct interface *iface, char *name, struct dns_question *q) switch (q->type) { case TYPE_ANY: - if (!strcmp(name, mdns_hostname_local)) + if (!strcmp(name, mdns_hostname_local)) { service_reply(iface, NULL, announce_ttl); + dns_reply_a(iface, announce_ttl); + } break; case TYPE_PTR: - service_announce_services(iface, name, announce_ttl); + if (!strcmp(name, sdudp)) + service_announce_services(iface, 0, announce_ttl); + else if (!strcmp(name, sdtcp)) + service_announce_services(iface, 1, announce_ttl); service_reply(iface, name, announce_ttl); break; @@ -345,7 +380,7 @@ parse_question(struct interface *iface, char *name, struct dns_question *q) if (host) *host = '\0'; if (!strcmp(mdns_hostname, name)) - service_reply_a(iface, announce_ttl); + dns_reply_a(iface, announce_ttl); break; }; } @@ -364,7 +399,7 @@ dns_handle_packet(struct interface *iface, struct sockaddr *s, uint16_t port, ui } if (h->questions && !iface->multicast && port != 5353) - // silently drop unicast questions that dont originate from port 5353 + /* silently drop unicast questions that dont originate from port 5353 */ return; while (h->questions-- > 0) {