#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
-#include <asm/byteorder.h>
#include <arpa/nameser.h>
#include <resolv.h>
#include <stdlib.h>
void
dns_send_question(struct interface *iface, const char *question, int type)
{
- static struct dns_header h = {
- .questions = cpu_to_be16(1),
- };
- static struct dns_question q = {
- .class = cpu_to_be16(1),
- };
+ static struct dns_header h;
+ static struct dns_question q;
static struct iovec iov[] = {
{
.iov_base = &h,
};
int len;
- q.type = __cpu_to_be16(type);
+ h.questions = cpu_to_be16(1);
+ q.class = cpu_to_be16(1);
+ q.type = cpu_to_be16(type);
len = dn_comp(question, (void *) name_buffer, sizeof(name_buffer), NULL, NULL);
if (len < 1)
}
void
-dns_add_answer(int type, const uint8_t *rdata, uint16_t rdlength)
+dns_add_answer(int type, const uint8_t *rdata, uint16_t rdlength, int ttl)
{
struct blob_attr *attr;
struct dns_answer *a;
a = blob_data(attr);
a->type = cpu_to_be16(type);
a->class = cpu_to_be16(1);
- a->ttl = cpu_to_be32(announce_ttl);
+ a->ttl = cpu_to_be32(ttl);
a->rdlength = cpu_to_be16(rdlength);
memcpy(a + 1, rdata, rdlength);
if (!dns_answer_cnt)
return;
- h.answers = __cpu_to_be16(dns_answer_cnt);
- h.flags = __cpu_to_be16(0x8400);
+ h.answers = cpu_to_be16(dns_answer_cnt);
+ h.flags = cpu_to_be16(0x8400);
iov = alloca(sizeof(struct iovec) * ((dns_answer_cnt * 2) + 1));
return NULL;
while (endianess--) {
- *swap = __be16_to_cpu(*swap);
+ *swap = be16_to_cpu(*swap);
swap++;
}
return NULL;
while (endianess--) {
- *swap = __be16_to_cpu(*swap);
+ *swap = be16_to_cpu(*swap);
swap++;
}
if (*len < sizeof(struct dns_answer))
return NULL;
- a->type = __be16_to_cpu(a->type);
- a->class = __be16_to_cpu(a->class);
- a->ttl = __be32_to_cpu(a->ttl);
- a->rdlength = __be16_to_cpu(a->rdlength);
+ a->type = be16_to_cpu(a->type);
+ a->class = be16_to_cpu(a->class);
+ a->ttl = be32_to_cpu(a->ttl);
+ a->rdlength = be16_to_cpu(a->rdlength);
*len -= sizeof(struct dns_answer);
*data += sizeof(struct dns_answer);
switch (q->type) {
case TYPE_ANY:
if (!strcmp(name, mdns_hostname_local))
- service_reply(iface, NULL);
+ service_reply(iface, NULL, announce_ttl);
break;
case TYPE_PTR:
service_announce_services(iface, name);
- service_reply(iface, name);
+ service_reply(iface, name, announce_ttl);
break;
case TYPE_AAAA:
if (host)
*host = '\0';
if (!strcmp(mdns_hostname, name))
- service_reply_a(iface, q->type);
+ service_reply_a(iface, q->type, announce_ttl);
break;
};
}
return;
while (h->answers-- > 0)
- parse_answer(iface, buffer, len, &b, &rlen, 1);
+ if (parse_answer(iface, buffer, len, &b, &rlen, 1))
+ return;
while (h->authority-- > 0)
- parse_answer(iface, buffer, len, &b, &rlen, 0);
+ if (parse_answer(iface, buffer, len, &b, &rlen, 1))
+ return;
while (h->additional-- > 0)
- parse_answer(iface, buffer, len, &b, &rlen, 1);
+ if (parse_answer(iface, buffer, len, &b, &rlen, 1))
+ return;
+
}