diff --git a/Servers/LookupServer/LookupServer.cpp b/Servers/LookupServer/LookupServer.cpp index 4cf7dfc36a..8ccbdd9a99 100644 --- a/Servers/LookupServer/LookupServer.cpp +++ b/Servers/LookupServer/LookupServer.cpp @@ -30,20 +30,13 @@ #include #include #include -#include #include #include #include #include #include -#include -#include +#include #include -#include -#include -#include -#include -#include #include LookupServer::LookupServer() @@ -176,35 +169,29 @@ Vector LookupServer::lookup(const String& hostname, bool& did_timeout, u auto buffer = request.to_byte_buffer(); - struct sockaddr_in dst_addr; + auto udp_socket = CUdpSocket::construct(); + udp_socket->set_blocking(true); - int fd = make_dns_request_socket(dst_addr); - if (fd < 0) - return {}; + struct timeval timeout { + 1, 0 + }; - int nsent = sendto(fd, buffer.data(), buffer.size(), 0, (const struct sockaddr*)&dst_addr, sizeof(dst_addr)); - if (nsent < 0) { - perror("sendto"); + int rc = setsockopt(udp_socket->fd(), SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); + if (rc < 0) { + perror("setsockopt(SOL_SOCKET, SO_RCVTIMEO)"); return {}; } - ASSERT(nsent == buffer.size()); - struct sockaddr_in src_addr; - socklen_t src_addr_len = sizeof(src_addr); + if (!udp_socket->connect(m_dns_ip, 53)) + return {}; + + if (!udp_socket->write(buffer)) + return {}; + u8 response_buffer[4096]; - ssize_t nrecv = recvfrom(fd, response_buffer, sizeof(response_buffer) - 1, 0, (struct sockaddr*)&src_addr, &src_addr_len); - if (nrecv < 0) { - if (errno == EAGAIN) { - did_timeout = true; - } else { - perror("recvfrom"); - } - close(fd); + int nrecv = udp_socket->read(response_buffer, sizeof(response_buffer)); + if (nrecv == 0) return {}; - } - close(fd); - - response_buffer[nrecv] = '\0'; auto o_response = DNSResponse::from_raw_response(response_buffer, nrecv); if (!o_response.has_value()) @@ -254,35 +241,3 @@ Vector LookupServer::lookup(const String& hostname, bool& did_timeout, u m_lookup_cache.set(hostname, { time(nullptr), record_type, addresses }); return addresses; } - -int LookupServer::make_dns_request_socket(sockaddr_in& dst_addr) -{ - int fd = socket(AF_INET, SOCK_DGRAM, 0); - if (fd < 0) { - perror("socket"); - return {}; - } - - struct timeval timeout { - 1, 0 - }; - int rc = setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); - if (rc < 0) { - perror("setsockopt(SOL_SOCKET, SO_RCVTIMEO)"); - close(fd); - return {}; - } - - memset(&dst_addr, 0, sizeof(dst_addr)); - - dst_addr.sin_family = AF_INET; - dst_addr.sin_port = htons(53); - rc = inet_pton(AF_INET, m_dns_ip.characters(), &dst_addr.sin_addr); - if (rc < 0) { - perror("inet_pton"); - close(fd); - return rc; - } - - return fd; -} diff --git a/Servers/LookupServer/LookupServer.h b/Servers/LookupServer/LookupServer.h index 5c8120cd4c..b3ba33c3d4 100644 --- a/Servers/LookupServer/LookupServer.h +++ b/Servers/LookupServer/LookupServer.h @@ -28,10 +28,7 @@ #include "DNSRequest.h" #include -#include -#include #include -#include class CLocalSocket; class CLocalServer; @@ -47,8 +44,6 @@ private: void service_client(RefPtr); Vector lookup(const String& hostname, bool& did_timeout, unsigned short record_type, ShouldRandomizeCase = ShouldRandomizeCase::Yes); - int make_dns_request_socket(sockaddr_in& dst_addr); - struct CachedLookup { time_t timestamp { 0 }; unsigned short record_type { 0 };