From 6a6e7f1cdcd509f9ab97a74b1f2196447a703321 Mon Sep 17 00:00:00 2001 From: Gabriel Ortiz Lour Date: Wed, 9 Sep 2026 18:57:58 -0300 Subject: [PATCH 1/2] mDNS: add queryHost() --- libraries/ESP8266mDNS/src/LEAmDNS.cpp | 79 +++++++++++++++++++++++++++ libraries/ESP8266mDNS/src/LEAmDNS.h | 17 ++++++ 2 files changed, 96 insertions(+) diff --git a/libraries/ESP8266mDNS/src/LEAmDNS.cpp b/libraries/ESP8266mDNS/src/LEAmDNS.cpp index 75862644f5..0f978f54d3 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS.cpp +++ b/libraries/ESP8266mDNS/src/LEAmDNS.cpp @@ -671,6 +671,85 @@ namespace MDNSImplementation return addDynamicServiceTxt(p_hService, p_pcKey, acBuffer); } +#ifdef MDNS_IP4_SUPPORT + /* + MDNSResponder::queryHost + Perform a blocking mDNS A query for a host. + */ + IPAddress + MDNSResponder::queryHost(const char* p_pcHostname, + const uint32_t p_u32Timeout /*= MDNS_QUERYHOST_WAIT_TIME*/) + { + if (0 == m_pUDPContext) + { + // safeguard against misuse + return IPAddress(); + } + + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P( + PSTR("[MDNSResponder] queryHost '%s'\n"), (p_pcHostname ?: "-"));); + + IPAddress result; + + stcMDNSServiceQuery* pServiceQuery = 0; + stcMDNS_RRDomain hostDomain; + + if ((p_pcHostname) && (os_strlen(p_pcHostname)) && (p_u32Timeout) + && (_removeLegacyServiceQuery()) + && (_buildDomainForHost(p_pcHostname, hostDomain)) + && ((pServiceQuery = _allocServiceQuery()))) + { + pServiceQuery->m_bLegacyQuery = true; + + stcMDNSServiceQuery::stcAnswer* pAnswer = + new stcMDNSServiceQuery::stcAnswer; + + if (pAnswer) + { + pAnswer->m_HostDomain = hostDomain; + + if ((pServiceQuery->addAnswer(pAnswer)) + && (_sendMDNSQuery(hostDomain, DNS_RRTYPE_A))) + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P( + PSTR("[MDNSResponder] queryHost: Waiting up to %lu ms for answer...\n"), + p_u32Timeout);); + + const uint32_t start = millis(); + + do + { + delay(1); + + const stcMDNSServiceQuery::stcAnswer::stcIP4Address* pIP4Address = + pAnswer->IP4AddressAtIndex(0); + + if (pIP4Address) + { + result = pIP4Address->m_IPAddress; + break; + } + } + while ((millis() - start) < p_u32Timeout); + } + } + + pServiceQuery->m_bAwaitingAnswers = false; + _removeServiceQuery(pServiceQuery); + } + else + { + if (pServiceQuery) + _removeServiceQuery(pServiceQuery); + + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P( + PSTR("[MDNSResponder] queryHost: INVALID input data!\n"));); + } + + return result; + } +#endif + /** STATIC SERVICE QUERY (LEGACY) */ diff --git a/libraries/ESP8266mDNS/src/LEAmDNS.h b/libraries/ESP8266mDNS/src/LEAmDNS.h index 3fc4dd98da..3f04799595 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS.h +++ b/libraries/ESP8266mDNS/src/LEAmDNS.h @@ -167,6 +167,10 @@ namespace MDNSImplementation Default timeout for static service queries */ #define MDNS_QUERYSERVICES_WAIT_TIME 1000 +/* + Default timeout for static host queries +*/ +#define MDNS_QUERYHOST_WAIT_TIME 2000 /* Timeout for udpContext->sendtimeout() @@ -312,6 +316,19 @@ namespace MDNSImplementation hMDNSTxt addDynamicServiceTxt(hMDNSService p_hService, const char* p_pcKey, int8_t p_i8Value); +#ifdef MDNS_IP4_SUPPORT + // Resolve a host name using an mDNS A query. + // The ".local" suffix is appended automatically. + IPAddress queryHost(const char* p_pcHostname, + const uint32_t p_u32Timeout = MDNS_QUERYHOST_WAIT_TIME); + + IPAddress queryHost(const String& p_strHostname, + const uint32_t p_u32Timeout = MDNS_QUERYHOST_WAIT_TIME) + { + return queryHost(p_strHostname.c_str(), p_u32Timeout); + } +#endif + // Perform a (static) service query. The function returns after p_u16Timeout milliseconds // The answers (the number of received answers is returned) can be retrieved by calling // - answerHostname (or hostname) From 7653bbbaabadaed5d6448de0d02afd99c4acb3ee Mon Sep 17 00:00:00 2001 From: Gabriel Ortiz Lour Date: Thu, 10 Sep 2026 17:36:31 -0300 Subject: [PATCH 2/2] mDNS : fix clang-format --- libraries/ESP8266mDNS/src/LEAmDNS.cpp | 28 ++++++++++++--------------- libraries/ESP8266mDNS/src/LEAmDNS.h | 4 ++-- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/libraries/ESP8266mDNS/src/LEAmDNS.cpp b/libraries/ESP8266mDNS/src/LEAmDNS.cpp index 0f978f54d3..5ecc497a60 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS.cpp +++ b/libraries/ESP8266mDNS/src/LEAmDNS.cpp @@ -676,9 +676,8 @@ namespace MDNSImplementation MDNSResponder::queryHost Perform a blocking mDNS A query for a host. */ - IPAddress - MDNSResponder::queryHost(const char* p_pcHostname, - const uint32_t p_u32Timeout /*= MDNS_QUERYHOST_WAIT_TIME*/) + IPAddress MDNSResponder::queryHost(const char* p_pcHostname, + const uint32_t p_u32Timeout /*= MDNS_QUERYHOST_WAIT_TIME*/) { if (0 == m_pUDPContext) { @@ -686,23 +685,21 @@ namespace MDNSImplementation return IPAddress(); } - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P( - PSTR("[MDNSResponder] queryHost '%s'\n"), (p_pcHostname ?: "-"));); + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] queryHost '%s'\n"), + (p_pcHostname ?: "-"));); IPAddress result; stcMDNSServiceQuery* pServiceQuery = 0; - stcMDNS_RRDomain hostDomain; + stcMDNS_RRDomain hostDomain; if ((p_pcHostname) && (os_strlen(p_pcHostname)) && (p_u32Timeout) - && (_removeLegacyServiceQuery()) - && (_buildDomainForHost(p_pcHostname, hostDomain)) + && (_removeLegacyServiceQuery()) && (_buildDomainForHost(p_pcHostname, hostDomain)) && ((pServiceQuery = _allocServiceQuery()))) { pServiceQuery->m_bLegacyQuery = true; - stcMDNSServiceQuery::stcAnswer* pAnswer = - new stcMDNSServiceQuery::stcAnswer; + stcMDNSServiceQuery::stcAnswer* pAnswer = new stcMDNSServiceQuery::stcAnswer; if (pAnswer) { @@ -721,16 +718,15 @@ namespace MDNSImplementation { delay(1); - const stcMDNSServiceQuery::stcAnswer::stcIP4Address* pIP4Address = - pAnswer->IP4AddressAtIndex(0); + const stcMDNSServiceQuery::stcAnswer::stcIP4Address* pIP4Address + = pAnswer->IP4AddressAtIndex(0); if (pIP4Address) { result = pIP4Address->m_IPAddress; break; } - } - while ((millis() - start) < p_u32Timeout); + } while ((millis() - start) < p_u32Timeout); } } @@ -742,8 +738,8 @@ namespace MDNSImplementation if (pServiceQuery) _removeServiceQuery(pServiceQuery); - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P( - PSTR("[MDNSResponder] queryHost: INVALID input data!\n"));); + DEBUG_EX_ERR( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] queryHost: INVALID input data!\n"));); } return result; diff --git a/libraries/ESP8266mDNS/src/LEAmDNS.h b/libraries/ESP8266mDNS/src/LEAmDNS.h index 3f04799595..0ea2b13914 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS.h +++ b/libraries/ESP8266mDNS/src/LEAmDNS.h @@ -319,10 +319,10 @@ namespace MDNSImplementation #ifdef MDNS_IP4_SUPPORT // Resolve a host name using an mDNS A query. // The ".local" suffix is appended automatically. - IPAddress queryHost(const char* p_pcHostname, + IPAddress queryHost(const char* p_pcHostname, const uint32_t p_u32Timeout = MDNS_QUERYHOST_WAIT_TIME); - IPAddress queryHost(const String& p_strHostname, + IPAddress queryHost(const String& p_strHostname, const uint32_t p_u32Timeout = MDNS_QUERYHOST_WAIT_TIME) { return queryHost(p_strHostname.c_str(), p_u32Timeout);