diff options
-rw-r--r-- | login-utils/login.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/login-utils/login.c b/login-utils/login.c index 64b41f4eb..9bc1bd9c4 100644 --- a/login-utils/login.c +++ b/login-utils/login.c @@ -1088,8 +1088,15 @@ static void init_remote_info(struct login_context *cxt, char *remotehost) } else if (info->ai_family == AF_INET6) { struct sockaddr_in6 *sa = (struct sockaddr_in6 *) info->ai_addr; +#ifdef IN6_IS_ADDR_V4MAPPED + if (IN6_IS_ADDR_V4MAPPED(&sa->sin6_addr)) { + const uint8_t *bytes = sa->sin6_addr.s6_addr; + struct in_addr addr = { *(const in_addr_t *) (bytes + 12) }; - memcpy(cxt->hostaddress, &(sa->sin6_addr), sizeof(sa->sin6_addr)); + memcpy(cxt->hostaddress, &addr, sizeof(struct in_addr)); + } else +#endif + memcpy(cxt->hostaddress, &(sa->sin6_addr), sizeof(sa->sin6_addr)); } freeaddrinfo(info); } |