dnssd_service_get_ip: return NULL if IP address isn't exist 87/267987/3 accepted/tizen/unified/20211216.155905 submit/tizen/20211214.073937
authorSeonah Moon <seonah1.moon@samsung.com>
Tue, 14 Dec 2021 07:12:08 +0000 (16:12 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Tue, 14 Dec 2021 07:37:29 +0000 (16:37 +0900)
Change-Id: I7e84cfc1ef4ff8a225457f151eb1d159f54fc6d9

packaging/capi-network-nsd.spec
src/dns-sd/dns-sd-util.h
src/dns-sd/dns-sd.c
tests/dns-sd-test.c

index 73737bfc4e8b354e1d8f415ca6d2a8e20c97a1ca..63b88f061147f7086c76900febe2ca5e3e950b9d 100644 (file)
@@ -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
index e2af923a572226ad2601feefcd5d7bc8d432552a..329b92bc212babc1ac446f382b07acaefd5d5212 100644 (file)
@@ -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;
index aaf51853bbb1916b6d0cb4f9425e094a42d6d6ce..333064e469feee31c87d6707d83f774edc7186b1 100644 (file)
@@ -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__;
index 014eb0433a2a0b025a8b59340e9441242177d253..84902ba53d7a594558bf0a304cd39ca04df20088 100644 (file)
@@ -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)