Net thread-safe ntoa functions

Apply suggestions from code review

Co-authored-by: Petro Karashchenko <petro.karashchenko@gmail.com>
This commit is contained in:
Peter van der Perk 2022-08-01 11:17:23 +02:00 committed by Xiang Xiao
parent 17d7f5006f
commit 013a562478
6 changed files with 67 additions and 21 deletions

View file

@ -2022,7 +2022,10 @@ static enum pkt_type_e gs2200m_send_bulk(FAR struct gs2200m_dev_s *dev,
}
else
{
wlinfo("** addr=%s port=%d\n", inet_ntoa(msg->addr.sin_addr),
char inetaddr[INET_ADDRSTRLEN];
wlinfo("** addr=%s port=%d\n",
inet_ntoa_r(msg->addr.sin_addr, inetaddr, sizeof(inetaddr)),
NTOHS(msg->addr.sin_port));
/* NOTE: See 7.5.3.2 Bulk Data Handling for UDP
@ -2031,7 +2034,8 @@ static enum pkt_type_e gs2200m_send_bulk(FAR struct gs2200m_dev_s *dev,
snprintf(cmd, sizeof(cmd), "%cY%c%s:%d:%s",
ASCII_ESC, msg->cid,
inet_ntoa(msg->addr.sin_addr), NTOHS(msg->addr.sin_port),
inet_ntoa_r(msg->addr.sin_addr, inetaddr, sizeof(inetaddr)),
NTOHS(msg->addr.sin_port),
digits);
}
@ -2937,12 +2941,16 @@ static int gs2200m_ioctl_ifreq(FAR struct gs2200m_dev_s *dev,
if (false == getreq && OK == ret)
{
char inetaddr[INET_ADDRSTRLEN];
memcpy(&in[0], &dev->net_dev.d_ipaddr, sizeof(in[0]));
memcpy(&in[1], &dev->net_dev.d_netmask, sizeof(in[1]));
memcpy(&in[2], &dev->net_dev.d_draddr, sizeof(in[2]));
strncpy(addr[0], inet_ntoa(in[0]), sizeof(addr[0]));
strncpy(addr[1], inet_ntoa(in[1]), sizeof(addr[1]));
strncpy(addr[2], inet_ntoa(in[2]), sizeof(addr[2]));
strncpy(addr[0], inet_ntoa_r(in[0], inetaddr, sizeof(inetaddr)),
sizeof(addr[0]));
strncpy(addr[1], inet_ntoa_r(in[1], inetaddr, sizeof(inetaddr)),
sizeof(addr[1]));
strncpy(addr[2], inet_ntoa_r(in[2], inetaddr, sizeof(inetaddr)),
sizeof(addr[2]));
gs2200m_set_addresses(dev, addr[0], addr[1], addr[2]);
}

View file

@ -50,6 +50,7 @@ in_addr_t inet_addr(FAR const char *cp);
in_addr_t inet_network(FAR const char *cp);
FAR char *inet_ntoa(struct in_addr in);
FAR char *inet_ntoa_r(struct in_addr in, FAR char *buf, size_t bufflen);
in_addr_t inet_lnaof(struct in_addr in);
in_addr_t inet_netof(struct in_addr in);

View file

@ -50,6 +50,7 @@ extern "C"
#endif
FAR char *ether_ntoa(FAR const struct ether_addr *addr);
FAR char *ether_ntoa_r(FAR const struct ether_addr *addr, FAR char *buf);
FAR struct ether_addr *ether_aton(FAR const char *asc);
int ether_ntohost(FAR char *hostname, FAR const struct ether_addr *addr);
int ether_hostton(FAR const char *hostname, FAR struct ether_addr *addr);

View file

@ -32,6 +32,25 @@
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: ether_ntoa_r
*
* Description:
* The ether_ntoa_r() function converts the Ethernet host address addr
* given in network byte order to a string in standard
* hex-digits-and-colons notation.
*
****************************************************************************/
FAR char *ether_ntoa_r(FAR const struct ether_addr *addr, FAR char *buf)
{
sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x",
addr->ether_addr_octet[0], addr->ether_addr_octet[1],
addr->ether_addr_octet[2], addr->ether_addr_octet[3],
addr->ether_addr_octet[4], addr->ether_addr_octet[5]);
return buf;
}
/****************************************************************************
* Name: ether_ntoa
*
@ -46,9 +65,5 @@
FAR char *ether_ntoa(FAR const struct ether_addr *addr)
{
static char buffer[20];
sprintf(buffer, "%02x:%02x:%02x:%02x:%02x:%02x",
addr->ether_addr_octet[0], addr->ether_addr_octet[1],
addr->ether_addr_octet[2], addr->ether_addr_octet[3],
addr->ether_addr_octet[4], addr->ether_addr_octet[5]);
return buffer;
return ether_ntoa_r(addr, buffer);
}

View file

@ -35,6 +35,23 @@
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: inet_ntoa_r
*
* Description:
* The inet_ntoa_r() function converts the Internet host address given in
* network byte order to a string in standard numbers-and-dots notation.
*
****************************************************************************/
FAR char *inet_ntoa_r(struct in_addr in, FAR char *buf, size_t bufflen)
{
FAR unsigned char *ptr = (FAR unsigned char *)&in.s_addr;
snprintf(buf, bufflen, "%u.%u.%u.%u",
ptr[0], ptr[1], ptr[2], ptr[3]);
return buf;
}
/****************************************************************************
* Name: inet_ntoa
*
@ -48,11 +65,8 @@
FAR char *inet_ntoa(struct in_addr in)
{
static char buffer[INET_ADDRSTRLEN + 2];
FAR unsigned char *ptr = (FAR unsigned char *)&in.s_addr;
snprintf(buffer, INET_ADDRSTRLEN + 2, "%u.%u.%u.%u",
ptr[0], ptr[1], ptr[2], ptr[3]);
return buffer;
static char buffer[INET_ADDRSTRLEN];
return inet_ntoa_r(in, buffer, sizeof(buffer));
}
#endif /* CONFIG_NET_IPv4 || CONFIG_LIBC_IPv4_ADDRCONV */

View file

@ -194,9 +194,13 @@ static int netprocfs_linklayer(FAR struct netprocfs_file_s *netfile)
#if defined(CONFIG_NET_ETHERNET) || defined(CONFIG_DRIVERS_IEEE80211)
case NET_LL_ETHERNET:
case NET_LL_IEEE80211:
len += snprintf(&netfile->line[len], NET_LINELEN - len,
"%s\tLink encap:Ethernet HWaddr %s",
dev->d_ifname, ether_ntoa(&dev->d_mac.ether));
{
char hwaddr[20];
len += snprintf(&netfile->line[len], NET_LINELEN - len,
"%s\tLink encap:Ethernet HWaddr %s",
dev->d_ifname,
ether_ntoa_r(&dev->d_mac.ether, hwaddr));
}
break;
#endif
@ -258,6 +262,7 @@ static int netprocfs_inet4addresses(FAR struct netprocfs_file_s *netfile)
FAR struct net_driver_s *dev;
struct in_addr addr;
int len = 0;
char inetaddr[INET_ADDRSTRLEN];
DEBUGASSERT(netfile != NULL && netfile->dev != NULL);
dev = netfile->dev;
@ -266,13 +271,15 @@ static int netprocfs_inet4addresses(FAR struct netprocfs_file_s *netfile)
addr.s_addr = dev->d_ipaddr;
len += snprintf(&netfile->line[len], NET_LINELEN - len,
"\tinet addr:%s ", inet_ntoa(addr));
"\tinet addr:%s ", inet_ntoa_r(addr, inetaddr,
sizeof(inetaddr)));
/* Show the IPv4 default router address */
addr.s_addr = dev->d_draddr;
len += snprintf(&netfile->line[len], NET_LINELEN - len,
"DRaddr:%s ", inet_ntoa(addr));
"DRaddr:%s ", inet_ntoa_r(addr, inetaddr,
sizeof(inetaddr)));
/* Show the IPv4 network mask */
@ -283,7 +290,7 @@ static int netprocfs_inet4addresses(FAR struct netprocfs_file_s *netfile)
#else
"Mask:%s\n\n", /* Double space at end of device description */
#endif
inet_ntoa(addr));
inet_ntoa_r(addr, inetaddr, sizeof(inetaddr)));
return len;
}