diff options
Diffstat (limited to 'canohost.c')
-rw-r--r-- | canohost.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/canohost.c b/canohost.c index a457d3c52..941db23b6 100644 --- a/canohost.c +++ b/canohost.c | |||
@@ -12,7 +12,7 @@ | |||
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include "includes.h" | 14 | #include "includes.h" |
15 | RCSID("$OpenBSD: canohost.c,v 1.34 2002/09/23 20:46:27 stevesk Exp $"); | 15 | RCSID("$OpenBSD: canohost.c,v 1.35 2002/11/26 02:38:54 stevesk Exp $"); |
16 | 16 | ||
17 | #include "packet.h" | 17 | #include "packet.h" |
18 | #include "xmalloc.h" | 18 | #include "xmalloc.h" |
@@ -38,7 +38,7 @@ get_remote_hostname(int socket, int verify_reverse_mapping) | |||
38 | /* Get IP address of client. */ | 38 | /* Get IP address of client. */ |
39 | fromlen = sizeof(from); | 39 | fromlen = sizeof(from); |
40 | memset(&from, 0, sizeof(from)); | 40 | memset(&from, 0, sizeof(from)); |
41 | if (getpeername(socket, (struct sockaddr *) &from, &fromlen) < 0) { | 41 | if (getpeername(socket, (struct sockaddr *)&from, &fromlen) < 0) { |
42 | debug("getpeername failed: %.100s", strerror(errno)); | 42 | debug("getpeername failed: %.100s", strerror(errno)); |
43 | fatal_cleanup(); | 43 | fatal_cleanup(); |
44 | } | 44 | } |
@@ -59,11 +59,14 @@ get_remote_hostname(int socket, int verify_reverse_mapping) | |||
59 | memset(&from, 0, sizeof(from)); | 59 | memset(&from, 0, sizeof(from)); |
60 | 60 | ||
61 | from4->sin_family = AF_INET; | 61 | from4->sin_family = AF_INET; |
62 | fromlen = sizeof(*from4); | ||
62 | memcpy(&from4->sin_addr, &addr, sizeof(addr)); | 63 | memcpy(&from4->sin_addr, &addr, sizeof(addr)); |
63 | from4->sin_port = port; | 64 | from4->sin_port = port; |
64 | } | 65 | } |
65 | } | 66 | } |
66 | #endif | 67 | #endif |
68 | if (from.ss_family == AF_INET6) | ||
69 | fromlen = sizeof(struct sockaddr_in6); | ||
67 | 70 | ||
68 | if (getnameinfo((struct sockaddr *)&from, fromlen, ntop, sizeof(ntop), | 71 | if (getnameinfo((struct sockaddr *)&from, fromlen, ntop, sizeof(ntop), |
69 | NULL, 0, NI_NUMERICHOST) != 0) | 72 | NULL, 0, NI_NUMERICHOST) != 0) |
@@ -202,8 +205,8 @@ get_canonical_hostname(int verify_reverse_mapping) | |||
202 | } | 205 | } |
203 | 206 | ||
204 | /* | 207 | /* |
205 | * Returns the remote IP-address of socket as a string. The returned | 208 | * Returns the local/remote IP-address/hostname of socket as a string. |
206 | * string must be freed. | 209 | * The returned string must be freed. |
207 | */ | 210 | */ |
208 | static char * | 211 | static char * |
209 | get_socket_address(int socket, int remote, int flags) | 212 | get_socket_address(int socket, int remote, int flags) |
@@ -225,10 +228,15 @@ get_socket_address(int socket, int remote, int flags) | |||
225 | < 0) | 228 | < 0) |
226 | return NULL; | 229 | return NULL; |
227 | } | 230 | } |
231 | |||
232 | /* Work around Linux IPv6 weirdness */ | ||
233 | if (addr.ss_family == AF_INET6) | ||
234 | addrlen = sizeof(struct sockaddr_in6); | ||
235 | |||
228 | /* Get the address in ascii. */ | 236 | /* Get the address in ascii. */ |
229 | if (getnameinfo((struct sockaddr *)&addr, addrlen, ntop, sizeof(ntop), | 237 | if (getnameinfo((struct sockaddr *)&addr, addrlen, ntop, sizeof(ntop), |
230 | NULL, 0, flags) != 0) { | 238 | NULL, 0, flags) != 0) { |
231 | error("get_socket_ipaddr: getnameinfo %d failed", flags); | 239 | error("get_socket_address: getnameinfo %d failed", flags); |
232 | return NULL; | 240 | return NULL; |
233 | } | 241 | } |
234 | return xstrdup(ntop); | 242 | return xstrdup(ntop); |
@@ -314,11 +322,16 @@ get_sock_port(int sock, int local) | |||
314 | return 0; | 322 | return 0; |
315 | } | 323 | } |
316 | } else { | 324 | } else { |
317 | if (getpeername(sock, (struct sockaddr *) & from, &fromlen) < 0) { | 325 | if (getpeername(sock, (struct sockaddr *)&from, &fromlen) < 0) { |
318 | debug("getpeername failed: %.100s", strerror(errno)); | 326 | debug("getpeername failed: %.100s", strerror(errno)); |
319 | fatal_cleanup(); | 327 | fatal_cleanup(); |
320 | } | 328 | } |
321 | } | 329 | } |
330 | |||
331 | /* Work around Linux IPv6 weirdness */ | ||
332 | if (from.ss_family == AF_INET6) | ||
333 | fromlen = sizeof(struct sockaddr_in6); | ||
334 | |||
322 | /* Return port number. */ | 335 | /* Return port number. */ |
323 | if (getnameinfo((struct sockaddr *)&from, fromlen, NULL, 0, | 336 | if (getnameinfo((struct sockaddr *)&from, fromlen, NULL, 0, |
324 | strport, sizeof(strport), NI_NUMERICSERV) != 0) | 337 | strport, sizeof(strport), NI_NUMERICSERV) != 0) |