@@ -5561,6 +5561,17 @@ esp_err_t mdns_hostname_set(const char *hostname)
5561
5561
return ESP_OK ;
5562
5562
}
5563
5563
5564
+ esp_err_t mdns_hostname_get (char * hostname )
5565
+ {
5566
+ if (!_mdns_server || !hostname ) {
5567
+ return ESP_ERR_INVALID_ARG ;
5568
+ }
5569
+ MDNS_SERVICE_LOCK ();
5570
+ strncpy (hostname , _mdns_server -> hostname , strnlen (_mdns_server -> hostname , MDNS_NAME_BUF_LEN ));
5571
+ MDNS_SERVICE_UNLOCK ();
5572
+ return ESP_OK ;
5573
+ }
5574
+
5564
5575
esp_err_t mdns_delegate_hostname_add (const char * hostname , const mdns_ip_addr_t * address_list )
5565
5576
{
5566
5577
if (!_mdns_server ) {
@@ -5798,7 +5809,7 @@ static mdns_ip_addr_t *_copy_delegated_host_address_list(char *hostname)
5798
5809
return NULL ;
5799
5810
}
5800
5811
5801
- static mdns_result_t * _mdns_lookup_delegated_service (const char * instance , const char * service , const char * proto , size_t max_results )
5812
+ static mdns_result_t * _mdns_lookup_service (const char * instance , const char * service , const char * proto , size_t max_results , bool selfhost )
5802
5813
{
5803
5814
if (_str_null_or_empty (service ) || _str_null_or_empty (proto )) {
5804
5815
return NULL ;
@@ -5808,7 +5819,13 @@ static mdns_result_t *_mdns_lookup_delegated_service(const char *instance, const
5808
5819
mdns_srv_item_t * s = _mdns_server -> services ;
5809
5820
while (s ) {
5810
5821
mdns_service_t * srv = s -> service ;
5811
- if (srv && srv -> hostname && (_str_null_or_empty (_mdns_server -> hostname ) || strcmp (_mdns_server -> hostname , srv -> hostname ) != 0 )) {
5822
+ if (!srv || !srv -> hostname ) {
5823
+ s = s -> next ;
5824
+ continue ;
5825
+ }
5826
+ bool is_service_selfhosted = !_str_null_or_empty (_mdns_server -> hostname ) && !strcasecmp (_mdns_server -> hostname , srv -> hostname );
5827
+ bool is_service_delegated = _str_null_or_empty (_mdns_server -> hostname ) || strcasecmp (_mdns_server -> hostname , srv -> hostname );
5828
+ if ((selfhost && is_service_selfhosted ) || (!selfhost && is_service_delegated )) {
5812
5829
if (!strcasecmp (srv -> service , service ) && !strcasecmp (srv -> proto , proto ) &&
5813
5830
(_str_null_or_empty (instance ) || _mdns_instance_name_match (srv -> instance , instance ))) {
5814
5831
mdns_result_t * item = (mdns_result_t * )malloc (sizeof (mdns_result_t ));
@@ -5819,7 +5836,7 @@ static mdns_result_t *_mdns_lookup_delegated_service(const char *instance, const
5819
5836
item -> next = results ;
5820
5837
results = item ;
5821
5838
item -> esp_netif = NULL ;
5822
- item -> ttl = UINT32_MAX ;
5839
+ item -> ttl = _str_null_or_empty ( instance ) ? MDNS_ANSWER_PTR_TTL : MDNS_ANSWER_SRV_TTL ;
5823
5840
item -> ip_protocol = MDNS_IP_PROTOCOL_MAX ;
5824
5841
item -> instance_name = strndup (srv -> instance , MDNS_NAME_BUF_LEN - 1 );
5825
5842
if (!item -> instance_name ) {
@@ -5843,9 +5860,14 @@ static mdns_result_t *_mdns_lookup_delegated_service(const char *instance, const
5843
5860
}
5844
5861
item -> port = srv -> port ;
5845
5862
item -> txt = _copy_mdns_txt_items (srv -> txt , & (item -> txt_value_len ), & (item -> txt_count ));
5846
- item -> addr = _copy_delegated_host_address_list (item -> hostname );
5847
- if (!item -> addr ) {
5848
- goto handle_error ;
5863
+ // We should not append addresses for selfhost lookup result as we don't know which interface's address to append.
5864
+ if (selfhost ) {
5865
+ item -> addr = NULL ;
5866
+ } else {
5867
+ item -> addr = _copy_delegated_host_address_list (item -> hostname );
5868
+ if (!item -> addr ) {
5869
+ goto handle_error ;
5870
+ }
5849
5871
}
5850
5872
if (num_results < max_results ) {
5851
5873
num_results ++ ;
@@ -6344,7 +6366,22 @@ esp_err_t mdns_lookup_delegated_service(const char *instance, const char *servic
6344
6366
return ESP_ERR_INVALID_ARG ;
6345
6367
}
6346
6368
MDNS_SERVICE_LOCK ();
6347
- * result = _mdns_lookup_delegated_service (instance , service , proto , max_results );
6369
+ * result = _mdns_lookup_service (instance , service , proto , max_results , false);
6370
+ MDNS_SERVICE_UNLOCK ();
6371
+ return ESP_OK ;
6372
+ }
6373
+
6374
+ esp_err_t mdns_lookup_selfhosted_service (const char * instance , const char * service , const char * proto , size_t max_results ,
6375
+ mdns_result_t * * result )
6376
+ {
6377
+ if (!_mdns_server ) {
6378
+ return ESP_ERR_INVALID_STATE ;
6379
+ }
6380
+ if (!result || _str_null_or_empty (service ) || _str_null_or_empty (proto )) {
6381
+ return ESP_ERR_INVALID_ARG ;
6382
+ }
6383
+ MDNS_SERVICE_LOCK ();
6384
+ * result = _mdns_lookup_service (instance , service , proto , max_results , true);
6348
6385
MDNS_SERVICE_UNLOCK ();
6349
6386
return ESP_OK ;
6350
6387
}
0 commit comments