@@ -1508,6 +1508,43 @@ nc_connect_unix(const char *address, struct ly_ctx *ctx)
15081508 return NULL ;
15091509}
15101510
1511+ /**
1512+ * @brief Convert socket IP address to string.
1513+ *
1514+ * @param[in] saddr Sockaddr to convert.
1515+ * @param[out] str_ip String IP address.
1516+ * @return 0 on success.
1517+ * @return -1 on error.
1518+ */
1519+ static int
1520+ nc_saddr2str (const struct sockaddr * saddr , char * * str_ip )
1521+ {
1522+ void * addr ;
1523+ socklen_t str_len ;
1524+
1525+ assert ((saddr -> sa_family == AF_INET ) || (saddr -> sa_family == AF_INET6 ));
1526+
1527+ str_len = (saddr -> sa_family == AF_INET ) ? INET_ADDRSTRLEN : INET6_ADDRSTRLEN ;
1528+ * str_ip = malloc (str_len );
1529+ if (!* str_ip ) {
1530+ ERRMEM ;
1531+ return -1 ;
1532+ }
1533+
1534+ if (saddr -> sa_family == AF_INET ) {
1535+ addr = & ((struct sockaddr_in * )& saddr )-> sin_addr ;
1536+ } else {
1537+ addr = & ((struct sockaddr_in6 * )& saddr )-> sin6_addr ;
1538+ }
1539+ if (!inet_ntop (saddr -> sa_family , addr , * str_ip , str_len )) {
1540+ ERR (NULL , "Converting host to IP address failed (%s)." , strerror (errno ));
1541+ free (* str_ip );
1542+ return -1 ;
1543+ }
1544+
1545+ return 0 ;
1546+ }
1547+
15111548/**
15121549 * @brief Try to connect a socket, optionally a pending one from a previous attempt.
15131550 *
@@ -1526,27 +1563,24 @@ sock_connect(int timeout_ms, int *sock_pending, struct addrinfo *res, struct nc_
15261563 fd_set wset ;
15271564 struct timeval ts ;
15281565 socklen_t len = sizeof (int );
1529- struct in_addr * addr ;
15301566 uint16_t port ;
1531- char str [ INET6_ADDRSTRLEN ] ;
1567+ char * str ;
15321568
15331569 if (sock_pending && (* sock_pending != -1 )) {
15341570 VRB (NULL , "Trying to connect the pending socket %d." , * sock_pending );
15351571 sock = * sock_pending ;
15361572 } else {
15371573 assert (res );
1574+ if (nc_saddr2str (res -> ai_addr , & str )) {
1575+ return -1 ;
1576+ }
15381577 if (res -> ai_family == AF_INET6 ) {
1539- addr = (struct in_addr * ) & ((struct sockaddr_in6 * )res -> ai_addr )-> sin6_addr ;
15401578 port = ntohs (((struct sockaddr_in6 * )res -> ai_addr )-> sin6_port );
15411579 } else {
1542- addr = & ((struct sockaddr_in * )res -> ai_addr )-> sin_addr ;
15431580 port = ntohs (((struct sockaddr_in * )res -> ai_addr )-> sin_port );
15441581 }
1545- if (!inet_ntop (res -> ai_family , addr , str , res -> ai_addrlen )) {
1546- WRN (NULL , "inet_ntop() failed (%s)." , strerror (errno ));
1547- } else {
1548- VRB (NULL , "Trying to connect via %s to %s:%u." , (res -> ai_family == AF_INET6 ) ? "IPv6" : "IPv4" , str , port );
1549- }
1582+ VRB (NULL , "Trying to connect via %s to %s:%u." , (res -> ai_family == AF_INET6 ) ? "IPv6" : "IPv4" , str , port );
1583+ free (str );
15501584
15511585 /* connect to a server */
15521586 sock = socket (res -> ai_family , res -> ai_socktype , res -> ai_protocol );
@@ -1632,10 +1666,11 @@ nc_sock_connect(const char *host, uint16_t port, int timeout_ms, struct nc_keepa
16321666 int i , opt ;
16331667 int sock = sock_pending ? * sock_pending : -1 ;
16341668 struct addrinfo hints , * res_list = NULL , * res ;
1635- char * buf , port_s [6 ]; /* length of string representation of short int */
1636- void * addr ;
1637- struct sockaddr saddr ;
1638- socklen_t addr_len ;
1669+ char port_s [6 ]; /* length of string representation of short int */
1670+ struct sockaddr_storage saddr ;
1671+ socklen_t addr_len = sizeof saddr ;
1672+
1673+ * ip_host = NULL ;
16391674
16401675 DBG (NULL , "nc_sock_connect(%s, %u, %d, %d)" , host , port , timeout_ms , sock );
16411676
@@ -1672,24 +1707,8 @@ nc_sock_connect(const char *host, uint16_t port, int timeout_ms, struct nc_keepa
16721707 goto error ;
16731708 }
16741709
1675- if (ip_host && ((res -> ai_family == AF_INET6 ) || (res -> ai_family == AF_INET ))) {
1676- buf = malloc (INET6_ADDRSTRLEN );
1677- if (!buf ) {
1678- ERRMEM ;
1679- goto error ;
1680- }
1681- if (res -> ai_family == AF_INET ) {
1682- addr = & ((struct sockaddr_in * )res -> ai_addr )-> sin_addr ;
1683- } else {
1684- addr = & ((struct sockaddr_in6 * )res -> ai_addr )-> sin6_addr ;
1685- }
1686- if (!inet_ntop (res -> ai_family , addr , buf , INET6_ADDRSTRLEN )) {
1687- ERR (NULL , "Converting host to IP address failed (%s)." , strerror (errno ));
1688- free (buf );
1689- goto error ;
1690- }
1691-
1692- * ip_host = buf ;
1710+ if (nc_saddr2str (res -> ai_addr , ip_host )) {
1711+ goto error ;
16931712 }
16941713 break ;
16951714 }
@@ -1706,23 +1725,9 @@ nc_sock_connect(const char *host, uint16_t port, int timeout_ms, struct nc_keepa
17061725 goto error ;
17071726 }
17081727
1709- buf = malloc (INET6_ADDRSTRLEN );
1710- if (!buf ) {
1711- ERRMEM ;
1728+ if (nc_saddr2str ((struct sockaddr * )& saddr , ip_host )) {
17121729 goto error ;
17131730 }
1714- if (saddr .sa_family == AF_INET ) {
1715- addr = & ((struct sockaddr_in * )& saddr )-> sin_addr ;
1716- } else {
1717- addr = & ((struct sockaddr_in6 * )& saddr )-> sin6_addr ;
1718- }
1719- if (!inet_ntop (saddr .sa_family , addr , buf , INET6_ADDRSTRLEN )) {
1720- ERR (NULL , "Converting host to IP address failed (%s)." , strerror (errno ));
1721- free (buf );
1722- goto error ;
1723- }
1724-
1725- * ip_host = buf ;
17261731 }
17271732 }
17281733
0 commit comments