X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fmdnsd.git;a=blobdiff_plain;f=service.c;h=f45784b69eb428690f539c7558a152abdad43d61;hp=fe6e5a91d31bd3475e47b3775db3e3474b848de6;hb=c0c78c92d57c53276bb7f08468bcc716ba272497;hpb=0b3ecd60cd5207bc4589ddd36718e0a758fd054a diff --git a/service.c b/service.c index fe6e5a9..f45784b 100644 --- a/service.c +++ b/service.c @@ -15,7 +15,6 @@ #include #include -#include #include #include #include @@ -107,7 +106,7 @@ service_add_srv(struct service *s, int ttl) #define TOUT_LOOKUP 60 -static int +static time_t service_timeout(struct service *s) { time_t t = monotonic_time(); @@ -115,38 +114,7 @@ service_timeout(struct service *s) if (t - s->t <= TOUT_LOOKUP) return 0; - s->t = t; - - return 1; -} - -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); + return t; } static void @@ -154,8 +122,10 @@ service_reply_single(struct interface *iface, struct service *s, const char *mat { const char *host = service_name(s->service); char *service = strstr(host, "._"); + time_t t = service_timeout(s); + - if (!force && (!s->active || !service || !service_timeout(s))) + if (!force && (!s->active || !service || !t)) return; service++; @@ -163,6 +133,8 @@ service_reply_single(struct interface *iface, struct service *s, const char *mat if (match && strcmp(match, s->service)) return; + s->t = t; + dns_init_answer(); service_add_ptr(service_name(s->service), ttl); dns_send_answer(iface, service); @@ -181,12 +153,6 @@ service_reply(struct interface *iface, const char *match, int ttl) 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); } void