mirror of
https://github.com/yarrick/iodine.git
synced 2025-10-17 16:51:54 +00:00
IPv6: Create single way to format IP addresses
This commit is contained in:
25
src/common.c
25
src/common.c
@@ -113,6 +113,31 @@ check_superuser(void (*usage_fn)(void))
|
||||
#endif
|
||||
}
|
||||
|
||||
char *
|
||||
format_addr(struct sockaddr_storage *sockaddr, int sockaddr_len)
|
||||
{
|
||||
static char dst[INET6_ADDRSTRLEN + 1];
|
||||
|
||||
memset(dst, 0, sizeof(dst));
|
||||
if (sockaddr->ss_family == AF_INET && sockaddr_len >= sizeof(struct sockaddr_in)) {
|
||||
struct sockaddr_in *addr = (struct sockaddr_in *) sockaddr;
|
||||
inet_ntop(addr->sin_family, &addr->sin_addr, dst, sizeof(dst) - 1);
|
||||
} else if (sockaddr->ss_family == AF_INET6 && sockaddr_len >= sizeof(struct sockaddr_in6)) {
|
||||
struct sockaddr_in6 *addr = (struct sockaddr_in6 *) sockaddr;
|
||||
if (IN6_IS_ADDR_V4MAPPED(&addr->sin6_addr)) {
|
||||
struct in_addr ia;
|
||||
/* Get mapped v4 addr from last 32bit field */
|
||||
memcpy(&ia.s_addr, &addr->sin6_addr.s6_addr[12], sizeof(ia));
|
||||
inet_ntop(AF_INET, &ia, dst, sizeof(dst) - 1);
|
||||
} else {
|
||||
inet_ntop(addr->sin6_family, &addr->sin6_addr, dst, sizeof(dst) - 1);
|
||||
}
|
||||
} else {
|
||||
dst[0] = '?';
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
int
|
||||
get_addr(char *host, int port, int addr_family, int flags, struct sockaddr_storage *out)
|
||||
{
|
||||
|
Reference in New Issue
Block a user