use inet_ntop() and a temporary buffer, like it's done elsewhere for IPv6. Signed-off-by: Davide Caratti --- ell/acd.c | 5 +++-- ell/dhcp-lease.c | 3 ++- ell/dhcp-server.c | 11 +++++++---- ell/dhcp.c | 17 +++++++++++++++-- ell/rtnl.c | 7 +++++-- examples/https-server-test.c | 4 +++- 6 files changed, 35 insertions(+), 12 deletions(-) diff --git a/ell/acd.c b/ell/acd.c index 6989f82..e267a96 100644 --- a/ell/acd.c +++ b/ell/acd.c @@ -57,10 +57,11 @@ #define IP_STR(uint_ip) \ ({ \ + char _buf[INET_ADDRSTRLEN]; \ struct in_addr _in; \ - char *_out; \ + const char *_out; \ _in.s_addr = uint_ip; \ - _out = inet_ntoa(_in); \ + _out = inet_ntop(AF_INET, &_in, _buf, INET_ADDRSTRLEN) ?: "(inv)"; \ _out; \ }) diff --git a/ell/dhcp-lease.c b/ell/dhcp-lease.c index 44c815f..94b67b4 100644 --- a/ell/dhcp-lease.c +++ b/ell/dhcp-lease.c @@ -178,12 +178,13 @@ error: static inline char *get_ip(uint32_t ip) { struct in_addr addr; + char buf[INET_ADDRSTRLEN]; if (ip == 0) return NULL; addr.s_addr = ip; - return l_strdup(inet_ntoa(addr)); + return l_strdup(inet_ntop(AF_INET, &addr, buf, INET_ADDRSTRLEN)); } LIB_EXPORT char *l_dhcp_lease_get_address(const struct l_dhcp_lease *lease) diff --git a/ell/dhcp-server.c b/ell/dhcp-server.c index ebd4438..43f06b3 100644 --- a/ell/dhcp-server.c +++ b/ell/dhcp-server.c @@ -91,10 +91,11 @@ struct l_dhcp_server { #define IP_STR(uint_ip) \ ({ \ + char _buf[INET_ADDRSTRLEN]; \ struct in_addr _in; \ - char *_out; \ + const char *_out; \ _in.s_addr = uint_ip; \ - _out = inet_ntoa(_in); \ + _out = inet_ntop(AF_INET, &_in, _buf, INET_ADDRSTRLEN) ?: "(inv)"; \ _out; \ }) @@ -750,6 +751,7 @@ LIB_EXPORT void l_dhcp_server_destroy(struct l_dhcp_server *server) LIB_EXPORT bool l_dhcp_server_start(struct l_dhcp_server *server) { + char buf[INET_ADDRSTRLEN]; struct in_addr ia; if (unlikely(!server)) @@ -838,9 +840,10 @@ LIB_EXPORT bool l_dhcp_server_start(struct l_dhcp_server *server) ia.s_addr = server->address; /* In case of unit testing we don't want this to be a fatal error */ - if (!l_acd_start(server->acd, inet_ntoa(ia))) { + if (!inet_ntop(AF_INET, &ia, buf, INET_ADDRSTRLEN) || + !l_acd_start(server->acd, buf)) { SERVER_DEBUG("Failed to start ACD on %s, continuing without", - IP_STR(server->address)); + IP_STR(server->address)); l_acd_destroy(server->acd); server->acd = NULL; diff --git a/ell/dhcp.c b/ell/dhcp.c index a4afa95..d7809cb 100644 --- a/ell/dhcp.c +++ b/ell/dhcp.c @@ -55,6 +55,17 @@ #define BITS_PER_LONG (sizeof(unsigned long) * 8) +#define IP_STR(uint_ip) \ +({ \ + char _buf[INET_ADDRSTRLEN]; \ + struct in_addr _in; \ + const char *_out; \ + _in.s_addr = uint_ip; \ + _out = inet_ntop(AF_INET, &_in, _buf, INET_ADDRSTRLEN) ?: "(inv)"; \ + _out; \ +}) + + enum dhcp_state { DHCP_STATE_INIT, DHCP_STATE_SELECTING, @@ -778,6 +789,7 @@ static void dhcp_client_rx_message(const void *data, size_t len, void *userdata) struct l_dhcp_client *client = userdata; const struct dhcp_message *message = data; struct dhcp_message_iter iter; + char buf[INET_ADDRSTRLEN]; uint8_t msg_type = 0; uint8_t t, l; const void *v; @@ -911,9 +923,10 @@ static void dhcp_client_rx_message(const void *data, size_t len, void *userdata) ia.s_addr = client->lease->address; /* For unit testing we don't want this to be a fatal error */ - if (!l_acd_start(client->acd, inet_ntoa(ia))) { + if (!inet_ntop(AF_INET, &ia, buf, INET_ADDRSTRLEN) || + !l_acd_start(client->acd, buf)) { CLIENT_DEBUG("Failed to start ACD on %s, continuing", - inet_ntoa(ia)); + IP_STR(ia.s_addr)); l_acd_destroy(client->acd); client->acd = NULL; } diff --git a/ell/rtnl.c b/ell/rtnl.c index 957e749..82ad941 100644 --- a/ell/rtnl.c +++ b/ell/rtnl.c @@ -752,6 +752,7 @@ LIB_EXPORT uint32_t l_rtnl_set_powered(struct l_netlink *rtnl, int ifindex, LIB_EXPORT void l_rtnl_ifaddr4_extract(const struct ifaddrmsg *ifa, int bytes, char **label, char **ip, char **broadcast) { + char buf[INET_ADDRSTRLEN]; struct in_addr in_addr; struct rtattr *attr; @@ -763,7 +764,8 @@ LIB_EXPORT void l_rtnl_ifaddr4_extract(const struct ifaddrmsg *ifa, int bytes, break; in_addr = *((struct in_addr *) RTA_DATA(attr)); - *ip = l_strdup(inet_ntoa(in_addr)); + *ip = l_strdup(inet_ntop(AF_INET, &in_addr, buf, + INET_ADDRSTRLEN)); break; case IFA_BROADCAST: @@ -771,7 +773,8 @@ LIB_EXPORT void l_rtnl_ifaddr4_extract(const struct ifaddrmsg *ifa, int bytes, break; in_addr = *((struct in_addr *) RTA_DATA(attr)); - *broadcast = l_strdup(inet_ntoa(in_addr)); + *broadcast = l_strdup(inet_ntop(AF_INET, &in_addr, buf, + INET_ADDRSTRLEN)); break; case IFA_LABEL: diff --git a/examples/https-server-test.c b/examples/https-server-test.c index 6362722..ddf326c 100644 --- a/examples/https-server-test.c +++ b/examples/https-server-test.c @@ -199,12 +199,14 @@ int main(int argc, char *argv[]) https_tls_ready, https_tls_disconnected, NULL); if (getenv("TLS_DEBUG")) { + char b[INET_ADDRSTRLEN]; char *str; l_tls_set_debug(tls, https_tls_debug_cb, NULL, NULL); str = l_strdup_printf("/tmp/ell-certchain-%s.pem", - inet_ntoa(client_addr.sin_addr)); + inet_ntop(AF_INET, &client_addr.sin_addr, + b, INET_ADDRSTRLEN) ?: "NA"); l_tls_set_cert_dump_path(tls, str); l_free(str); } -- 2.31.1