summaryrefslogtreecommitdiff
path: root/canohost.c
diff options
context:
space:
mode:
Diffstat (limited to 'canohost.c')
-rw-r--r--canohost.c25
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"
15RCSID("$OpenBSD: canohost.c,v 1.34 2002/09/23 20:46:27 stevesk Exp $"); 15RCSID("$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 */
208static char * 211static char *
209get_socket_address(int socket, int remote, int flags) 212get_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)