From: Fred Morcos Date: Tue, 20 Sep 2022 13:05:13 +0000 (+0200) Subject: rec: Directly use ComboAddress for parsing local-address config value X-Git-Tag: rec-4.9.0-alpha0~35^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=94fc1dc5b583fb646a9477532845943d41044424;p=thirdparty%2Fpdns.git rec: Directly use ComboAddress for parsing local-address config value Part of #11927 This is marked as "part of" because the parsing can still be greatly improved. For the time being, the error message has been improved. However, an actual configuration file parser - with line and column number tracking - would be ideal. --- diff --git a/pdns/pdns_recursor.cc b/pdns/pdns_recursor.cc index 6da90d55dd..75aacff0f0 100644 --- a/pdns/pdns_recursor.cc +++ b/pdns/pdns_recursor.cc @@ -2403,21 +2403,9 @@ void makeUDPServerSockets(deferredAdd_t& deferredAdds, Logr::log_t log) throw PDNSException("No local address specified"); } + const uint16_t defaultLocalPort = ::arg().asNum("local-port"); for (const auto& localAddress : localAddresses) { - ServiceTuple st; - st.port = ::arg().asNum("local-port"); - parseService(localAddress, st); - - ComboAddress address; - - address.reset(); - address.sin4.sin_family = AF_INET; - if (!IpToU32(st.host.c_str(), (uint32_t*)&address.sin4.sin_addr.s_addr)) { - address.sin6.sin6_family = AF_INET6; - if (makeIPv6sockaddr(st.host, &address.sin6) < 0) - throw PDNSException("Unable to resolve local address for UDP server on '" + st.host + "'"); - } - + ComboAddress address{localAddress, defaultLocalPort}; const int socketFd = socket(address.sin4.sin_family, SOCK_DGRAM, 0); if (socketFd < 0) { throw PDNSException("Making a UDP server socket for resolver: " + stringerror()); @@ -2458,7 +2446,6 @@ void makeUDPServerSockets(deferredAdd_t& deferredAdds, Logr::log_t log) SLOG(g_log << Logger::Error << e.what() << endl, log->error(Logr::Error, e.what(), "Exception while setting socker buffer size")); } - address.sin4.sin_port = htons(st.port); if (g_reusePort) { #if defined(SO_REUSEPORT_LB) @@ -2488,7 +2475,7 @@ void makeUDPServerSockets(deferredAdd_t& deferredAdds, Logr::log_t log) socklen_t socklen = address.getSocklen(); if (::bind(socketFd, (struct sockaddr*)&address, socklen) < 0) { - throw PDNSException("Resolver binding to server socket on port " + std::to_string(st.port) + " for " + st.host + ": " + stringerror()); + throw PDNSException("Resolver binding to server socket on " + address.toStringWithPort() + ": " + stringerror()); } setNonBlocking(socketFd); diff --git a/pdns/recursordist/rec-tcp.cc b/pdns/recursordist/rec-tcp.cc index 7e732efca3..8923ef8659 100644 --- a/pdns/recursordist/rec-tcp.cc +++ b/pdns/recursordist/rec-tcp.cc @@ -1039,21 +1039,9 @@ void makeTCPServerSockets(deferredAdd_t& deferredAdds, std::set& tcpSockets } auto first = true; + const uint16_t defaultLocalPort = ::arg().asNum("local-port"); for (const auto& localAddress : localAddresses) { - ServiceTuple st; - st.port = ::arg().asNum("local-port"); - parseService(localAddress, st); - - ComboAddress address; - - address.reset(); - address.sin4.sin_family = AF_INET; - if (!IpToU32(st.host, (uint32_t*)&address.sin4.sin_addr.s_addr)) { - address.sin6.sin6_family = AF_INET6; - if (makeIPv6sockaddr(st.host, &address.sin6) < 0) - throw PDNSException("Unable to resolve local address for TCP server on '" + st.host + "'"); - } - + ComboAddress address{localAddress, defaultLocalPort}; const int socketFd = socket(address.sin6.sin6_family, SOCK_STREAM, 0); if (socketFd < 0) { throw PDNSException("Making a TCP server socket for resolver: " + stringerror()); @@ -1119,10 +1107,9 @@ void makeTCPServerSockets(deferredAdd_t& deferredAdds, std::set& tcpSockets #endif } - address.sin4.sin_port = htons(st.port); socklen_t socklen = address.sin4.sin_family == AF_INET ? sizeof(address.sin4) : sizeof(address.sin6); if (::bind(socketFd, (struct sockaddr*)&address, socklen) < 0) { - throw PDNSException("Binding TCP server socket for " + st.host + ": " + stringerror()); + throw PDNSException("Binding TCP server socket for " + address.toStringWithPort() + ": " + stringerror()); } setNonBlocking(socketFd);