summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Friedl <markus@cvs.openbsd.org>1999-12-09 00:00:53 +0000
committerMarkus Friedl <markus@cvs.openbsd.org>1999-12-09 00:00:53 +0000
commit98f7956cca9d7248c4a647779df86c6b35dcb971 (patch)
treeb2289c317479919ff3ac816cc0d78b59d8af3119
parent544ae526376cedc249d1de1a429d7b9392c0cc02 (diff)
fix get_remote_port() and friends for sshd -i; Holger.Trapp@Informatik.TU-Chemnitz.DE
-rw-r--r--usr.bin/ssh/canohost.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/usr.bin/ssh/canohost.c b/usr.bin/ssh/canohost.c
index a3ca1778519..3d345176bdb 100644
--- a/usr.bin/ssh/canohost.c
+++ b/usr.bin/ssh/canohost.c
@@ -14,7 +14,7 @@
*/
#include "includes.h"
-RCSID("$Id: canohost.c,v 1.8 1999/11/24 19:53:44 markus Exp $");
+RCSID("$Id: canohost.c,v 1.9 1999/12/09 00:00:52 markus Exp $");
#include "packet.h"
#include "xmalloc.h"
@@ -143,6 +143,28 @@ check_ip_options:
static char *canonical_host_name = NULL;
static char *canonical_host_ip = NULL;
+/* Returns 1 if remote host is connected via socket, 0 if not. */
+
+int
+peer_connection_is_on_socket()
+{
+ struct sockaddr_in from;
+ int fromlen;
+ int in = packet_get_connection_in();
+ int out = packet_get_connection_out();
+
+ /* filedescriptors in and out are the same, so it's a socket */
+ if (in == out)
+ return 1;
+ fromlen = sizeof(from);
+ memset(&from, 0, sizeof(from));
+ if (getpeername(in, (struct sockaddr *) & from, &fromlen) < 0)
+ return 0;
+ if (from.sin_family != AF_INET && from.sin_family != AF_INET6)
+ return 0;
+ return 1;
+}
+
/*
* Return the canonical name of the host in the other side of the current
* connection. The host name is cached, so it is efficient to call this
@@ -157,7 +179,7 @@ get_canonical_hostname()
return canonical_host_name;
/* Get the real hostname if socket; otherwise return UNKNOWN. */
- if (packet_get_connection_in() == packet_get_connection_out())
+ if (peer_connection_is_on_socket())
canonical_host_name = get_remote_hostname(packet_get_connection_in());
else
canonical_host_name = xstrdup("UNKNOWN");
@@ -181,7 +203,7 @@ get_remote_ipaddr()
return canonical_host_ip;
/* If not a socket, return UNKNOWN. */
- if (packet_get_connection_in() != packet_get_connection_out()) {
+ if (!peer_connection_is_on_socket()) {
canonical_host_ip = xstrdup("UNKNOWN");
return canonical_host_ip;
}
@@ -232,7 +254,7 @@ get_remote_port()
* If the connection is not a socket, return 65535. This is
* intentionally chosen to be an unprivileged port number.
*/
- if (packet_get_connection_in() != packet_get_connection_out())
+ if (!peer_connection_is_on_socket())
return 65535;
/* Get client socket. */