mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-02-02 09:47:03 +03:00
Merge pull request #1034 from poettering/resolved-fixes-2
various resolved fixes
This commit is contained in:
commit
4ece412faf
@ -64,7 +64,7 @@ int dns_packet_new(DnsPacket **ret, DnsProtocol protocol, size_t mtu) {
|
||||
int dns_packet_new_query(DnsPacket **ret, DnsProtocol protocol, size_t mtu) {
|
||||
DnsPacket *p;
|
||||
DnsPacketHeader *h;
|
||||
int r, rd;
|
||||
int r;
|
||||
|
||||
assert(ret);
|
||||
|
||||
@ -74,27 +74,26 @@ int dns_packet_new_query(DnsPacket **ret, DnsProtocol protocol, size_t mtu) {
|
||||
|
||||
h = DNS_PACKET_HEADER(p);
|
||||
|
||||
switch (protocol) {
|
||||
case DNS_PROTOCOL_LLMNR:
|
||||
/* no recursion for link-local resolving protocols */
|
||||
rd = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* ask for recursion */
|
||||
rd = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
h->flags = htobe16(DNS_PACKET_MAKE_FLAGS(0 /* qr */,
|
||||
0 /* opcode */,
|
||||
0 /* aa */,
|
||||
0 /* tc */,
|
||||
rd /* rd */,
|
||||
0 /* ra */,
|
||||
0 /* ad */,
|
||||
0 /* cd */,
|
||||
0 /* rcode */));
|
||||
if (protocol == DNS_PROTOCOL_LLMNR)
|
||||
h->flags = htobe16(DNS_PACKET_MAKE_FLAGS(0 /* qr */,
|
||||
0 /* opcode */,
|
||||
0 /* c */,
|
||||
0 /* tc */,
|
||||
0 /* t */,
|
||||
0 /* ra */,
|
||||
0 /* ad */,
|
||||
0 /* cd */,
|
||||
0 /* rcode */));
|
||||
else
|
||||
h->flags = htobe16(DNS_PACKET_MAKE_FLAGS(0 /* qr */,
|
||||
0 /* opcode */,
|
||||
0 /* aa */,
|
||||
0 /* tc */,
|
||||
1 /* rd (ask for recursion) */,
|
||||
0 /* ra */,
|
||||
0 /* ad */,
|
||||
0 /* cd */,
|
||||
0 /* rcode */));
|
||||
|
||||
*ret = p;
|
||||
return 0;
|
||||
|
@ -121,15 +121,15 @@ static inline uint8_t* DNS_PACKET_DATA(DnsPacket *p) {
|
||||
#define DNS_PACKET_ARCOUNT(p) be16toh(DNS_PACKET_HEADER(p)->arcount)
|
||||
|
||||
#define DNS_PACKET_MAKE_FLAGS(qr, opcode, aa, tc, rd, ra, ad, cd, rcode) \
|
||||
(((uint16_t) !!qr << 15) | \
|
||||
((uint16_t) (opcode & 15) << 11) | \
|
||||
((uint16_t) !!aa << 10) | \
|
||||
((uint16_t) !!tc << 9) | \
|
||||
((uint16_t) !!rd << 8) | \
|
||||
((uint16_t) !!ra << 7) | \
|
||||
((uint16_t) !!ad << 5) | \
|
||||
((uint16_t) !!cd << 4) | \
|
||||
((uint16_t) (rcode & 15)))
|
||||
(((uint16_t) !!(qr) << 15) | \
|
||||
((uint16_t) ((opcode) & 15) << 11) | \
|
||||
((uint16_t) !!(aa) << 10) | /* on LLMNR: c */ \
|
||||
((uint16_t) !!(tc) << 9) | \
|
||||
((uint16_t) !!(rd) << 8) | /* on LLMNR: t */ \
|
||||
((uint16_t) !!(ra) << 7) | \
|
||||
((uint16_t) !!(ad) << 5) | \
|
||||
((uint16_t) !!(cd) << 4) | \
|
||||
((uint16_t) ((rcode) & 15)))
|
||||
|
||||
static inline unsigned DNS_PACKET_RRCOUNT(DnsPacket *p) {
|
||||
return
|
||||
|
@ -39,8 +39,8 @@ DnsTransaction* dns_transaction_free(DnsTransaction *t) {
|
||||
dns_packet_unref(t->received);
|
||||
dns_answer_unref(t->cached);
|
||||
|
||||
sd_event_source_unref(t->dns_event_source);
|
||||
safe_close(t->dns_fd);
|
||||
sd_event_source_unref(t->dns_udp_event_source);
|
||||
safe_close(t->dns_udp_fd);
|
||||
|
||||
dns_server_unref(t->server);
|
||||
dns_stream_free(t->stream);
|
||||
@ -98,7 +98,7 @@ int dns_transaction_new(DnsTransaction **ret, DnsScope *s, DnsResourceKey *key)
|
||||
if (!t)
|
||||
return -ENOMEM;
|
||||
|
||||
t->dns_fd = -1;
|
||||
t->dns_udp_fd = -1;
|
||||
t->key = dns_resource_key_ref(key);
|
||||
|
||||
/* Find a fresh, unused transaction id */
|
||||
@ -328,8 +328,8 @@ static void dns_transaction_next_dns_server(DnsTransaction *t) {
|
||||
assert(t);
|
||||
|
||||
t->server = dns_server_unref(t->server);
|
||||
t->dns_event_source = sd_event_source_unref(t->dns_event_source);
|
||||
t->dns_fd = safe_close(t->dns_fd);
|
||||
t->dns_udp_event_source = sd_event_source_unref(t->dns_udp_event_source);
|
||||
t->dns_udp_fd = safe_close(t->dns_udp_fd);
|
||||
|
||||
dns_scope_next_dns_server(t->scope);
|
||||
}
|
||||
@ -500,16 +500,16 @@ static int dns_transaction_emit(DnsTransaction *t) {
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
r = sd_event_add_io(t->scope->manager->event, &t->dns_event_source, fd, EPOLLIN, on_dns_packet, t);
|
||||
r = sd_event_add_io(t->scope->manager->event, &t->dns_udp_event_source, fd, EPOLLIN, on_dns_packet, t);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
t->dns_fd = fd;
|
||||
t->dns_udp_fd = fd;
|
||||
fd = -1;
|
||||
t->server = dns_server_ref(server);
|
||||
}
|
||||
|
||||
r = dns_scope_emit(t->scope, t->dns_fd, t->sent);
|
||||
r = dns_scope_emit(t->scope, t->dns_udp_fd, t->sent);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
@ -62,10 +62,10 @@ struct DnsTransaction {
|
||||
sd_event_source *timeout_event_source;
|
||||
unsigned n_attempts;
|
||||
|
||||
int dns_fd;
|
||||
sd_event_source *dns_event_source;
|
||||
int dns_udp_fd;
|
||||
sd_event_source *dns_udp_event_source;
|
||||
|
||||
/* the active server */
|
||||
/* The active server */
|
||||
DnsServer *server;
|
||||
|
||||
/* TCP connection logic, if we need it */
|
||||
|
Loading…
x
Reference in New Issue
Block a user