From: Fred Morcos Date: Wed, 14 Sep 2022 18:34:27 +0000 (+0200) Subject: rec: Make getHostname return an optional X-Git-Tag: rec-4.9.0-alpha0~35^2~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ff32c991f252e33de5c5916b0c9ba1d08d177519;p=thirdparty%2Fpdns.git rec: Make getHostname return an optional Also: - Cleans up getHostname and has it use getMaxHostNameSize(). - Updates getCarbonHostName to use getHostname. --- diff --git a/pdns/misc.cc b/pdns/misc.cc index 4334074ec4..f06519d7f6 100644 --- a/pdns/misc.cc +++ b/pdns/misc.cc @@ -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 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(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; diff --git a/pdns/misc.hh b/pdns/misc.hh index 5b7454e7fb..f367a94ade 100644 --- a/pdns/misc.hh +++ b/pdns/misc.hh @@ -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 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 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 &val); // from ragel size_t parseSVCBValueList(const std::string &in, vector &val); diff --git a/pdns/recursordist/rec-main.cc b/pdns/recursordist/rec-main.cc index 818406e2a8..6dea11858e 100644 --- a/pdns/recursordist/rec-main.cc +++ b/pdns/recursordist/rec-main.cc @@ -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;