]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
rec: Directly use ComboAddress for parsing local-address config value
authorFred Morcos <fred.morcos@open-xchange.com>
Tue, 20 Sep 2022 13:05:13 +0000 (15:05 +0200)
committerFred Morcos <fred.morcos@open-xchange.com>
Mon, 26 Sep 2022 08:43:03 +0000 (10:43 +0200)
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.

pdns/pdns_recursor.cc
pdns/recursordist/rec-tcp.cc

index 6da90d55dda01067ddbd696bc8b7c26ecfb3f66c..75aacff0f04e05bc2e6ede26377b07d57cc94820 100644 (file)
@@ -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);
index 7e732efca3ef7897b63bdef7ac17976c4d5a9fec..8923ef86598d9fa6877b7b201ce1232636b42d3b 100644 (file)
@@ -1039,21 +1039,9 @@ void makeTCPServerSockets(deferredAdd_t& deferredAdds, std::set<int>& 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<int>& 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);