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);
}
}
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__;
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);
}
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__;