diff options
| author | Ken Raeburn <raeburn@mit.edu> | 2001-08-30 03:34:30 +0000 |
|---|---|---|
| committer | Ken Raeburn <raeburn@mit.edu> | 2001-08-30 03:34:30 +0000 |
| commit | ce458575b948fe95bc0df77c71a8632c1bc6f119 (patch) | |
| tree | 4935d38a20536ec00aa17ca1ee5d8a934bc45ec6 /src | |
| parent | c0629e39d71cc03f1d10d7e5661ac1df93940458 (diff) | |
| download | krb5-ce458575b948fe95bc0df77c71a8632c1bc6f119.tar.gz krb5-ce458575b948fe95bc0df77c71a8632c1bc6f119.tar.xz krb5-ce458575b948fe95bc0df77c71a8632c1bc6f119.zip | |
support incoming ipv6 connections; debug mode still ipv4 only
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@13695 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src')
| -rw-r--r-- | src/appl/telnet/telnetd/ChangeLog | 9 | ||||
| -rw-r--r-- | src/appl/telnet/telnetd/defs.h | 3 | ||||
| -rw-r--r-- | src/appl/telnet/telnetd/telnetd.c | 38 |
3 files changed, 35 insertions, 15 deletions
diff --git a/src/appl/telnet/telnetd/ChangeLog b/src/appl/telnet/telnetd/ChangeLog index 18c8be364a..eca10d43d5 100644 --- a/src/appl/telnet/telnetd/ChangeLog +++ b/src/appl/telnet/telnetd/ChangeLog @@ -1,5 +1,14 @@ 2001-08-29 Ken Raeburn <raeburn@mit.edu> + * defs.h: Include socket-utils.h. + * telnetd.c: Include fake-addrinfo.c. + (FAI_PREFIX): Define. + (doit): Now static, and takes sockaddr pointer rather than + sockaddr_in pointer. Use getnameinfo instead of gethostbyaddr to + verify that host name was available. + (main): Use sockaddr_storage for remote address buffer; clear + before using. Only do IP_TOS processing for IPv4. + * termio-tn.c, termios-tn.c: Define dummy variables if STREAMSPTY isn't defined, to silence compiler complaints about empty files. diff --git a/src/appl/telnet/telnetd/defs.h b/src/appl/telnet/telnetd/defs.h index 482c25c7d0..6e388be078 100644 --- a/src/appl/telnet/telnetd/defs.h +++ b/src/appl/telnet/telnetd/defs.h @@ -78,6 +78,9 @@ #include <sys/file.h> #include <sys/stat.h> +/* for socklen() */ +#include "socket-utils.h" + #if TIME_WITH_SYS_TIME # include <sys/time.h> # include <time.h> diff --git a/src/appl/telnet/telnetd/telnetd.c b/src/appl/telnet/telnetd/telnetd.c index fc8f260f4e..c15c0df3d9 100644 --- a/src/appl/telnet/telnetd/telnetd.c +++ b/src/appl/telnet/telnetd/telnetd.c @@ -42,6 +42,8 @@ static char copyright[] = #include "telnetd.h" #include "pathnames.h" +#define FAI_PREFIX telnetd +#include "fake-addrinfo.c" extern int getent(char *, char *); extern int tgetent(char *, char *); @@ -134,7 +136,7 @@ char ptyibuf2[BUFSIZ]; #endif /* ! STREAMPTY */ -void doit P((struct sockaddr_in *)); +static void doit P((struct sockaddr *)); int terminaltypeok P((char *)); static void _gettermname(void); @@ -220,7 +222,7 @@ main(argc, argv) int argc; char *argv[]; { - struct sockaddr_in from; + struct sockaddr_storage from; int on = 1, fromlen; register int ch; extern char *optarg; @@ -486,6 +488,7 @@ main(argc, argv) argc -= optind; argv += optind; + /* XXX Convert this to support getaddrinfo, ipv6, etc. */ if (debug) { int s, ns, foo; struct servent *sp; @@ -607,6 +610,7 @@ main(argc, argv) openlog("telnetd", LOG_PID | LOG_ODELAY, LOG_DAEMON); fromlen = sizeof (from); + memset(&from, 0, sizeof(from)); if (getpeername(0, (struct sockaddr *)&from, &fromlen) < 0) { fprintf(stderr, "%s: ", progname); perror("getpeername"); @@ -619,7 +623,7 @@ main(argc, argv) } #if defined(IPPROTO_IP) && defined(IP_TOS) - { + if (fromlen == sizeof (struct in_addr)) { # if defined(HAVE_GETTOSBYNAME) struct tosent *tp; if (tos < 0 && (tp = gettosbyname("telnet", "tcp"))) @@ -635,7 +639,7 @@ main(argc, argv) } #endif /* defined(IPPROTO_IP) && defined(IP_TOS) */ net = 0; - doit(&from); + doit((struct sockaddr *)&from); /* NOTREACHED */ return 0; @@ -922,11 +926,9 @@ extern void telnet P((int, int, char *)); /* * Get a pty, scan input lines. */ -void doit(who) - struct sockaddr_in *who; +static void doit(who) + struct sockaddr *who; { - char *inet_ntoa(); - struct hostent *hp; int level; #if defined(_SC_CRAY_SECURE_SYS) int ptynum; @@ -965,13 +967,19 @@ void doit(who) if (retval) { fatal(net, error_message(retval)); } - /* get name of connected client */ - hp = gethostbyaddr((char *)&who->sin_addr, sizeof (struct in_addr), - who->sin_family); - - if (hp == NULL && registerd_host_only) { - fatal(net, "Couldn't resolve your address into a host name.\r\n\ - Please contact your net administrator"); + if (registerd_host_only) { + /* Get name of connected client -- but we don't actually + use it. Just confirm that we can get it. */ + int aierror; + char hostnamebuf[NI_MAXHOST]; + aierror = getnameinfo (who, socklen (who), + hostnamebuf, sizeof (hostnamebuf), 0, 0, + NI_NAMEREQD); + if (aierror != 0) { + fatal(net, + "Couldn't resolve your address into a host name.\r\n" + "Please contact your net administrator"); + } } (void) gethostname(host_name, sizeof (host_name)); |
