}
static void
-service_add_ptr(const char *host)
+service_add_ptr(const char *host, int ttl)
{
int len = dn_comp(host, mdns_buf, sizeof(mdns_buf), NULL, NULL);
if (len < 1)
return;
- dns_add_answer(TYPE_PTR, mdns_buf, len, announce_ttl);
+ dns_add_answer(TYPE_PTR, mdns_buf, len, ttl);
}
static void
-service_add_srv(struct service *s)
+service_add_srv(struct service *s, int ttl)
{
struct dns_srv_data *sd = (struct dns_srv_data *) mdns_buf;
int len = sizeof(*sd);
return;
sd->port = cpu_to_be16(s->port);
- dns_add_answer(TYPE_SRV, mdns_buf, len, announce_ttl);
+ dns_add_answer(TYPE_SRV, mdns_buf, len, ttl);
}
#define TOUT_LOOKUP 60
}
void
-service_reply_a(struct interface *iface, int type)
+service_reply_a(struct interface *iface, int type, int ttl)
{
struct ifaddrs *ifap, *ifa;
struct sockaddr_in *sa;
sa = (struct sockaddr_in *) ifa->ifa_addr;
addr = inet_ntoa(sa->sin_addr);
printf("Interface: %s\tAddress4: %s\n", ifa->ifa_name, addr);
- dns_add_answer(TYPE_A, (uint8_t *) &sa->sin_addr, 4, announce_ttl);
+ 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 };
if (!memcmp(&sa6->sin6_addr, &ll_prefix, 2)) {
if (inet_ntop(AF_INET6, &sa6->sin6_addr, buf, 64))
printf("Interface: %s\tAddress6: %s\n", ifa->ifa_name, buf);
- dns_add_answer(TYPE_AAAA, (uint8_t *) &sa6->sin6_addr, 16, announce_ttl);
+ dns_add_answer(TYPE_AAAA, (uint8_t *) &sa6->sin6_addr, 16, ttl);
}
}
}
freeifaddrs(ifap);
}
-void
-service_reply(struct interface *iface, const char *match)
+static void
+service_reply_single(struct interface *iface, struct service *s, const char *match, int ttl)
{
- struct service *s;
+ const char *host = service_name(s->service);
+ char *service = strstr(host, "._");
- vlist_for_each_element(&services, s, node) {
- const char *host = service_name(s->service);
- char *service = strstr(host, "._");
+ if (!s->active || !service || !service_timeout(s))
+ return;
- if (!s->active || !service || !service_timeout(s))
- continue;
+ service++;
- service++;
+ if (match && strcmp(match, s->service))
+ return;
- if (match && strcmp(match, s->service))
- continue;
+ dns_init_answer();
+ service_add_ptr(service_name(s->service), ttl);
+ dns_send_answer(iface, service);
- dns_init_answer();
- service_add_ptr(service_name(s->service));
- dns_send_answer(iface, service);
+ dns_init_answer();
+ service_add_srv(s, ttl);
+ if (s->txt && s->txt_len)
+ dns_add_answer(TYPE_TXT, (uint8_t *) s->txt, s->txt_len, ttl);
+ dns_send_answer(iface, host);
+}
- dns_init_answer();
- service_add_srv(s);
- if (s->txt && s->txt_len)
- dns_add_answer(TYPE_TXT, (uint8_t *) s->txt, s->txt_len, announce_ttl);
- dns_send_answer(iface, host);
- }
+void
+service_reply(struct interface *iface, const char *match, int ttl)
+{
+ struct service *s;
+
+ vlist_for_each_element(&services, s, node)
+ service_reply_single(iface, s, match, ttl);
if (match)
return;
- service_reply_a(iface, TYPE_A);
+ service_reply_a(iface, TYPE_A, ttl);
}
void
continue;
s->t = 0;
dns_init_answer();
- service_add_ptr(s->service);
+ service_add_ptr(s->service, announce_ttl);
if (tcp)
dns_send_answer(iface, sdtcp);
else
dns_send_answer(iface, sdudp);
- service_reply(iface, s->service);
+ service_reply(iface, s->service, announce_ttl);
}
}
service_update(struct vlist_tree *tree, struct vlist_node *node_new,
struct vlist_node *node_old)
{
+ struct interface *iface;
struct service *s;
if (!node_old)
return;
s = container_of(node_old, struct service, node);
+
+ if (!node_new)
+ vlist_for_each_element(&interfaces, iface, node)
+ service_reply_single(iface, s, NULL, 0);
+
free(s);
}