static void test_dns_name_reverse_one(const char *address, const char *name) { _cleanup_free_ char *p = NULL; union in_addr_union a, b = {}; int familya, familyb; assert_se(in_addr_from_string_auto(address, &familya, &a) >= 0); assert_se(dns_name_reverse(familya, &a, &p) >= 0); assert_se(streq(p, name)); assert_se(dns_name_address(p, &familyb, &b) > 0); assert_se(familya == familyb); assert_se(in_addr_equal(familya, &a, &b)); }
static int dns_transaction_open_tcp(DnsTransaction *t) { DnsServer *server = NULL; _cleanup_close_ int fd = -1; int r; assert(t); if (t->stream) return 0; switch (t->scope->protocol) { case DNS_PROTOCOL_DNS: fd = dns_scope_tcp_socket(t->scope, AF_UNSPEC, NULL, 53, &server); break; case DNS_PROTOCOL_LLMNR: /* When we already received a reply to this (but it was truncated), send to its sender address */ if (t->received) fd = dns_scope_tcp_socket(t->scope, t->received->family, &t->received->sender, t->received->sender_port, NULL); else { union in_addr_union address; int family = AF_UNSPEC; /* Otherwise, try to talk to the owner of a * the IP address, in case this is a reverse * PTR lookup */ r = dns_name_address(DNS_RESOURCE_KEY_NAME(t->key), &family, &address); if (r < 0) return r; if (r == 0) return -EINVAL; if (family != t->scope->family) return -ESRCH; fd = dns_scope_tcp_socket(t->scope, family, &address, LLMNR_PORT, NULL); } break; default: return -EAFNOSUPPORT; } if (fd < 0) return fd; r = dns_stream_new(t->scope->manager, &t->stream, t->scope->protocol, fd); if (r < 0) return r; fd = -1; r = dns_stream_write_packet(t->stream, t->sent); if (r < 0) { t->stream = dns_stream_free(t->stream); return r; } dns_server_unref(t->server); t->server = dns_server_ref(server); t->received = dns_packet_unref(t->received); t->stream->complete = on_stream_complete; t->stream->transaction = t; /* The interface index is difficult to determine if we are * connecting to the local host, hence fill this in right away * instead of determining it from the socket */ if (t->scope->link) t->stream->ifindex = t->scope->link->ifindex; return 0; }