mirror of
https://gitlab.com/chrony/chrony.git
synced 2025-12-03 21:15:07 -05:00
util: move and improve sockaddr-specific functions
Move the functions to socket.c and improve them to require and check the sockaddr length.
This commit is contained in:
80
util.c
80
util.c
@@ -492,86 +492,6 @@ UTI_CompareIPs(IPAddr *a, IPAddr *b, IPAddr *mask)
|
||||
|
||||
/* ================================================== */
|
||||
|
||||
void
|
||||
UTI_SockaddrToIPAndPort(struct sockaddr *sa, IPAddr *ip, unsigned short *port)
|
||||
{
|
||||
switch (sa->sa_family) {
|
||||
case AF_INET:
|
||||
ip->family = IPADDR_INET4;
|
||||
ip->addr.in4 = ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr);
|
||||
*port = ntohs(((struct sockaddr_in *)sa)->sin_port);
|
||||
break;
|
||||
#ifdef FEAT_IPV6
|
||||
case AF_INET6:
|
||||
ip->family = IPADDR_INET6;
|
||||
memcpy(ip->addr.in6, ((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr,
|
||||
sizeof (ip->addr.in6));
|
||||
*port = ntohs(((struct sockaddr_in6 *)sa)->sin6_port);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
ip->family = IPADDR_UNSPEC;
|
||||
*port = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* ================================================== */
|
||||
|
||||
int
|
||||
UTI_IPAndPortToSockaddr(IPAddr *ip, unsigned short port, struct sockaddr *sa)
|
||||
{
|
||||
switch (ip->family) {
|
||||
case IPADDR_INET4:
|
||||
memset(sa, 0, sizeof (struct sockaddr_in));
|
||||
sa->sa_family = AF_INET;
|
||||
((struct sockaddr_in *)sa)->sin_addr.s_addr = htonl(ip->addr.in4);
|
||||
((struct sockaddr_in *)sa)->sin_port = htons(port);
|
||||
#ifdef SIN6_LEN
|
||||
((struct sockaddr_in *)sa)->sin_len = sizeof (struct sockaddr_in);
|
||||
#endif
|
||||
return sizeof (struct sockaddr_in);
|
||||
#ifdef FEAT_IPV6
|
||||
case IPADDR_INET6:
|
||||
memset(sa, 0, sizeof (struct sockaddr_in6));
|
||||
sa->sa_family = AF_INET6;
|
||||
memcpy(((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr, ip->addr.in6,
|
||||
sizeof (ip->addr.in6));
|
||||
((struct sockaddr_in6 *)sa)->sin6_port = htons(port);
|
||||
#ifdef SIN6_LEN
|
||||
((struct sockaddr_in6 *)sa)->sin6_len = sizeof (struct sockaddr_in6);
|
||||
#endif
|
||||
return sizeof (struct sockaddr_in6);
|
||||
#endif
|
||||
default:
|
||||
memset(sa, 0, sizeof (struct sockaddr));
|
||||
sa->sa_family = AF_UNSPEC;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* ================================================== */
|
||||
|
||||
const char *
|
||||
UTI_SockaddrFamilyToString(int family)
|
||||
{
|
||||
switch (family) {
|
||||
case AF_INET:
|
||||
return "IPv4";
|
||||
#ifdef AF_INET6
|
||||
case AF_INET6:
|
||||
return "IPv6";
|
||||
#endif
|
||||
case AF_UNIX:
|
||||
return "Unix";
|
||||
case AF_UNSPEC:
|
||||
return "UNSPEC";
|
||||
default:
|
||||
return "?";
|
||||
}
|
||||
}
|
||||
|
||||
/* ================================================== */
|
||||
|
||||
char *
|
||||
UTI_IPSockAddrToString(IPSockAddr *sa)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user