From: Seonah Moon Date: Tue, 14 Dec 2021 07:12:08 +0000 (+0900) Subject: dnssd_service_get_ip: return NULL if IP address isn't exist X-Git-Tag: submit/tizen/20211214.073937^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0ce129a9f08fc3bdf3e135abf9ed9264a55752df;p=platform%2Fcore%2Fapi%2Fnsd.git dnssd_service_get_ip: return NULL if IP address isn't exist Change-Id: I7e84cfc1ef4ff8a225457f151eb1d159f54fc6d9 --- diff --git a/packaging/capi-network-nsd.spec b/packaging/capi-network-nsd.spec index 73737bf..63b88f0 100644 --- a/packaging/capi-network-nsd.spec +++ b/packaging/capi-network-nsd.spec @@ -1,6 +1,6 @@ Name: capi-network-nsd Summary: A Network Service Discovery libraries in Native API -Version: 0.1.7 +Version: 0.2.0 Release: 1 Group: System/Network License: Apache-2.0 diff --git a/src/dns-sd/dns-sd-util.h b/src/dns-sd/dns-sd-util.h index e2af923..329b92b 100644 --- a/src/dns-sd/dns-sd-util.h +++ b/src/dns-sd/dns-sd-util.h @@ -107,8 +107,8 @@ typedef struct _dnssd_found_data_s { char *host; int port; unsigned int if_index; - unsigned char ip_v4_addr[IPV4_LEN]; - unsigned char ip_v6_addr[IPV6_LEN]; + unsigned char *ip_v4_addr; + unsigned char *ip_v6_addr; union { dnssd_found_cb found_cb; dnssd_resolved_cb resolved_cb; diff --git a/src/dns-sd/dns-sd.c b/src/dns-sd/dns-sd.c index aaf5185..333064e 100644 --- a/src/dns-sd/dns-sd.c +++ b/src/dns-sd/dns-sd.c @@ -1147,15 +1147,26 @@ static void __update_found_address(const struct sockaddr *address, dnssd_found_d if (address->sa_family == AF_INET) { const unsigned char *addr = - (const unsigned char *) & - ((struct sockaddr_in *)address)->sin_addr; - memcpy(&(found->ip_v4_addr), addr, IPV4_LEN); + (const unsigned char *)&((struct sockaddr_in *)address)->sin_addr; + + g_free(found->ip_v4_addr); + + found->ip_v4_addr = g_try_malloc0(IPV4_LEN); + if (!found->ip_v4_addr) + return; + + memcpy(found->ip_v4_addr, addr, IPV4_LEN); } else if (address->sa_family == AF_INET6) { - const struct sockaddr_in6 *s6 = - (const struct sockaddr_in6 *)address; - const unsigned char *addr = - (const unsigned char *)&s6->sin6_addr; - memcpy(&(found->ip_v6_addr), addr, IPV6_LEN); + const struct sockaddr_in6 *s6 = (const struct sockaddr_in6 *)address; + const unsigned char *addr = (const unsigned char *)&s6->sin6_addr; + + g_free(found->ip_v6_addr); + + found->ip_v6_addr = g_try_malloc0(IPV6_LEN); + if (!found->ip_v6_addr) + return; + + memcpy(found->ip_v6_addr, addr, IPV6_LEN); } } @@ -1759,6 +1770,8 @@ static void __dnssd_remove_found_service(gpointer data, gpointer user_data) g_free(found_data->service_name); g_free(found_data->host); g_free(found_data->txt_record); + g_free(found_data->ip_v4_addr); + g_free(found_data->ip_v6_addr); g_free(found_handle); __DNSSD_LOG_FUNC_EXIT__; @@ -1915,13 +1928,57 @@ EXPORT_API int dnssd_service_get_name(dnssd_service_h dnssd_service, char **serv return DNSSD_ERROR_NONE; } +static void _extract_ipv4_address(dnssd_found_data_s *found_data, char **ip_v4_address) +{ + if (!found_data) + return; + + if (!ip_v4_address) + return; + + if (!found_data->ip_v4_addr) { + *ip_v4_address = NULL; + DNSSD_LOGE("ipv4 address isn't exist."); + return; + } + + unsigned char *addr = found_data->ip_v4_addr; + *ip_v4_address = g_strdup_printf("%d.%d.%d.%d", + addr[0], addr[1], addr[2], addr[3]); +} + +static void _extract_ipv6_address(dnssd_found_data_s *found_data, char **ip_v6_address) +{ + if (!found_data) + return; + + if (!ip_v6_address) + return; + + if (!found_data->ip_v6_addr) { + *ip_v6_address = NULL; + DNSSD_LOGE("ipv6 address isn't exist."); + return; + } + + unsigned char *addr = found_data->ip_v6_addr; + *ip_v6_address = g_strdup_printf("%02X%02X:" + "%02X%02X:%02X%02X:%02X%02X:" + "%02X%02X:%02X%02X:%02X%02X:" + "%02X%02X", addr[0], addr[1], + addr[2], addr[3], addr[4], + addr[5], addr[6], addr[7], + addr[8], addr[9], addr[10], + addr[11], addr[12], addr[14], + addr[14], addr[15]); +} + EXPORT_API int dnssd_service_get_ip(dnssd_service_h dnssd_service, char **ip_v4_address, char **ip_v6_address) { __DNSSD_LOG_FUNC_ENTER__; dnssd_handle_s *local_handle = NULL; dnssd_found_data_s *found = NULL; - unsigned char *addr = NULL; int res; CHECK_FEATURE_SUPPORTED(NETWORK_SERVICE_DISCOVERY_FEATURE); @@ -1950,25 +2007,8 @@ EXPORT_API int dnssd_service_get_ip(dnssd_service_h dnssd_service, char **ip_v4_ } found = GET_FOUND_DATA_P(local_handle); - - if (ip_v4_address) { - addr = found->ip_v4_addr; - *ip_v4_address = g_strdup_printf("%d.%d.%d.%d", - addr[0], addr[1], addr[2], addr[3]); - } - - if (ip_v6_address) { - addr = found->ip_v6_addr; - *ip_v6_address = g_strdup_printf("%02X%02X:" - "%02X%02X:%02X%02X:%02X%02X:" - "%02X%02X:%02X%02X:%02X%02X:" - "%02X%02X", addr[0], addr[1], - addr[2], addr[3], addr[4], - addr[5], addr[6], addr[7], - addr[8], addr[9], addr[10], - addr[11], addr[12], addr[14], - addr[14], addr[15]); - } + _extract_ipv4_address(found, ip_v4_address); + _extract_ipv6_address(found, ip_v6_address); DNSSD_UNLOCK; __DNSSD_LOG_FUNC_EXIT__; diff --git a/tests/dns-sd-test.c b/tests/dns-sd-test.c index 014eb04..84902ba 100644 --- a/tests/dns-sd-test.c +++ b/tests/dns-sd-test.c @@ -571,6 +571,7 @@ static void MenuScreen() printf("| 8 - Remove Registered Record |\n"); printf("| 9 - Browse DNS Service |\n"); printf("| a - Stop Browse DNS Service |\n"); + printf("| b - Get service IP address |\n"); printf("|___________________________________|\n"); } @@ -627,6 +628,9 @@ int test_thread(GIOChannel *source, GIOCondition condition, gpointer data) case 'a': rv = test_dnssd_stop_browsing_service(); break; + case 'b': + rv = test_dnssd_service_get_ip(); + break; } if (rv == 1)