xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/tools/quic_name_lookup.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "quiche/quic/tools/quic_name_lookup.h"
6 
7 #include <cstring>
8 #include <string>
9 
10 #include "absl/strings/str_cat.h"
11 #include "quiche/quic/core/quic_server_id.h"
12 #include "quiche/quic/platform/api/quic_logging.h"
13 #include "quiche/quic/platform/api/quic_socket_address.h"
14 
15 #if defined(_WIN32)
16 #include <winsock2.h>
17 #include <ws2tcpip.h>
18 #else  // else assume POSIX
19 #include <netdb.h>
20 #include <sys/socket.h>
21 #include <sys/types.h>
22 #endif
23 
24 namespace quic::tools {
25 
LookupAddress(int address_family_for_lookup,std::string host,std::string port)26 QuicSocketAddress LookupAddress(int address_family_for_lookup, std::string host,
27                                 std::string port) {
28   addrinfo hint;
29   memset(&hint, 0, sizeof(hint));
30   hint.ai_family = address_family_for_lookup;
31   hint.ai_protocol = IPPROTO_UDP;
32 
33   addrinfo* info_list = nullptr;
34   int result = getaddrinfo(host.c_str(), port.c_str(), &hint, &info_list);
35   if (result != 0) {
36     QUIC_LOG(ERROR) << "Failed to look up " << host << ": "
37                     << gai_strerror(result);
38     return QuicSocketAddress();
39   }
40 
41   QUICHE_CHECK(info_list != nullptr);
42   std::unique_ptr<addrinfo, void (*)(addrinfo*)> info_list_owned(
43       info_list, [](addrinfo* ai) { freeaddrinfo(ai); });
44   return QuicSocketAddress(info_list->ai_addr, info_list->ai_addrlen);
45 }
46 
LookupAddress(int address_family_for_lookup,const QuicServerId & server_id)47 QuicSocketAddress LookupAddress(int address_family_for_lookup,
48                                 const QuicServerId& server_id) {
49   return LookupAddress(address_family_for_lookup,
50                        std::string(server_id.GetHostWithoutIpv6Brackets()),
51                        absl::StrCat(server_id.port()));
52 }
53 
54 }  // namespace quic::tools
55