8067843
--- screen-4.0.3/window.h.ipv6	2003-08-21 16:57:30.000000000 +0200
8067843
+++ screen-4.0.3/window.h	2006-11-15 13:36:57.000000000 +0100
8067843
@@ -254,7 +254,7 @@
8067843
   struct display *w_zdisplay;
8067843
 #endif
8067843
 #ifdef BUILTIN_TELNET
8067843
-  struct sockaddr_in w_telsa;
8067843
+  struct sockaddr_storage w_telsa;
8067843
   char   w_telbuf[IOSIZE];
8067843
   int    w_telbufl;
8067843
   char   w_telmopts[256];
8067843
--- screen-4.0.3/window.c.ipv6	2003-12-05 14:45:41.000000000 +0100
8067843
+++ screen-4.0.3/window.c	2006-11-15 13:39:27.000000000 +0100
8067843
@@ -582,6 +582,13 @@
8067843
   n = pp - wtab;
8067843
   debug1("Makewin creating %d\n", n);
8067843
 
8067843
+#ifdef BUILTIN_TELNET                                                                                                        
8067843
+  if(!strcmp(nwin.args[0], "//telnet")) {                                                                                    
8067843
+         type = W_TYPE_TELNET;                                                                                               
8067843
+         TtyName = "telnet";                                                                                                 
8067843
+  }                                                                                                                          
8067843
+  else                                                                                                                       
8067843
+#endif 
8067843
   if ((f = OpenDevice(nwin.args, nwin.lflag, &type, &TtyName)) < 0)
8067843
     return -1;
8067843
 
8067843
@@ -736,7 +743,7 @@
8067843
 #ifdef BUILTIN_TELNET
8067843
   if (type == W_TYPE_TELNET)
