From fe3c993ae7176553c7691fcac82aa6c961c86259 Mon Sep 17 00:00:00 2001 From: Valentin Gosu Date: Tue, 22 Oct 2019 19:46:28 +0000 Subject: [PATCH] Bug 1588219 - Expose DNS suffix list (Linux) r=dragana Differential Revision: https://phabricator.services.mozilla.com/D49414 --HG-- extra : moz-landing-system : lando --- netwerk/system/linux/nsNetworkLinkService.cpp | 7 +++- netwerk/system/netlink/NetlinkService.cpp | 37 +++++++++++++++++++ netwerk/system/netlink/NetlinkService.h | 3 ++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/netwerk/system/linux/nsNetworkLinkService.cpp b/netwerk/system/linux/nsNetworkLinkService.cpp index d9ca40a0382c..74b86a280bd9 100644 --- a/netwerk/system/linux/nsNetworkLinkService.cpp +++ b/netwerk/system/linux/nsNetworkLinkService.cpp @@ -60,7 +60,12 @@ nsNetworkLinkService::GetNetworkID(nsACString& aNetworkID) { NS_IMETHODIMP nsNetworkLinkService::GetDnsSuffixList(nsTArray& aDnsSuffixList) { - return NS_ERROR_NOT_IMPLEMENTED; + if (!mNetlinkSvc) { + return NS_ERROR_NOT_AVAILABLE; + } + + mNetlinkSvc->GetDnsSuffixList(aDnsSuffixList); + return NS_OK; } NS_IMETHODIMP diff --git a/netwerk/system/netlink/NetlinkService.cpp b/netwerk/system/netlink/NetlinkService.cpp index 84ee38d65e92..a91dad6a8f7c 100644 --- a/netwerk/system/netlink/NetlinkService.cpp +++ b/netwerk/system/netlink/NetlinkService.cpp @@ -26,6 +26,12 @@ #include "mozilla/Telemetry.h" #include "mozilla/DebugOnly.h" +#if defined(HAVE_RES_NINIT) +# include +# include +# include +#endif + /* a shorter name that better explains what it does */ #define EINTR_RETRY(x) MOZ_TEMP_FAILURE_RETRY(x) @@ -1711,6 +1717,26 @@ bool NetlinkService::CalculateIDForFamily(uint8_t aFamily, SHA1Sum* aSHA1) { return retval; } +void NetlinkService::ComputeDNSSuffixList() { + MOZ_ASSERT(!NS_IsMainThread(), "Must not be called on the main thread"); +#if defined(HAVE_RES_NINIT) + nsTArray suffixList; + struct __res_state res; + if (res_ninit(&res) == 0) { + for (int i = 0; i < MAXDNSRCH; i++) { + if (!res.dnsrch[i]) { + break; + } + suffixList.AppendElement(nsCString(res.dnsrch[i])); + } + res_nclose(&res); + } + + MutexAutoLock lock(mMutex); + mDNSSuffixList = std::move(suffixList); +#endif +} + // Figure out the "network identification". void NetlinkService::CalculateNetworkID() { LOG(("NetlinkService::CalculateNetworkID")); @@ -1723,6 +1749,7 @@ void NetlinkService::CalculateNetworkID() { SHA1Sum sha1; UpdateLinkStatus(); + ComputeDNSSuffixList(); bool idChanged = false; bool found4 = CalculateIDForFamily(AF_INET, &sha1); @@ -1793,6 +1820,16 @@ void NetlinkService::GetNetworkID(nsACString& aNetworkID) { aNetworkID = mNetworkId; } +nsresult NetlinkService::GetDnsSuffixList(nsTArray& aDnsSuffixList) { +#if defined(HAVE_RES_NINIT) + MutexAutoLock lock(mMutex); + aDnsSuffixList = mDNSSuffixList; + return NS_OK; +#else + return NS_ERROR_NOT_IMPLEMENTED; +#endif +} + void NetlinkService::GetIsLinkUp(bool* aIsUp) { MutexAutoLock lock(mMutex); *aIsUp = mLinkUp; diff --git a/netwerk/system/netlink/NetlinkService.h b/netwerk/system/netlink/NetlinkService.h index 0344761c913a..4d3929db7d18 100644 --- a/netwerk/system/netlink/NetlinkService.h +++ b/netwerk/system/netlink/NetlinkService.h @@ -55,6 +55,7 @@ class NetlinkService : public nsIRunnable { nsresult Shutdown(); void GetNetworkID(nsACString& aNetworkID); void GetIsLinkUp(bool* aIsUp); + nsresult GetDnsSuffixList(nsTArray& aDnsSuffixList); private: void EnqueueGenMsg(uint16_t aMsgType, uint8_t aFamily); @@ -76,6 +77,7 @@ class NetlinkService : public nsIRunnable { int GetPollWait(); bool CalculateIDForFamily(uint8_t aFamily, mozilla::SHA1Sum* aSHA1); void CalculateNetworkID(); + void ComputeDNSSuffixList(); nsCOMPtr mThread; @@ -108,6 +110,7 @@ class NetlinkService : public nsIRunnable { mozilla::TimeStamp mTriggerTime; nsCString mNetworkId; + nsTArray mDNSSuffixList; class LinkInfo { public: