Skip to content

Commit 7b1c4c2

Browse files
committed
session client REFACTOR ip address str print function
1 parent 9bca73d commit 7b1c4c2

File tree

1 file changed

+51
-46
lines changed

1 file changed

+51
-46
lines changed

src/session_client.c

Lines changed: 51 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)