I am trying to get the TCP port number which is used by a remote user's telnet connection.
In case of ssh connection, I am able to get it from SSH_CLIENT env variable, but how to get it in case of telnet connection. Are there any C/Unix APIs to get it.
I tried following code:
u_int32_t
port_session_connected (void)
{
struct sockaddr_storage from;
char *ssh_client;
char *remote_port;
char *temp;
static char remoteport[1024];
int socklen;
int rv = 0, err;
if ((ssh_client = getenv("SSH_CLIENT")) != NULL) {
syslog("(%s): Have SSH_CLIENT: %s", __func__, ssh_client);
if ((temp = strtok(ssh_client, " \t")) != NULL) {
remote_port = strtok(NULL, " \t");
syslog("(%s): Remote port: %s", __func__, remote_port);
if (remote_port) rv = atoi(remote_port);
return rv;
}
} /* For ssh sessions */
socklen = sizeof(from);
if (getpeername(STDIN_FILENO, (struct sockaddr *)&from, &socklen) == 0) {
struct sockaddr_in *sck;
sck = (struct sockaddr_in *)&from;
syslog("(%s): getpeername() success", __func__);
syslog("(%s): Remote IP: %s\n", __func__, inet_ntoa(sck->sin_addr));
syslog("(%s): Remote Port: %d\n", __func__, (int)ntohs(sck->sin_port));
syslog("(%s): Family: %d\n", __func__, (int)(sck->sin_family));
err = getnameinfo((struct sockaddr *)&from, socklen, NULL, 0,
remoteport, sizeof(remoteport),NI_NUMERICSERV);
syslog("(%s): getnameinfo() return: %d", __func__, err);
if (err == 0) {
syslog(LOG_NOTICE, "(%s): getnameinfo() success", __func__);
syslog(LOG_NOTICE, "(%s): Remote port: %s", __func__, remoteport);
rv = atoi(remoteport);
return rv;
}
} /* For telnet session*/
return 0;
}
Function works fine for ssh connections. But For telnet connections, I am not able to get the remote port number used in a session.
Log Telnet case:
(port_session_connected): getpeername() success (port_session_connected): Remote IP: 0.0.0.0 (port_session_connected): Remote Port: 0 (port_session_connected): Family: 1 (port_session_connected): getnameinfo() return: 5
getnameinfo() fails with err=5 which is EAI_FAMILY /* ai_family not supported */ Family is 1 which is AF_UNIX.
Yes, getnameinfo() works only for AF_INET and AF_INET6.
Is there any API or anyway to get the telnet remote port.
Thanks