4 #include "resources/net/client_socket.h"
5 #include "resources/net/udp.h"
6 #include "resources/net/ipv4_addr.h"
27 } __attribute__((packed
));
31 dns_non_auth_ok
= 0x10,
32 dns_recursion
= 0x100,
33 dns_truncated
= 0x200,
34 dns_standard_query
= 0,
54 void set(p
<net::udp
> _u
) {
58 net::ipv4_addr
get_ipv4(const string
&host
) {
59 p
<packet
> pkg
= new packet
;
60 pkg
->id
= to_be16(0xbeef);
61 pkg
->flags
= to_be16(dns_question
| dns_standard_query
| dns_recursion
);
62 pkg
->questions
= to_be16(1);
67 buffer buf
= buffer::to_mem(pkg
);
69 list
<string
> subs
= host
.split('.');
70 for (int i
= 0; i
< subs
.get_count(); i
++) {
72 size
[0] = subs
[i
].length();
74 buf
+= subs
[i
].to_mem().get_next(subs
[i
].length());
81 p
<dns_query
> q
= new dns_query
;
82 q
->q_type
= to_be16(dns_A
);
83 q
->q_class
= to_be16(dns_IN
);
85 buf
+= buffer::to_mem(q
);
87 p
<net::client_socket
> client
= u
->create_client();
88 client
->connect(net::ipv4_addr::from_le(62 << 24 | 148 << 16 | 87 << 8 | 180), 53);
95 if (answer
.cast
<packet
>()->flags
& dns_no_such_name
)
96 return net::ipv4_addr::from_le(0);
98 answer
= answer
.cut_first(sizeof(packet
));
100 for (i
= 0; answer
[i
] && i
< answer
.get_size(); i
++);
101 answer
= answer
.cut_first(i
+ 1 + sizeof(u16
) * 2);
103 if (from_be16(answer
.cast
<dns_answer
>()->a_type
) != dns_A
)
104 return net::ipv4_addr::from_le(0);
106 return net::ipv4_addr::from_be(answer
.cast
<dns_answer
>()->answer
);