support incoming ipv6 connections; debug mode still ipv4 only
authorKen Raeburn <raeburn@mit.edu>
Thu, 30 Aug 2001 03:34:30 +0000 (03:34 +0000)
committerKen Raeburn <raeburn@mit.edu>
Thu, 30 Aug 2001 03:34:30 +0000 (03:34 +0000)
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@13695 dc483132-0cff-0310-8789-dd5450dbe970

src/appl/telnet/telnetd/ChangeLog
src/appl/telnet/telnetd/defs.h
src/appl/telnet/telnetd/telnetd.c

index 18c8be364a9c789c8e3ef44dbba10e53f49d1be5..eca10d43d5034b140709342701e367b4eb6edc08 100644 (file)
@@ -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.
 
index 482c25c7d0c356ed29acf306bfd3e1f4c08234f4..6e388be078b285d799c6e725a2f6d420063b811d 100644 (file)
@@ -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>
index fc8f260f4e3a17c77e5ea9d152e3061c1df3a590..c15c0df3d988e47fdea56457f8ee4a546b5ddcc6 100644 (file)
@@ -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));