]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
rec: Make getHostname return an optional<string>
authorFred Morcos <fred.morcos@open-xchange.com>
Wed, 14 Sep 2022 18:34:27 +0000 (20:34 +0200)
committerFred Morcos <fred.morcos@open-xchange.com>
Mon, 26 Sep 2022 08:43:03 +0000 (10:43 +0200)
Also:

- Cleans up getHostname and has it use getMaxHostNameSize().
- Updates getCarbonHostName to use getHostname.

pdns/misc.cc
pdns/misc.hh
pdns/recursordist/rec-main.cc

index 4334074ec42e525c91c4e3511763d8866ce5dcd5..f06519d7f67ed5bd3602b495401e41ac9e078c19 100644 (file)
@@ -510,17 +510,46 @@ string urlEncode(const string &text)
   return ret;
 }
 
-string getHostname()
+static size_t getMaxHostNameSize()
 {
-#ifndef MAXHOSTNAMELEN
-#define MAXHOSTNAMELEN 255
+#if defined(HOST_NAME_MAX)
+  return HOST_NAME_MAX;
 #endif
 
-  char tmp[MAXHOSTNAMELEN];
-  if(gethostname(tmp, MAXHOSTNAMELEN))
-    return "UNKNOWN";
+#if defined(_SC_HOST_NAME_MAX)
+  auto tmp = sysconf(_SC_HOST_NAME_MAX);
+  if (tmp != -1) {
+    return tmp;
+  }
+#endif
 
-  return string(tmp);
+  const size_t maxHostNameSize = 255;
+  return maxHostNameSize;
+}
+
+std::optional<string> getHostname()
+{
+  const size_t maxHostNameBufSize = getMaxHostNameSize() + 1;
+  std::string hostname;
+  hostname.resize(maxHostNameBufSize, 0);
+
+  if (gethostname(hostname.data(), maxHostNameBufSize) == -1) {
+    return std::nullopt;
+  }
+
+  hostname.resize(strlen(hostname.c_str()));
+  return std::make_optional(hostname);
+}
+
+std::string getCarbonHostName()
+{
+  auto hostname = getHostname();
+  if (!hostname.has_value()) {
+    throw std::runtime_error(stringerror());
+  }
+
+  boost::replace_all(*hostname, ".", "_");
+  return *hostname;
 }
 
 string itoa(int i)
@@ -1650,38 +1679,6 @@ DNSName reverseNameFromIP(const ComboAddress& ip)
   throw std::runtime_error("Calling reverseNameFromIP() for an address which is neither an IPv4 nor an IPv6");
 }
 
-static size_t getMaxHostNameSize()
-{
-#if defined(HOST_NAME_MAX)
-  return HOST_NAME_MAX;
-#endif
-
-#if defined(_SC_HOST_NAME_MAX)
-  auto tmp = sysconf(_SC_HOST_NAME_MAX);
-  if (tmp != -1) {
-    return tmp;
-  }
-#endif
-
-  /* _POSIX_HOST_NAME_MAX */
-  return 255;
-}
-
-std::string getCarbonHostName()
-{
-  std::string hostname;
-  hostname.resize(getMaxHostNameSize() + 1, 0);
-
-  if (gethostname(const_cast<char*>(hostname.c_str()), hostname.size()) != 0) {
-    throw std::runtime_error(stringerror());
-  }
-
-  boost::replace_all(hostname, ".", "_");
-  hostname.resize(strlen(hostname.c_str()));
-
-  return hostname;
-}
-
 std::string makeLuaString(const std::string& in)
 {
   ostringstream str;
index 5b7454e7fb116beb769d9c560696123855282740..f367a94adeae6515f4caba8aedb4fee77b17897b 100644 (file)
@@ -68,7 +68,8 @@ const string unquotify(const string &item);
 string humanDuration(time_t passed);
 bool stripDomainSuffix(string *qname, const string &domain);
 void stripLine(string &line);
-string getHostname();
+std::optional<string> getHostname();
+std::string getCarbonHostName();
 string urlEncode(const string &text);
 int waitForData(int fd, int seconds, int useconds=0);
 int waitFor2Data(int fd1, int fd2, int seconds, int useconds, int* fd);
@@ -756,7 +757,6 @@ std::vector<ComboAddress> getResolvers(const std::string& resolvConfPath);
 
 DNSName reverseNameFromIP(const ComboAddress& ip);
 
-std::string getCarbonHostName();
 size_t parseRFC1035CharString(const std::string &in, std::string &val); // from ragel
 size_t parseSVCBValueListFromParsedRFC1035CharString(const std::string &in, vector<std::string> &val); // from ragel
 size_t parseSVCBValueList(const std::string &in, vector<std::string> &val);
index 818406e2a85685db699a9b4e02b19c47b40ee987..6dea11858e35664435260be6c491cb8d3557c793 100644 (file)
@@ -1481,11 +1481,10 @@ static int serviceMain(int argc, char* argv[], Logr::log_t log)
     g_quiet = false;
     g_dnssecLOG = true;
   }
-  string myHostname = getHostname();
-  if (myHostname == "UNKNOWN") {
+  auto myHostname = getHostname();
+  if (!myHostname.has_value()) {
     SLOG(g_log << Logger::Warning << "Unable to get the hostname, NSID and id.server values will be empty" << endl,
          log->info(Logr::Warning, "Unable to get the hostname, NSID and id.server values will be empty"));
-    myHostname = "";
   }
 
   SyncRes::s_minimumTTL = ::arg().asNum("minimum-ttl-override");
@@ -1534,7 +1533,7 @@ static int serviceMain(int argc, char* argv[], Logr::log_t log)
   }
 
   if (SyncRes::s_serverID.empty()) {
-    SyncRes::s_serverID = myHostname;
+    SyncRes::s_serverID = myHostname.has_value() ? *myHostname : "";
   }
 
   SyncRes::s_ecsipv4limit = ::arg().asNum("ecs-ipv4-bits");
@@ -1864,7 +1863,7 @@ static int serviceMain(int argc, char* argv[], Logr::log_t log)
   dns_random_init();
 
   if (::arg()["server-id"].empty()) {
-    ::arg().set("server-id") = myHostname;
+    ::arg().set("server-id") = myHostname.has_value() ? *myHostname : "";
   }
 
   int newgid = 0;