]> andersk Git - gssapi-openssh.git/blobdiff - openssh/canohost.c
Portions of the Usage Metrics suport code are derived from the
[gssapi-openssh.git] / openssh / canohost.c
index 7138f48d0f418b3f8d4fa0ec7a356c75ab536472..5ef7625b4888a91359be2e912e09e3514f86bfb5 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: canohost.c,v 1.64 2009/02/12 03:00:56 djm Exp $ */
+/* $OpenBSD: canohost.c,v 1.65 2009/05/27 06:31:25 andreas Exp $ */
 /*
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -16,6 +16,7 @@
 
 #include <sys/types.h>
 #include <sys/socket.h>
+#include <sys/param.h>          /* for MAXHOSTNAMELEN */
 
 #include <netinet/in.h>
 #include <arpa/inet.h>
@@ -27,6 +28,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <stdarg.h>
+#include <unistd.h>
 
 #include "xmalloc.h"
 #include "packet.h"
@@ -35,6 +37,8 @@
 #include "misc.h"
 
 static void check_ip_options(int, char *);
+static char *canonical_host_ip = NULL;
+static int cached_port = -1;
 
 /*
  * Return the canonical name of the host at the other end of the socket. The
@@ -304,6 +308,16 @@ get_local_name(int sock)
        return get_socket_address(sock, 0, NI_NAMEREQD);
 }
 
+void
+clear_cached_addr(void)
+{
+       if (canonical_host_ip != NULL) {
+               xfree(canonical_host_ip);
+               canonical_host_ip = NULL;
+       }
+       cached_port = -1;
+}
+
 /*
  * Returns the IP-address of the remote host as a string.  The returned
  * string must not be freed.
@@ -312,8 +326,6 @@ get_local_name(int sock)
 const char *
 get_remote_ipaddr(void)
 {
-       static char *canonical_host_ip = NULL;
-
        /* Check whether we have cached the ipaddr. */
        if (canonical_host_ip == NULL) {
                if (packet_connection_is_on_socket()) {
@@ -402,13 +414,11 @@ get_peer_port(int sock)
 int
 get_remote_port(void)
 {
-       static int port = -1;
-
        /* Cache to avoid getpeername() on a dead connection */
-       if (port == -1)
-               port = get_port(0);
+       if (cached_port == -1)
+               cached_port = get_port(0);
 
-       return port;
+       return cached_port;
 }
 
 int
@@ -416,3 +426,33 @@ get_local_port(void)
 {
        return get_port(1);
 }
+
+void
+resolve_localhost(char **host)
+{
+    struct hostent *hostinfo;
+
+    hostinfo = gethostbyname(*host);
+    if (hostinfo == NULL || hostinfo->h_name == NULL) {
+       debug("gethostbyname(%s) failed", *host);
+       return;
+    }
+    if (hostinfo->h_addrtype == AF_INET) {
+       struct in_addr addr;
+       addr = *(struct in_addr *)(hostinfo->h_addr);
+       if (ntohl(addr.s_addr) == INADDR_LOOPBACK) {
+           char buf[MAXHOSTNAMELEN];
+           if (gethostname(buf, sizeof(buf)) < 0) {
+               debug("gethostname() failed");
+               return;
+           }
+           hostinfo = gethostbyname(buf);
+           xfree(*host);
+           if (hostinfo == NULL || hostinfo->h_name == NULL) {
+               *host = xstrdup(buf);
+           } else {
+               *host = xstrdup(hostinfo->h_name);
+           }
+       }
+    }
+}
This page took 0.03967 seconds and 4 git commands to generate.