]> andersk Git - openssh.git/blobdiff - canohost.c
- jmc@cvs.openbsd.org 2005/05/20 11:23:32
[openssh.git] / canohost.c
index 057f061b6aa51b5d31108974fedcfecd63cbfc04..94d666432f0e24403fe30a00926cb3918009d0b0 100644 (file)
@@ -12,7 +12,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: canohost.c,v 1.40 2004/06/21 17:36:31 avsm Exp $");
+RCSID("$OpenBSD: canohost.c,v 1.42 2005/02/18 03:05:53 djm Exp $");
 
 #include "packet.h"
 #include "xmalloc.h"
@@ -20,7 +20,6 @@ RCSID("$OpenBSD: canohost.c,v 1.40 2004/06/21 17:36:31 avsm Exp $");
 #include "canohost.h"
 
 static void check_ip_options(int, char *);
-static void ipv64_normalise_mapped(struct sockaddr_storage *, socklen_t *);
 
 /*
  * Return the canonical name of the host at the other end of the socket. The
@@ -166,7 +165,7 @@ check_ip_options(int sock, char *ipaddr)
 #endif /* IP_OPTIONS */
 }
 
-static void
+void
 ipv64_normalise_mapped(struct sockaddr_storage *addr, socklen_t *len)
 {
        struct sockaddr_in6 *a6 = (struct sockaddr_in6 *)addr;
@@ -232,6 +231,7 @@ get_socket_address(int sock, int remote, int flags)
        struct sockaddr_storage addr;
        socklen_t addrlen;
        char ntop[NI_MAXHOST];
+       int r;
 
        /* Get IP address of client. */
        addrlen = sizeof(addr);
@@ -251,10 +251,13 @@ get_socket_address(int sock, int remote, int flags)
        if (addr.ss_family == AF_INET6)
                addrlen = sizeof(struct sockaddr_in6);
 
+       ipv64_normalise_mapped(&addr, &addrlen);
+
        /* Get the address in ascii. */
-       if (getnameinfo((struct sockaddr *)&addr, addrlen, ntop, sizeof(ntop),
-           NULL, 0, flags) != 0) {
-               error("get_socket_address: getnameinfo %d failed", flags);
+       if ((r = getnameinfo((struct sockaddr *)&addr, addrlen, ntop,
+           sizeof(ntop), NULL, 0, flags)) != 0) {
+               error("get_socket_address: getnameinfo %d failed: %s", flags,
+                   r == EAI_SYSTEM ? strerror(errno) : gai_strerror(r));
                return NULL;
        }
        return xstrdup(ntop);
@@ -330,6 +333,7 @@ get_sock_port(int sock, int local)
        struct sockaddr_storage from;
        socklen_t fromlen;
        char strport[NI_MAXSERV];
+       int r;
 
        /* Get IP address of client. */
        fromlen = sizeof(from);
@@ -351,9 +355,10 @@ get_sock_port(int sock, int local)
                fromlen = sizeof(struct sockaddr_in6);
 
        /* Return port number. */
-       if (getnameinfo((struct sockaddr *)&from, fromlen, NULL, 0,
-           strport, sizeof(strport), NI_NUMERICSERV) != 0)
-               fatal("get_sock_port: getnameinfo NI_NUMERICSERV failed");
+       if ((r = getnameinfo((struct sockaddr *)&from, fromlen, NULL, 0,
+           strport, sizeof(strport), NI_NUMERICSERV)) != 0)
+               fatal("get_sock_port: getnameinfo NI_NUMERICSERV failed: %s",
+                   r == EAI_SYSTEM ? strerror(errno) : gai_strerror(r));
        return atoi(strport);
 }
 
@@ -382,7 +387,13 @@ get_peer_port(int sock)
 int
 get_remote_port(void)
 {
-       return get_port(0);
+       static int port = -1;
+
+       /* Cache to avoid getpeername() on a dead connection */
+       if (port == -1)
+               port = get_port(0);
+
+       return port;
 }
 
 int
This page took 0.401615 seconds and 4 git commands to generate.