8067843
     {
8067843
-      if (TelConnect(p))
8067843
+      if (TelOpenAndConnect(p))
8067843
 	{
8067843
 	  FreeWindow(p);
8067843
 	  return -1;
8067843
@@ -834,6 +841,13 @@
8067843
   int lflag, f;
8067843
 
8067843
   lflag = nwin_default.lflag;
8067843
+#ifdef BUILTIN_TELNET                                                                                                        
8067843
+  if(!strcmp(p->w_cmdargs[0], "//telnet")) {                                                                                 
8067843
+         p->w_type = W_TYPE_TELNET;                                                                                          
8067843
+         TtyName = "telnet";                                                                                                 
8067843
+  }                                                                                                                          
8067843
+  else                                                                                                                       
8067843
+#endif   
8067843
   if ((f = OpenDevice(p->w_cmdargs, lflag, &p->w_type, &TtyName)) < 0)
8067843
     return -1;
8067843
 
8067843
@@ -864,7 +878,7 @@
8067843
 #ifdef BUILTIN_TELNET
8067843
   if (p->w_type == W_TYPE_TELNET)
8067843
     {
8067843
-      if (TelConnect(p))
8067843
+      if (TelOpenAndConnect(p))
8067843
         return -1;
8067843
     }
8067843
   else
8067843
@@ -1007,16 +1021,6 @@
8067843
 
8067843
   if (!arg)
8067843
     return -1;
8067843
-#ifdef BUILTIN_TELNET
8067843
-  if (strcmp(arg, "//telnet") == 0)
8067843
-    {
8067843
-      f = TelOpen(args + 1);
8067843
-      lflag = 0;
8067843
-      *typep = W_TYPE_TELNET;
8067843
-      *namep = "telnet";
8067843
-    }
8067843
-  else
8067843
-#endif
8067843
   if ((stat(arg, &st)) == 0 && S_ISCHR(st.st_mode))
8067843
     {
8067843
       if (access(arg, R_OK | W_OK) == -1)
8067843
--- screen-4.0.3/teln.c.ipv6	2003-09-08 16:26:56.000000000 +0200
8067843
+++ screen-4.0.3/teln.c	2006-11-15 13:36:57.000000000 +0100
8067843
@@ -25,6 +25,7 @@
8067843
 #include <sys/socket.h>
8067843
 #include <fcntl.h>
8067843
 #include <netdb.h>
8067843
+#include <stdio.h>
8067843
 
8067843
 #include "config.h"
8067843
 
8067843
@@ -37,12 +38,13 @@
8067843
 extern struct layer *flayer;
8067843
 extern int visual_bell;
8067843
 extern char screenterm[];
8067843
+extern int af;
8067843
 
8067843
 static void TelReply __P((struct win *, char *, int));
8067843
 static void TelDocmd __P((struct win *, int, int));
8067843
 static void TelDosub __P((struct win *));
8067843
-
8067843
-#define TEL_DEFPORT	23
8067843
+// why TEL_DEFPORT has "
8067843
+#define TEL_DEFPORT	"23"
8067843
 #define TEL_CONNECTING	(-2)
8067843
 
8067843
 #define TC_IAC          255
8067843
@@ -99,86 +101,78 @@
8067843
 }
8067843
 
8067843
 int
8067843
-TelOpen(args)
8067843
-char **args;
8067843
-{
8067843
-  int fd;
8067843
-  int on = 1;
8067843
-
8067843
-  if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
8067843
-    {
8067843
-      Msg(errno, "TelOpen: socket");
8067843
-      return -1;
8067843
-    }
8067843
-  if (setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on)))
8067843
-    Msg(errno, "TelOpen: setsockopt SO_OOBINLINE");
8067843
-  return fd;
8067843
-}
8067843
-
8067843
-int
8067843
-TelConnect(p)
8067843
-struct win *p;
8067843
-{
8067843
-  int port = TEL_DEFPORT;
8067843
-  struct hostent *hp;
8067843
-  char **args;
8067843
+TelOpenAndConnect(struct win *p) {                                                                                           
8067843
+  int fd, on = 1;
8067843
   char buf[256];
8067843
 
8067843
-  args = p->w_cmdargs + 1;
8067843
-
8067843
-  if (!*args)
8067843
-    {
8067843
-      Msg(0, "Usage: screen //telnet host [port]");
8067843
-      return -1;
8067843
-    }
8067843
-  if (args[1])
8067843
-    port = atoi(args[1]);
8067843
-  p->w_telsa.sin_family = AF_INET;
8067843
-  if((p->w_telsa.sin_addr.s_addr = inet_addr(*args)) == -1)
8067843
-    {
8067843
-      if ((hp = gethostbyname(*args)) == NULL)
8067843
-        {
8067843
-	  Msg(0, "unknown host: %s", *args);
8067843
-	  return -1;
8067843
-        }
8067843
-      if (hp->h_length != sizeof(p->w_telsa.sin_addr.s_addr) || hp->h_addrtype != AF_INET)
8067843
-	{
8067843
-	  Msg(0, "Bad address type for %s", hp->h_name);
8067843
-	  return -1;
8067843
-	}
8067843
-      bcopy((char *)hp->h_addr,(char *)&p->w_telsa.sin_addr.s_addr, hp->h_length);
8067843
-      p->w_telsa.sin_family = hp->h_addrtype;
8067843
-    }
8067843
-  p->w_telsa.sin_port = htons(port);
8067843
-  if (port != TEL_DEFPORT)
8067843
-    sprintf(buf, "Trying %s %d...", inet_ntoa(p->w_telsa.sin_addr), port);
8067843
-  else
8067843
-    sprintf(buf, "Trying %s...", inet_ntoa(p->w_telsa.sin_addr));
8067843
-  WriteString(p, buf, strlen(buf));
8067843
-  if (connect(p->w_ptyfd, (struct sockaddr *)&p->w_telsa, sizeof(p->w_telsa)))
8067843
-    {
8067843
-      if (errno == EINPROGRESS)
8067843
-        {
8067843
-	  p->w_telstate = TEL_CONNECTING;
8067843
-	  p->w_telconnev.fd = p->w_ptyfd;
8067843
-	  p->w_telconnev.handler = tel_connev_fn;
8067843
-	  p->w_telconnev.data = (char *)p;
8067843
-	  p->w_telconnev.type = EV_WRITE;
8067843
-	  p->w_telconnev.pri = 1;
8067843
-	  debug("telnet connect in progress...\n");
8067843
-	  evenq(&p->w_telconnev);
8067843
-	}
8067843
-      else
8067843
-        {
8067843
-	  Msg(errno, "TelOpen: connect");
8067843
-	  return -1;
8067843
-	}
8067843
-    }
8067843
-  else
8067843
-    WriteString(p, "connected.\r\n", 12);
8067843
-  if (port == TEL_DEFPORT)
8067843
-    TelReply(p, (char *)tn_init, sizeof(tn_init));
8067843
-  return 0;
8067843
+  struct addrinfo hints, *res0, *res;                                                                                        
8067843
+                                                                                                                             
8067843
+  if (!(p->w_cmdargs[1])) {                                                                                                  
8067843
+    Msg(0, "Usage: screen //telnet host [port]");                                                                            
8067843
+    return -1;                                                                                                               
8067843
+  }                                                                                                                          
8067843
+                                                                                                                             
8067843
+  memset(&hints, 0, sizeof(hints));                                                                                          
8067843
+  hints.ai_family = af;                                                                                                      
8067843
+  hints.ai_socktype = SOCK_STREAM;                                                                                           
8067843
+  hints.ai_protocol = IPPROTO_TCP;                                                                                           
8067843
+  if(getaddrinfo(p->w_cmdargs[1], p->w_cmdargs[2] ? p->w_cmdargs[2] : TEL_DEFPORT,                                           
8067843
+                 &hints, &res0)) {                                                                                           
bc9ef83
+     Msg(0, "unknown host: %s", p->w_cmdargs[1]);
8067843
+     return -1;                                                                                                              
8067843
+  }                                                                                                                          
8067843
+                                                                                                                             
8067843
+  for(res = res0; res; res = res->ai_next) {                                                                                 
8067843
+    if((fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1) {                                            
8067843
+      if(res->ai_next)                                                                                                       
8067843
+        continue;                                                                                                            
8067843
+      else {                                                                                                                 
8067843
+        Msg(errno, "TelOpenAndConnect: socket");                                                                             
8067843
+        freeaddrinfo(res0);                                                                                                  
8067843
+        return -1;                                                                                                           
8067843
+      }                                                                                                                      
8067843
+    }                                                                                                                        
8067843
+                                                                                                                             
8067843
+    if (setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on)))                                                   
8067843
+      Msg(errno, "TelOpenAndConnect: setsockopt SO_OOBINLINE");                                                               
8067843
+                                                                                                                             
8067843
+    if (p->w_cmdargs[2] && strcmp(p->w_cmdargs[2], TEL_DEFPORT))                                                             
8067843
+      snprintf(buf, 256, "Trying %s %s...", p->w_cmdargs[1], p->w_cmdargs[2]);                                               
8067843
+    else                                                                                                                     
8067843
+      snprintf(buf, 256, "Trying %s...", p->w_cmdargs[1]);                                                                   
8067843
+    WriteString(p, buf, strlen(buf));
8067843
+    if (connect(fd, res->ai_addr, res->ai_addrlen)) {                                                                        
8067843
+      if (errno == EINPROGRESS) {                                                                                            
8067843
+       p->w_telstate = TEL_CONNECTING;                                                                                       
8067843
+       p->w_telconnev.fd = fd;                                                                                               
8067843
+       p->w_telconnev.handler = tel_connev_fn;                                                                               
8067843
+       p->w_telconnev.data = (char *)p;                                                                                      
8067843
+       p->w_telconnev.type = EV_WRITE;                                                                                       
8067843
+       p->w_telconnev.pri = 1;                                                                                               
8067843
+       debug("telnet connect in progress...\n");                                                                             
8067843
+       evenq(&p->w_telconnev);                                                                                               
8067843
+      }                                                                                                                      
8067843
+      else {                                                                                                                 
8067843
+        close(fd);                                                                                                           
8067843
+       if(res->ai_next)                                                                                                      
8067843
+         continue;                                                                                                           
8067843
+       else {                                                                                                                
8067843
+          Msg(errno, "TelOpenAndConnect: connect");                                                                          
8067843
+          freeaddrinfo(res0);                                                                                                
8067843
+          return -1;                                                                                                         
8067843
+       }                                                                                                                     
8067843
+      }
8067843
+    }                                                                                                                        
8067843
+    else                                                                                                                     
8067843
+      WriteString(p, "connected.\r\n", 12);                                                                                  
bc9ef83
+    if (!(p->w_cmdargs[2] && strcmp(p->w_cmdargs[2], TEL_DEFPORT)))
8067843
+      TelReply(p, (char *)tn_init, sizeof(tn_init));                                                                         
8067843
+    p->w_ptyfd = fd;                                                                                                         
8067843
+    memcpy(&p->w_telsa, &res->ai_addr, sizeof(res->ai_addr));                                                                
8067843
+    freeaddrinfo(res0);                                                                                                      
8067843
+    return 0;                                                                                                                
8067843
+  }                  
bc9ef83
+  return -1;
8067843
 }
