re-write to using getaddrinfo.
disable source-routing for the moment, it doesn't seem to be used anyways. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@7499 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -1581,9 +1581,17 @@ env_init(void)
|
|||||||
|
|
||||||
/* If this is not the full name, try to get it via DNS */
|
/* If this is not the full name, try to get it via DNS */
|
||||||
if (strchr(hbuf, '.') == 0) {
|
if (strchr(hbuf, '.') == 0) {
|
||||||
struct hostent *he = roken_gethostbyname(hbuf);
|
struct addrinfo hints, *ai;
|
||||||
if (he != NULL)
|
int error;
|
||||||
strlcpy(hbuf, he->h_name, 256);
|
|
||||||
|
memset (&hints, 0, sizeof(hints));
|
||||||
|
hints.ai_flags = AI_CANONNAME;
|
||||||
|
|
||||||
|
error = getaddrinfo (hbuf, NULL, &hints, &ai);
|
||||||
|
if (error == 0) {
|
||||||
|
strlcpy (hbuf, ai->ai_canonname, 256);
|
||||||
|
freeaddrinfo (ai);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
asprintf (&cp, "%s%s", hbuf, cp2);
|
asprintf (&cp, "%s%s", hbuf, cp2);
|
||||||
@@ -2048,7 +2056,6 @@ cmdrc(char *m1, char *m2)
|
|||||||
int
|
int
|
||||||
tn(int argc, char **argv)
|
tn(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct hostent *host = 0;
|
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
struct sockaddr_in6 sin6;
|
struct sockaddr_in6 sin6;
|
||||||
#endif
|
#endif
|
||||||
@@ -2118,93 +2125,6 @@ tn(int argc, char **argv)
|
|||||||
if (hostp == 0)
|
if (hostp == 0)
|
||||||
goto usage;
|
goto usage;
|
||||||
|
|
||||||
#if defined(IP_OPTIONS) && defined(IPPROTO_IP)
|
|
||||||
if (hostp[0] == '@' || hostp[0] == '!') {
|
|
||||||
if ((hostname = strrchr(hostp, ':')) == NULL)
|
|
||||||
hostname = strrchr(hostp, '@');
|
|
||||||
hostname++;
|
|
||||||
srp = 0;
|
|
||||||
temp = sourceroute(hostp, &srp, &srlen);
|
|
||||||
if (temp == 0) {
|
|
||||||
fprintf (stderr, "%s: %s\r\n", srp ? srp : "", hstrerror(h_errno));
|
|
||||||
setuid(getuid());
|
|
||||||
return 0;
|
|
||||||
} else if (temp == -1) {
|
|
||||||
printf("Bad source route option: %s\r\n", hostp);
|
|
||||||
setuid(getuid());
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
#endif
|
|
||||||
memset (&sin, 0, sizeof(sin));
|
|
||||||
#ifdef HAVE_IPV6
|
|
||||||
memset (&sin6, 0, sizeof(sin6));
|
|
||||||
|
|
||||||
if(inet_pton(AF_INET6, hostp, &sin6.sin6_addr)) {
|
|
||||||
sin6.sin6_family = family = AF_INET6;
|
|
||||||
sa = (struct sockaddr *)&sin6;
|
|
||||||
sa_size = sizeof(sin6);
|
|
||||||
strlcpy(_hostname, hostp, sizeof(_hostname));
|
|
||||||
hostname =_hostname;
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
if(inet_aton(hostp, &sin.sin_addr)){
|
|
||||||
sin.sin_family = family = AF_INET;
|
|
||||||
sa = (struct sockaddr *)&sin;
|
|
||||||
sa_size = sizeof(sin);
|
|
||||||
strlcpy(_hostname, hostp, sizeof(_hostname));
|
|
||||||
hostname = _hostname;
|
|
||||||
} else {
|
|
||||||
#ifdef HAVE_GETHOSTBYNAME2
|
|
||||||
#ifdef HAVE_IPV6
|
|
||||||
host = gethostbyname2(hostp, AF_INET6);
|
|
||||||
if(host == NULL)
|
|
||||||
#endif
|
|
||||||
host = gethostbyname2(hostp, AF_INET);
|
|
||||||
#else
|
|
||||||
host = roken_gethostbyname(hostp);
|
|
||||||
#endif
|
|
||||||
if (host) {
|
|
||||||
strlcpy(_hostname, host->h_name, sizeof(_hostname));
|
|
||||||
family = host->h_addrtype;
|
|
||||||
addr_list = host->h_addr_list;
|
|
||||||
|
|
||||||
switch(family) {
|
|
||||||
case AF_INET:
|
|
||||||
memset(&sin, 0, sizeof(sin));
|
|
||||||
sa_size = sizeof(sin);
|
|
||||||
sa = (struct sockaddr *)&sin;
|
|
||||||
sin.sin_family = family;
|
|
||||||
sin.sin_addr = *((struct in_addr *)(*addr_list));
|
|
||||||
break;
|
|
||||||
#ifdef HAVE_IPV6
|
|
||||||
case AF_INET6:
|
|
||||||
memset(&sin6, 0, sizeof(sin6));
|
|
||||||
sa_size = sizeof(sin6);
|
|
||||||
sa = (struct sockaddr *)&sin6;
|
|
||||||
sin6.sin6_family = family;
|
|
||||||
sin6.sin6_addr = *((struct in6_addr *)(*addr_list));
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Bad address family: %d\n", family);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
_hostname[sizeof(_hostname)-1] = '\0';
|
|
||||||
hostname = _hostname;
|
|
||||||
} else {
|
|
||||||
fprintf (stderr, "%s: %s\r\n", hostp ? hostp : "",
|
|
||||||
hstrerror(h_errno));
|
|
||||||
setuid(getuid());
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#if defined(IP_OPTIONS) && defined(IPPROTO_IP)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (portp) {
|
if (portp) {
|
||||||
if (*portp == '-') {
|
if (*portp == '-') {
|
||||||
portp++;
|
portp++;
|
||||||
@@ -2236,105 +2156,86 @@ tn(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
telnetport = 1;
|
telnetport = 1;
|
||||||
}
|
}
|
||||||
do {
|
|
||||||
switch(family) {
|
|
||||||
case AF_INET:
|
|
||||||
sin.sin_port = port;
|
|
||||||
printf("Trying %s...\r\n", inet_ntoa(sin.sin_addr));
|
|
||||||
break;
|
|
||||||
#ifdef HAVE_IPV6
|
|
||||||
case AF_INET6: {
|
|
||||||
#ifndef INET6_ADDRSTRLEN
|
|
||||||
#define INET6_ADDRSTRLEN 46
|
|
||||||
#endif
|
|
||||||
|
|
||||||
char buf[INET6_ADDRSTRLEN];
|
{
|
||||||
|
struct addrinfo *ai, *a, hints;
|
||||||
|
int error;
|
||||||
|
char portstr[NI_MAXSERV];
|
||||||
|
|
||||||
sin6.sin6_port = port;
|
memset (&hints, 0, sizeof(hints));
|
||||||
#ifdef HAVE_INET_NTOP
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
printf("Trying %s...\r\n", inet_ntop(AF_INET6,
|
hints.ai_protocol = IPPROTO_TCP;
|
||||||
&sin6.sin6_addr,
|
hints.ai_flags = AI_CANONNAME;
|
||||||
buf,
|
|
||||||
sizeof(buf)));
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
snprintf (portstr, sizeof(portstr), "%u", ntohs(port));
|
||||||
|
|
||||||
net = socket(family, SOCK_STREAM, 0);
|
error = getaddrinfo (hostp, portstr, &hints, &ai);
|
||||||
setuid(getuid());
|
if (error) {
|
||||||
if (net < 0) {
|
fprintf (stderr, "%s: %s\r\n", hostp, gai_strerror (error));
|
||||||
perror("telnet: socket");
|
setuid (getuid ());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
strlcpy (_hostname, ai->ai_canonname, sizeof(_hostname));
|
||||||
|
hostname = _hostname;
|
||||||
|
|
||||||
|
for (a = ai; a != NULL && connected == 0; a = a->ai_next) {
|
||||||
|
char addrstr[256];
|
||||||
|
|
||||||
|
if (getnameinfo (a->ai_addr, a->ai_addrlen,
|
||||||
|
addrstr, sizeof(addrstr),
|
||||||
|
NULL, 0, NI_NUMERICHOST) != 0)
|
||||||
|
strlcpy (addrstr, "unknown address", sizeof(addrstr));
|
||||||
|
|
||||||
|
printf("Trying %s...\r\n", addrstr);
|
||||||
|
|
||||||
|
net = socket (a->ai_family, a->ai_socktype, a->ai_protocol);
|
||||||
|
setuid (getuid ());
|
||||||
|
if (net < 0) {
|
||||||
|
warn ("telnet: socket");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
#if defined(IP_OPTIONS) && defined(IPPROTO_IP) && defined(HAVE_SETSOCKOPT)
|
#if defined(IP_OPTIONS) && defined(IPPROTO_IP) && defined(HAVE_SETSOCKOPT)
|
||||||
if (srp && setsockopt(net, IPPROTO_IP, IP_OPTIONS, (void *)srp,
|
if (srp && setsockopt(net, IPPROTO_IP, IP_OPTIONS,
|
||||||
srlen) < 0)
|
(void *)srp, srlen) < 0)
|
||||||
perror("setsockopt (IP_OPTIONS)");
|
perror("setsockopt (IP_OPTIONS)");
|
||||||
#endif
|
#endif
|
||||||
#if defined(IPPROTO_IP) && defined(IP_TOS)
|
#if defined(IPPROTO_IP) && defined(IP_TOS)
|
||||||
{
|
{
|
||||||
# if defined(HAVE_GETTOSBYNAME)
|
# if defined(HAVE_GETTOSBYNAME)
|
||||||
struct tosent *tp;
|
struct tosent *tp;
|
||||||
if (tos < 0 && (tp = gettosbyname("telnet", "tcp")))
|
if (tos < 0 && (tp = gettosbyname("telnet", "tcp")))
|
||||||
tos = tp->t_tos;
|
tos = tp->t_tos;
|
||||||
# endif
|
# endif
|
||||||
if (tos < 0)
|
if (tos < 0)
|
||||||
tos = 020; /* Low Delay bit */
|
tos = 020; /* Low Delay bit */
|
||||||
if (tos
|
if (tos
|
||||||
&& (setsockopt(net, IPPROTO_IP, IP_TOS,
|
&& (setsockopt(net, IPPROTO_IP, IP_TOS,
|
||||||
(void *)&tos, sizeof(int)) < 0)
|
(void *)&tos, sizeof(int)) < 0)
|
||||||
&& (errno != ENOPROTOOPT))
|
&& (errno != ENOPROTOOPT))
|
||||||
perror("telnet: setsockopt (IP_TOS) (ignored)");
|
perror("telnet: setsockopt (IP_TOS) (ignored)");
|
||||||
}
|
|
||||||
#endif /* defined(IPPROTO_IP) && defined(IP_TOS) */
|
|
||||||
|
|
||||||
if (debug && SetSockOpt(net, SOL_SOCKET, SO_DEBUG, 1) < 0) {
|
|
||||||
perror("setsockopt (SO_DEBUG)");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (connect(net, sa, sa_size) < 0) {
|
|
||||||
if (host && addr_list[1]) {
|
|
||||||
int oerrno = errno;
|
|
||||||
|
|
||||||
switch(family) {
|
|
||||||
case AF_INET :
|
|
||||||
fprintf(stderr, "telnet: connect to address %s: ",
|
|
||||||
inet_ntoa(sin.sin_addr));
|
|
||||||
sin.sin_addr = *((struct in_addr *)(*++addr_list));
|
|
||||||
break;
|
|
||||||
#ifdef HAVE_IPV6
|
|
||||||
case AF_INET6: {
|
|
||||||
char buf[INET6_ADDRSTRLEN];
|
|
||||||
|
|
||||||
fprintf(stderr, "telnet: connect to address %s: ",
|
|
||||||
inet_ntop(AF_INET6, &sin6.sin6_addr, buf,
|
|
||||||
sizeof(buf)));
|
|
||||||
sin6.sin6_addr = *((struct in6_addr *)(*++addr_list));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = oerrno;
|
|
||||||
perror(NULL);
|
|
||||||
NetClose(net);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
perror("telnet: Unable to connect to remote host");
|
#endif /* defined(IPPROTO_IP) && defined(IP_TOS) */
|
||||||
return 0;
|
if (debug && SetSockOpt(net, SOL_SOCKET, SO_DEBUG, 1) < 0) {
|
||||||
}
|
perror("setsockopt (SO_DEBUG)");
|
||||||
connected++;
|
}
|
||||||
|
|
||||||
|
if (connect (net, a->ai_addr, a->ai_addrlen) < 0) {
|
||||||
|
fprintf (stderr, "telnet: connect to address %s: %s\n",
|
||||||
|
addrstr, strerror(errno));
|
||||||
|
NetClose(net);
|
||||||
|
if (a->ai_next != NULL) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
freeaddrinfo (ai);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++connected;
|
||||||
#if defined(AUTHENTICATION) || defined(ENCRYPTION)
|
#if defined(AUTHENTICATION) || defined(ENCRYPTION)
|
||||||
auth_encrypt_connect(connected);
|
auth_encrypt_connect(connected);
|
||||||
#endif
|
#endif
|
||||||
} while (connected == 0);
|
}
|
||||||
|
}
|
||||||
cmdrc(hostp, hostname);
|
cmdrc(hostp, hostname);
|
||||||
if (autologin && user == NULL)
|
if (autologin && user == NULL)
|
||||||
user = (char *)get_default_username ();
|
user = (char *)get_default_username ();
|
||||||
@@ -2546,6 +2447,8 @@ help(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if 0 /* XXX - broken */
|
||||||
|
|
||||||
#if defined(IP_OPTIONS) && defined(IPPROTO_IP)
|
#if defined(IP_OPTIONS) && defined(IPPROTO_IP)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2691,3 +2594,4 @@ sourceroute(char *arg, char **cpp, int *lenp)
|
|||||||
return(sin_addr.s_addr);
|
return(sin_addr.s_addr);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
Reference in New Issue
Block a user