summaryrefslogtreecommitdiff
path: root/clientname.c
diff options
context:
space:
mode:
authorDavid Dykstra <dwd@samba.org>2002-08-01 19:17:00 +0000
committerDavid Dykstra <dwd@samba.org>2002-08-01 19:17:00 +0000
commit09021eabb53aec92237116d57d3e2b4246ef8f86 (patch)
tree6dc5be921e9c2b0b2928907de5f18dfd9b597cdf /clientname.c
parent8d69d57113c7dccefa50638f3cb91d6a6a208e5f (diff)
downloadrsync-09021eabb53aec92237116d57d3e2b4246ef8f86.tar.gz
Fix to correctly identify remote IP address and host name when using
-e ssh and :: together. Uses $SSH_CLIENT to locate the IP address (was attempting to before but it didn't always work) and then uses inet_pton() on that and getnameinfo() to find the name.
Diffstat (limited to 'clientname.c')
-rw-r--r--clientname.c50
1 files changed, 41 insertions, 9 deletions
diff --git a/clientname.c b/clientname.c
index e1aeb35b..8d22fc8b 100644
--- a/clientname.c
+++ b/clientname.c
@@ -43,6 +43,7 @@ char *client_addr(int fd)
{
struct sockaddr_storage ss;
socklen_t length = sizeof ss;
+ char *ssh_client, *p;
static char addr_buf[100];
static int initialised;
@@ -50,11 +51,21 @@ char *client_addr(int fd)
initialised = 1;
- client_sockaddr(fd, &ss, &length);
+ ssh_client = getenv("SSH_CLIENT");
+ if (ssh_client != NULL) {
+ strlcpy(addr_buf, ssh_client, sizeof(addr_buf));
+ /* truncate SSH_CLIENT to just IP address */
+ p = strchr(addr_buf, ' ');
+ if (p)
+ *p = '\0';
+ else
+ strlcpy(addr_buf, "0.0.0.0", sizeof("0.0.0.0"));
+ } else
+ client_sockaddr(fd, &ss, &length);
getnameinfo((struct sockaddr *)&ss, length,
- addr_buf, sizeof(addr_buf), NULL, 0, NI_NUMERICHOST);
-
+ addr_buf, sizeof(addr_buf), NULL, 0, NI_NUMERICHOST);
+
return addr_buf;
}
@@ -80,8 +91,6 @@ static int get_sockaddr_family(const struct sockaddr_storage *ss)
**/
char *client_name(int fd)
{
- struct sockaddr_storage ss;
- socklen_t ss_len = sizeof ss;
static char name_buf[100];
static char port_buf[100];
static int initialised;
@@ -91,11 +100,34 @@ char *client_name(int fd)
strcpy(name_buf, default_name);
initialised = 1;
- client_sockaddr(fd, &ss, &ss_len);
+ if (getenv("SSH_CLIENT") != NULL) {
+ /* Look up name of IP address given in $SSH_CLIENT */
+#ifdef INET6
+ int af = AF_INET6;
+ struct sockaddr_in6 sin;
+#else
+ int af = AF_INET;
+ struct sockaddr_in sin;
+#endif
+ socklen_t sin_len = sizeof sin;
- if (!lookup_name(fd, &ss, ss_len, name_buf, sizeof name_buf,
- port_buf, sizeof port_buf))
- check_name(fd, &ss, name_buf);
+ memset(&sin, 0, sin_len);
+ sin.sin_family = af;
+ inet_pton(af, client_addr(fd), &sin.sin_addr.s_addr);
+
+ if (!lookup_name(fd, (struct sockaddr_storage *)&sin, sin_len,
+ name_buf, sizeof name_buf, port_buf, sizeof port_buf))
+ check_name(fd, (struct sockaddr_storage *)&sin, name_buf);
+ } else {
+ struct sockaddr_storage ss;
+ socklen_t ss_len = sizeof ss;
+
+ client_sockaddr(fd, &ss, &ss_len);
+
+ if (!lookup_name(fd, &ss, ss_len, name_buf, sizeof name_buf,
+ port_buf, sizeof port_buf))
+ check_name(fd, &ss, name_buf);
+ }
return name_buf;
}