8067843
 
8067843
 int
8067843
--- screen-4.0.3/help.c.ipv6	2003-09-08 16:25:33.000000000 +0200
8067843
+++ screen-4.0.3/help.c	2006-11-15 13:36:57.000000000 +0100
8067843
@@ -49,6 +49,10 @@
8067843
 {
8067843
   printf("Use: %s [-opts] [cmd [args]]\n", myname);
8067843
   printf(" or: %s -r [host.tty]\n\nOptions:\n", myname);
8067843
+#ifdef BUILTIN_TELNET                                                                                                        
8067843
+  printf("-4            Use IPv4.\n");                                                                                       
8067843
+  printf("-6            Use IPv6.\n");                                                                                       
8067843
+#endif    
8067843
   printf("-a            Force all capabilities into each window's termcap.\n");
8067843
   printf("-A -[r|R]     Adapt all windows to the new display width & height.\n");
8067843
   printf("-c file       Read configuration file instead of '.screenrc'.\n");
8067843
--- screen-4.0.3/screen.c.ipv6	2003-09-08 16:26:41.000000000 +0200
8067843
+++ screen-4.0.3/screen.c	2006-11-15 13:36:57.000000000 +0100
8067843
@@ -231,8 +231,9 @@
8067843
 struct win *fore;
8067843
 struct win *windows;
8067843
 struct win *console_window;
8067843
-
8067843
-
8067843
+#ifdef BUILTIN_TELNET                                                                                                        
8067843
+int af;                                                                                                                      
8067843
+#endif 
8067843
 
8067843
 /*
8067843
  * Do this last
8067843
@@ -471,6 +472,9 @@
8067843
   nwin = nwin_undef;
8067843
   nwin_options = nwin_undef;
8067843
   strcpy(screenterm, "screen");
8067843
+#ifdef BUILTIN_TELNET                                                                                                        
8067843
+  af = AF_UNSPEC;                                                                                                            
8067843
+#endif
8067843
 
8067843
   logreopen_register(lf_secreopen);
8067843
 
8067843
@@ -505,6 +509,14 @@
8067843
 	    {
8067843
 	      switch (*ap)
8067843
 		{
8067843
+#ifdef BUILTIN_TELNET                                                                                                        
8067843
+               case '4':                                                                                                     
8067843
+                 af = AF_INET;                                                                                               
8067843
+                 break;                                                                                                      
8067843
+               case '6':                                                                                                     
8067843
+                 af = AF_INET6;                                                                                              
8067843
+                 break;                                                                                                      
8067843
+#endif         
8067843
 		case 'a':
8067843
 		  nwin_options.aflag = 1;
8067843
 		  break;
8067843
--- screen-4.0.3/extern.h.ipv6	2003-08-22 14:27:57.000000000 +0200
8067843
+++ screen-4.0.3/extern.h	2006-11-15 13:36:57.000000000 +0100
8067843
@@ -446,8 +446,7 @@
8067843
 
8067843
 /* teln.c */
8067843
 #ifdef BUILTIN_TELNET
8067843
-extern int   TelOpen __P((char **));
8067843
-extern int   TelConnect __P((struct win *));
8067843
+extern int   TelOpenAndConnect __P((struct win *));
8067843
 extern int   TelIsline __P((struct win *p));
8067843
 extern void  TelProcessLine __P((char **, int *));
8067843
 extern int   DoTelnet __P((char *, int *, int));