#include <sys/stat.h>
#include <fcntl.h>
+#include <ifaddrs.h>
#include <time.h>
#include <stdio.h>
#include <unistd.h>
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)
{
if (host)
*host = '\0';
if (!strcmp(mdns_hostname, name))
- service_reply_a(iface, announce_ttl);
+ dns_reply_a(iface, announce_ttl);
break;
};
}
void dns_init_answer(void);
void dns_add_answer(int type, const uint8_t *rdata, uint16_t rdlength, int ttl);
void dns_send_answer(struct interface *iface, const char *answer);
+void dns_reply_a(struct interface *iface, int ttl);
const char* dns_type_string(uint16_t type);
void dns_handle_packet(struct interface *iface, struct sockaddr *s, uint16_t port, uint8_t *buf, int len);
vlist_for_each_element(&interfaces, iface, node)
if (iface->fd.fd > 0 && iface->multicast) {
service_announce(iface, 0);
- service_reply_a(iface, 0);
+ dns_reply_a(iface, 0);
}
vlist_for_each_element(&interfaces, iface, node)
interface_close(iface);
#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)
{
return;
if (ttl)
- service_reply_a(iface, ttl);
+ dns_reply_a(iface, ttl);
}
void
extern void service_announce(struct interface *iface, int ttl);
extern void service_announce_services(struct interface *iface, const char *service, int ttl);
extern void service_reply(struct interface *iface, const char *match, int ttl);
-extern void service_reply_a(struct interface *iface, int ttl);
#endif