diff --git a/.telnet.metadata b/.telnet.metadata
new file mode 100644
index 0000000..7b8dcf0
--- /dev/null
+++ b/.telnet.metadata
@@ -0,0 +1,2 @@
+41213dedaf242126b54a3ac51b905a351eb22b15 SOURCES/netkit-telnet-0.17.tar.gz
+8c34c0ad6006a5316337f2bc3f7acb3c93d6045e SOURCES/telnet-client.tar.gz
diff --git a/README.md b/README.md
deleted file mode 100644
index 0e7897f..0000000
--- a/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-The master branch has no content
- 
-Look at the c7 branch if you are working with CentOS-7, or the c4/c5/c6 branch for CentOS-4, 5 or 6
- 
-If you find this file in a distro specific branch, it means that no content has been checked in yet
diff --git a/SOURCES/netkit-telnet-0.17-ipv6.diff b/SOURCES/netkit-telnet-0.17-ipv6.diff
new file mode 100644
index 0000000..e3719f1
--- /dev/null
+++ b/SOURCES/netkit-telnet-0.17-ipv6.diff
@@ -0,0 +1,265 @@
+diff -uNr netkit-telnet-0.17/telnetd/telnetd.c netkit-telnet-0.17.ipv6/telnetd/telnetd.c
+--- netkit-telnet-0.17/telnetd/telnetd.c	2006-07-13 08:37:18.000000000 +0200
++++ netkit-telnet-0.17.ipv6/telnetd/telnetd.c	2006-07-14 08:36:11.000000000 +0200
+@@ -49,6 +49,7 @@
+ /* #include <netinet/ip.h> */ /* Don't think this is used at all here */
+ #include <arpa/inet.h>
+ #include <assert.h>
++#include <sys/poll.h>
+ #include "telnetd.h"
+ #include "pathnames.h"
+ #include "setproctitle.h"
+@@ -68,7 +69,7 @@
+ #define HAS_IPPROTO_IP
+ #endif
+ 
+-static void doit(struct sockaddr_in *who);
++static void doit(struct sockaddr *who, socklen_t wholen);
+ static int terminaltypeok(const char *s);
+ 
+ /*
+@@ -90,7 +91,7 @@
+ int
+ main(int argc, char *argv[], char *env[])
+ {
+-	struct sockaddr_in from;
++	struct sockaddr from;
+ 	int on = 1;
+ 	socklen_t fromlen;
+ 	register int ch;
+@@ -248,64 +249,89 @@
+ 	argc -= optind;
+ 	argv += optind;
+ 
+-	if (debug) {
+-	    int s, ns;
+-	    socklen_t foo;
+-	    struct servent *sp;
+-	    struct sockaddr_in sn;
++	int s = 0;
+ 
+-	    memset(&sn, 0, sizeof(sn));
+-	    sn.sin_family = AF_INET;
++	if (debug) {
++	    struct addrinfo *ai;
++	    unsigned int nfds = 0;
++	    struct pollfd fds[2];
+ 
+ 	    if (argc > 1) {
+-		usage();
+-		/* NOTREACHED */
+-	    } else if (argc == 1) {
+-		    if ((sp = getservbyname(*argv, "tcp"))!=NULL) {
+-			sn.sin_port = sp->s_port;
+-		    } 
+-		    else {
+-			int pt = atoi(*argv);
+-			if (pt <= 0) {
+-			    fprintf(stderr, "telnetd: %s: bad port number\n",
+-				    *argv);
+-			    usage();
+-			    /* NOTREACHED */
+-			}
+-			sn.sin_port = htons(pt);
+-		   }
++	        usage();
++	        /* NOTREACHED */
+ 	    } else {
+-		sp = getservbyname("telnet", "tcp");
+-		if (sp == 0) {
+-		    fprintf(stderr, "telnetd: tcp/telnet: unknown service\n");
+-		    exit(1);
+-		}
+-		sn.sin_port = sp->s_port;
+-	    }
++	        struct addrinfo hints;
++
++	        memset (&hints, '\0', sizeof (hints));
++	        hints.ai_socktype = SOCK_STREAM;
++	        hints.ai_flags = AI_ADDRCONFIG | AI_PASSIVE;
++	        hints.ai_protocol = IPPROTO_TCP;
++
++	        if (argc == 0) {
++	            if (getaddrinfo(NULL, "telnet", &hints, &ai) != 0) {
++	               fprintf(stderr, "telnetd: %s: bad port number\n", *argv);
++	                usage();
++	                /* NOTREACHED */
++	            }
++	        } else {
++	            if (getaddrinfo(NULL, *argv, &hints, &ai) != 0) {
++		        fprintf(stderr, "telnetd: %s: bad port number\n", *argv);
++		        usage();
++		        /* NOTREACHED */
++		    }
++                }
++	    }	
+ 
+-	    s = socket(AF_INET, SOCK_STREAM, 0);
+-	    if (s < 0) {
++	    struct addrinfo *runp;
++	    int b = 0;
++	    for (runp = ai; ((runp != NULL) && (nfds < sizeof (fds) / sizeof (fds[0]))); runp = runp->ai_next) {
++	        fds[nfds].fd = socket(runp->ai_family, runp->ai_socktype, runp->ai_protocol);
++	        if (fds[nfds].fd < 0) {
+ 		    perror("telnetd: socket");;
+-		    exit(1);
++	            exit(1);
++	        }
++	        fds[nfds].events = POLLIN;
++	        (void) setsockopt(fds[nfds].fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
++
++	        if (bind(fds[nfds].fd, runp->ai_addr, runp->ai_addrlen) != 0) {
++	            // Unable to bind to given port. One of the reason can be
++	            // that we can't bind to both IPv4 and IPv6
++	            break;
++	        } else {			
++	            b++;
++	        }
++
++	        if (listen(fds[nfds].fd, 1) < 0) {
++	            perror("listen");
++	            exit(1);
++	        }
++                nfds++;
+ 	    }
+-	    (void) setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
+-	    if (bind(s, (struct sockaddr *)&sn, sizeof(sn)) < 0) {
+-		perror("bind");
+-		exit(1);
+-	    }
+-	    if (listen(s, 1) < 0) {
+-		perror("listen");
+-		exit(1);
++	    freeaddrinfo(ai);
++
++	    if (b == 0) {
++	        perror("bind");
++	        exit(1);
+ 	    }
+-	    foo = sizeof(sn);
+-	    ns = accept(s, (struct sockaddr *)&sn, &foo);
+-	    if (ns < 0) {
+-		perror("accept");
+-		exit(1);
++
++	    int n = poll (fds, nfds, -1);
++	    if (n > 0) {
++	        unsigned int i;
++	        for (i = 0; i < nfds; i++) {
++	            if (fds[i].revents & POLLIN) {
++	                struct sockaddr_storage rem;
++	                socklen_t remlen = sizeof(rem);
++	                int fd = accept(fds[i].fd, (struct sockaddr *) &rem, &remlen);
++
++	                if (fd < 0) {
++	                    perror("accept");
++	                    exit(1);
++	                }
++
++	                s = fd;
++	            }
++	        }
+ 	    }
+-	    (void) dup2(ns, 0);
+-	    (void) close(ns);
+-	    (void) close(s);
+ 	} else if (argc > 0) {
+ 		usage();
+ 		/* NOT REACHED */
+@@ -313,13 +339,13 @@
+ 
+ 	openlog("telnetd", LOG_PID | LOG_ODELAY, LOG_DAEMON);
+ 	fromlen = sizeof (from);
+-	if (getpeername(0, (struct sockaddr *)&from, &fromlen) < 0) {
++	if (getpeername(s, &from, &fromlen) < 0) {
+ 		fprintf(stderr, "%s: ", progname);
+ 		perror("getpeername");
+ 		_exit(1);
+ 	}
+ 	if (keepalive &&
+-	    setsockopt(0, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof (on)) < 0) {
++	    setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof (on)) < 0) {
+ 		syslog(LOG_WARNING, "setsockopt (SO_KEEPALIVE): %m");
+ 	}
+ 
+@@ -333,13 +359,13 @@
+ 		if (tos < 0)
+ 			tos = 020;	/* Low Delay bit */
+ 		if (tos
+-		   && (setsockopt(0, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) < 0)
++		   && (setsockopt(s, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) < 0)
+ 		   && (errno != ENOPROTOOPT) )
+ 			syslog(LOG_WARNING, "setsockopt (IP_TOS): %m");
+ 	}
+ #endif	/* defined(HAS_IPPROTO_IP) && defined(IP_TOS) */
+-	net = 0;
+-	doit(&from);
++	net = s;
++	doit(&from, fromlen);
+ 	/* NOTREACHED */
+ 	return 0;
+ }  /* end of main */
+@@ -608,10 +634,9 @@
+  * Get a pty, scan input lines.
+  */
+ static void
+-doit(struct sockaddr_in *who)
++doit(struct sockaddr *who, socklen_t wholen)
+ {
+ 	const char *host;
+-	struct hostent *hp;
+ 	int level;
+ 	char user_name[256];
+ 
+@@ -623,12 +648,18 @@
+ 		fatal(net, "All network ports in use");
+ 
+ 	/* get name of connected client */
+-	hp = gethostbyaddr((char *)&who->sin_addr, sizeof (struct in_addr),
+-		who->sin_family);
+-	if (hp)
+-		host = hp->h_name;
+-	else
+-		host = inet_ntoa(who->sin_addr);
++	int error = -1;
++	char namebuf[255];
++
++	error = getnameinfo(who, wholen, namebuf, sizeof(namebuf), NULL, 0, 0);
++	
++	if (error) {
++		perror("getnameinfo: localhost");
++		perror(gai_strerror(error));
++		exit(1);		
++	}
++	
++	host = namebuf;
+ 
+ 	/*
+ 	 * We must make a copy because Kerberos is probably going
+@@ -649,13 +680,21 @@
+ 
+ 	/* Get local host name */
+ 	{
+-		struct hostent *h;
++		struct addrinfo hints;
++		struct addrinfo *res;
++		int e;
++
++		memset(&hints, '\0', sizeof(hints));
++		hints.ai_socktype = SOCK_STREAM;
++		hints.ai_flags = AI_ADDRCONFIG;
++
+ 		gethostname(host_name, sizeof(host_name));
+-		h = gethostbyname(host_name);
+-		if (h) {
+-		    strncpy(host_name, h->h_name, sizeof(host_name));
+-		    host_name[sizeof(host_name)-1] = 0;
++		if ((e = getaddrinfo(host_name, NULL, &hints, &res)) != 0) {
++			perror("getaddrinfo: localhost");
++			perror(gai_strerror(e));
++			exit(1);
+ 		}
++		freeaddrinfo(res);
+ 	}
+ 
+ #if	defined(AUTHENTICATE) || defined(ENCRYPT)
diff --git a/SOURCES/netkit-telnet-0.17-nodns.patch b/SOURCES/netkit-telnet-0.17-nodns.patch
new file mode 100644
index 0000000..1dba79b
--- /dev/null
+++ b/SOURCES/netkit-telnet-0.17-nodns.patch
@@ -0,0 +1,43 @@
+--- netkit-telnet-0.17.orig/telnetd/telnetd.c	2007-03-13 16:31:20.000000000 +0000
++++ netkit-telnet-0.17.orig/telnetd/telnetd.c	2007-03-13 16:31:26.000000000 +0000
+@@ -653,6 +653,11 @@ doit(struct sockaddr *who, socklen_t who
+ 
+ 	error = getnameinfo(who, wholen, namebuf, sizeof(namebuf), NULL, 0, 0);
+ 	
++	/* if we can't get a hostname now, settle for an address */	
++	if(error == EAI_AGAIN)
++		error = getnameinfo(who, wholen, namebuf, sizeof(namebuf),
++				NULL, 0, NI_NUMERICHOST);
++		
+ 	if (error) {
+ 		perror("getnameinfo: localhost");
+ 		perror(gai_strerror(error));
+@@ -681,7 +686,7 @@ doit(struct sockaddr *who, socklen_t who
+ 	/* Get local host name */
+ 	{
+ 		struct addrinfo hints;
+-		struct addrinfo *res;
++		struct addrinfo *res = 0;
+ 		int e;
+ 
+ 		memset(&hints, '\0', sizeof(hints));
+@@ -690,11 +695,14 @@ doit(struct sockaddr *who, socklen_t who
+ 
+ 		gethostname(host_name, sizeof(host_name));
+ 		if ((e = getaddrinfo(host_name, NULL, &hints, &res)) != 0) {
+-			perror("getaddrinfo: localhost");
+-			perror(gai_strerror(e));
+-			exit(1);
++			if(e != EAI_AGAIN) {
++				fprintf(stderr, "getaddrinfo: localhost %s\n", 
++				        gai_strerror(e));
++				exit(1);
++			}
+ 		}
+-		freeaddrinfo(res);
++		if(res)
++			freeaddrinfo(res);
+ 	}
+ 
+ #if	defined(AUTHENTICATE) || defined(ENCRYPT)
+
diff --git a/SOURCES/netkit-telnet-0.17-reallynodns.patch b/SOURCES/netkit-telnet-0.17-reallynodns.patch
new file mode 100644
index 0000000..32f7af5
--- /dev/null
+++ b/SOURCES/netkit-telnet-0.17-reallynodns.patch
@@ -0,0 +1,88 @@
+--- netkit-telnet-0.17.orig/telnetd/telnetd.c.reallynodns	2009-03-12 14:32:29.000000000 -0700
++++ netkit-telnet-0.17.orig/telnetd/telnetd.c	2009-03-12 14:51:59.000000000 -0700
+@@ -85,6 +85,7 @@
+ int keepalive = 1;
+ char *loginprg = _PATH_LOGIN;
+ char *progname;
++int lookupself = 1;
+ 
+ extern void usage(void);
+ 
+@@ -111,7 +112,7 @@
+ 
+ 	progname = *argv;
+ 
+-	while ((ch = getopt(argc, argv, "d:a:e:lhnr:I:D:B:sS:a:X:L:")) != EOF) {
++	while ((ch = getopt(argc, argv, "d:a:e:lhnr:I:D:B:sS:a:X:L:N")) != EOF) {
+ 		switch(ch) {
+ 
+ #ifdef	AUTHENTICATE
+@@ -210,6 +211,10 @@
+ 			keepalive = 0;
+ 			break;
+ 
++                case 'N':
++                        lookupself = 0;
++                        break;
++
+ #ifdef	SecurID
+ 		case 's':
+ 			/* SecurID required */
+@@ -393,6 +398,7 @@
+ #endif
+ 	fprintf(stderr, " [-L login_program]");
+ 	fprintf(stderr, " [-n]");
++	fprintf(stderr, " [-N]");
+ #ifdef	SecurID
+ 	fprintf(stderr, " [-s]");
+ #endif
+@@ -691,15 +697,20 @@
+ 
+ 		memset(&hints, '\0', sizeof(hints));
+ 		hints.ai_socktype = SOCK_STREAM;
+-		hints.ai_flags = AI_ADDRCONFIG;
++		hints.ai_flags = AI_CANONNAME;
+ 
+ 		gethostname(host_name, sizeof(host_name));
+-		if ((e = getaddrinfo(host_name, NULL, &hints, &res)) != 0) {
+-			if(e != EAI_AGAIN) {
+-				fprintf(stderr, "getaddrinfo: localhost %s\n", 
+-				        gai_strerror(e));
+-				exit(1);
+-			}
++                /*
++                 * Optionally canonicalize the local host name, in case
++                 * gethostname() returns foo, we want foo.example.com
++                 */
++		if (lookupself &&
++                    (e = getaddrinfo(host_name, NULL, &hints, &res)) == 0) {
++                        if (res->ai_canonname) {
++                                strncpy(host_name, res->ai_canonname,
++                                                        sizeof(host_name)-1);
++                                host_name[sizeof(host_name)-1] = 0;
++                        }
+ 		}
+ 		if(res)
+ 			freeaddrinfo(res);
+--- netkit-telnet-0.17.orig/telnetd/telnetd.8.reallynodns	2009-03-12 14:54:54.000000000 -0700
++++ netkit-telnet-0.17.orig/telnetd/telnetd.8	2009-03-12 14:56:58.000000000 -0700
+@@ -42,7 +42,7 @@
+ protocol server
+ .Sh SYNOPSIS
+ .Nm /usr/sbin/in.telnetd
+-.Op Fl hns
++.Op Fl hnNs
+ .Op Fl a Ar authmode
+ .Op Fl D Ar debugmode
+ .Op Fl L Ar loginprg
+@@ -175,6 +175,10 @@
+ if the client is still there, so that idle connections
+ from machines that have crashed or can no longer
+ be reached may be cleaned up.
++.It Fl N
++Do not use DNS to canonicalize the local hostname;
++.Fn gethostname 2
++returns a fully qualified name.
+ .It Fl s
+ This option is only enabled if
+ .Nm telnetd
diff --git a/SOURCES/telnet-0.17-8bit.patch b/SOURCES/telnet-0.17-8bit.patch
new file mode 100644
index 0000000..89818b5
--- /dev/null
+++ b/SOURCES/telnet-0.17-8bit.patch
@@ -0,0 +1,33 @@
+diff -ru netkit-telnet-0.17.orig/telnet/main.c netkit-telnet-0.17/telnet/main.c
+--- netkit-telnet-0.17.orig/telnet/main.c	2003-05-15 20:07:40.000000000 +0200
++++ netkit-telnet-0.17/telnet/main.c	2003-05-16 00:18:28.000000000 +0200
+@@ -143,7 +143,7 @@
+ 	while ((ch = getopt(argc, argv, "78DEKLS:X:ab:cde:fFk:l:n:rt:x")) != -1) {
+ 		switch(ch) {
+ 		case '8':
+-			eight = 3;	/* binary output and input */
++			binary = 3;	/* send TELNET BINARY option for output and input */
+ 			break;
+ 		case '7':
+ 			eight = 0;
+@@ -165,7 +165,7 @@
+ #endif
+ 			break;
+ 		case 'L':
+-			eight |= 2;	/* binary output only */
++			binary = 2;	/* send TELNET BINARY option for output only */
+ 			break;
+ 		case 'S':
+ 		    {
+diff -ru netkit-telnet-0.17.orig/telnet/telnet.1 netkit-telnet-0.17/telnet/telnet.1
+--- netkit-telnet-0.17.orig/telnet/telnet.1	2003-05-15 20:07:40.000000000 +0200
++++ netkit-telnet-0.17/telnet/telnet.1	2003-05-15 23:38:37.000000000 +0200
+@@ -76,6 +76,8 @@
+ .Pp
+ The options are as follows:
+ .Bl -tag -width Ds
++.It Fl 7
++Strip 8th bit on input and output. Telnet is 8-bit clean by default but doesn't send the TELNET BINARY option unless forced.
+ .It Fl 8
+ Specifies an 8-bit data path.
+ This causes an attempt to negotiate the
diff --git a/SOURCES/telnet-0.17-CAN-2005-468_469.patch b/SOURCES/telnet-0.17-CAN-2005-468_469.patch
new file mode 100644
index 0000000..57e1372
--- /dev/null
+++ b/SOURCES/telnet-0.17-CAN-2005-468_469.patch
@@ -0,0 +1,179 @@
+--- netkit-telnet-0.17/telnet/telnet.c.CAN-2005-468_469	2005-03-17 13:48:58.000000000 +0100
++++ netkit-telnet-0.17/telnet/telnet.c	2005-03-17 14:02:27.000000000 +0100
+@@ -1310,22 +1310,66 @@
+ }
+ 
+ 
+-unsigned char slc_reply[128];
++#define SLC_REPLY_SIZE 128
++unsigned char *slc_reply;
+ unsigned char *slc_replyp;
++unsigned char *slc_replyend;
+ 
+ 	void
+ slc_start_reply(void)
+ {
++        slc_reply = (unsigned char *)malloc(SLC_REPLY_SIZE);
++        if (slc_reply == NULL) {
++/*@*/           printf("slc_start_reply: malloc()/realloc() failed!!!\n");
++                slc_reply = slc_replyp = slc_replyend = NULL;
++                return;
++	}
++
+ 	slc_replyp = slc_reply;
++	slc_replyend = slc_reply + SLC_REPLY_SIZE;
+ 	*slc_replyp++ = IAC;
+ 	*slc_replyp++ = SB;
+ 	*slc_replyp++ = TELOPT_LINEMODE;
+ 	*slc_replyp++ = LM_SLC;
+ }
+ 
++static int
++slc_assure_buffer(int want_len);
++
++	static int
++slc_assure_buffer(int want_len)
++{
++        if ((slc_replyp + want_len) >= slc_replyend) {
++                int len;
++		int old_len = slc_replyp - slc_reply;
++		unsigned char *p;
++
++                len = old_len
++			+ (want_len / SLC_REPLY_SIZE + 1) * SLC_REPLY_SIZE;
++                p = (unsigned char *)realloc(slc_reply, len);
++                if (p == NULL)
++                        free(slc_reply);
++                slc_reply = p;
++                if (slc_reply == NULL) {
++/*@*/                   printf("slc_add_reply: realloc() failed!!!\n");
++                        slc_reply = slc_replyp = slc_replyend = NULL;
++                        return 1;
++                }
++                slc_replyp = slc_reply + old_len;
++                slc_replyend = slc_reply + len;
++        }
++	return 0;
++}
++
+ 	void
+ slc_add_reply(unsigned char func, unsigned char flags, cc_t value)
+ {
++	if (slc_assure_buffer(6))
++		return;
++
++	if (slc_replyp == NULL)
++		return;
++
+ 	if ((*slc_replyp++ = func) == IAC)
+ 		*slc_replyp++ = IAC;
+ 	if ((*slc_replyp++ = flags) == IAC)
+@@ -1339,6 +1383,12 @@
+ {
+     int len;
+ 
++    if (slc_assure_buffer(2))
++	return;
++
++    if (slc_replyp == NULL)
++	return;
++
+     *slc_replyp++ = IAC;
+     *slc_replyp++ = SE;
+     len = slc_replyp - slc_reply;
+@@ -1456,7 +1506,7 @@
+ 	}
+ }
+ 
+-#define	OPT_REPLY_SIZE	256
++#define	OPT_REPLY_SIZE	1024
+ unsigned char *opt_reply;
+ unsigned char *opt_replyp;
+ unsigned char *opt_replyend;
+@@ -1490,10 +1540,38 @@
+ env_opt_start_info(void)
+ {
+ 	env_opt_start();
+-	if (opt_replyp)
++	if (opt_replyp && (opt_replyp > opt_reply))
+ 	    opt_replyp[-1] = TELQUAL_INFO;
+ }
+ 
++static int
++env_opt_assure_buffer(int want_len);
++
++	static int
++env_opt_assure_buffer(int want_len)
++{
++        if ((opt_replyp + want_len) >= opt_replyend) {
++		int len;
++		unsigned char *p;
++		int old_len = opt_replyp - opt_reply;
++
++		len = old_len
++			+ (want_len / OPT_REPLY_SIZE + 1) * OPT_REPLY_SIZE;
++		p = (unsigned char *)realloc(opt_reply, len);
++		if (p == NULL)
++			free(opt_reply);
++		opt_reply = p;
++		if (opt_reply == NULL) {
++/*@*/			printf("env_opt_add: realloc() failed!!!\n");
++			opt_reply = opt_replyp = opt_replyend = NULL;
++			return 1;
++		}
++		opt_replyp = opt_reply + old_len;
++		opt_replyend = opt_reply + len;
++	}
++	return 0;
++}
++
+ 	void
+ env_opt_add(unsigned char *ep)
+ {
+@@ -1515,25 +1593,12 @@
+ 		return;
+ 	}
+ 	vp = env_getvalue(ep, 1);
+-	if (opt_replyp + (vp ? strlen((char *)vp) : 0) +
+-				strlen((char *)ep) + 6 > opt_replyend)
+-	{
+-		int len;
+-		unsigned char *p;
+-		opt_replyend += OPT_REPLY_SIZE;
+-		len = opt_replyend - opt_reply;
+-		p = (unsigned char *)realloc(opt_reply, len);
+-		if (p == NULL)
+-			free(opt_reply);
+-		opt_reply = p;
+-		if (opt_reply == NULL) {
+-/*@*/			printf("env_opt_add: realloc() failed!!!\n");
+-			opt_reply = opt_replyp = opt_replyend = NULL;
+-			return;
+-		}
+-		opt_replyp = opt_reply + len - (opt_replyend - opt_replyp);
+-		opt_replyend = opt_reply + len;
+-	}
++
++	/* use the double length in case it gots escaped */
++	if (env_opt_assure_buffer((vp ? strlen((char *)vp)*2 : 0) +
++				strlen((char *)ep)*2 + 6))
++		return;
++
+ 	if (opt_welldefined((char *)ep))
+ #ifdef	OLD_ENVIRON
+ 		if (telopt_environ == TELOPT_OLD_ENVIRON)
+@@ -1588,8 +1653,14 @@
+ {
+ 	int len;
+ 
++        if (opt_reply == NULL)          /*XXX*/
++                return;                 /*XXX*/
++
++
+ 	len = opt_replyp - opt_reply + 2;
+ 	if (emptyok || len > 6) {
++		if (env_opt_assure_buffer(2))
++			return;
+ 		*opt_replyp++ = IAC;
+ 		*opt_replyp++ = SE;
+ 		if (NETROOM() > len) {
diff --git a/SOURCES/telnet-0.17-argv.patch b/SOURCES/telnet-0.17-argv.patch
new file mode 100644
index 0000000..6f71bed
--- /dev/null
+++ b/SOURCES/telnet-0.17-argv.patch
@@ -0,0 +1,12 @@
+diff -ur netkit-telnet-0.17/telnetd/setproctitle.c netkit-telnet-0.17.new/telnetd/setproctitle.c
+--- netkit-telnet-0.17/telnetd/setproctitle.c	1999-12-11 00:06:39.000000000 +0100
++++ netkit-telnet-0.17.new/telnetd/setproctitle.c	2004-06-28 16:48:51.153514392 +0200
+@@ -139,7 +139,7 @@
+ 	(void) strcpy(Argv[0], buf);
+ 	p = &Argv[0][i];
+ 	while (p < LastArgv)
+-		*p++ = ' ';
++		*p++ = '\0';
+ 	Argv[1] = NULL;
+ }
+ 
diff --git a/SOURCES/telnet-0.17-cleanup_race.patch b/SOURCES/telnet-0.17-cleanup_race.patch
new file mode 100644
index 0000000..bc3c0f5
--- /dev/null
+++ b/SOURCES/telnet-0.17-cleanup_race.patch
@@ -0,0 +1,11 @@
+--- netkit-telnet-0.17/telnetd/telnetd.c.cleanup_race	2005-01-11 18:39:49.578123000 -0500
++++ netkit-telnet-0.17/telnetd/telnetd.c	2005-01-11 18:42:45.909616000 -0500
+@@ -1081,6 +1081,8 @@
+ 	if (FD_ISSET(p, &obits) && (pfrontp - pbackp) > 0)
+ 	    ptyflush();
+     }
++    /* to avoid a race for wtmp lock */
++    signal(SIGCHLD, SIG_IGN);
+     cleanup(0);
+ }  /* end of telnet */
+ 	
diff --git a/SOURCES/telnet-0.17-conf.patch b/SOURCES/telnet-0.17-conf.patch
new file mode 100644
index 0000000..512f104
--- /dev/null
+++ b/SOURCES/telnet-0.17-conf.patch
@@ -0,0 +1,23 @@
+--- netkit-telnet-0.17/configure.confverb	2000-07-29 20:00:29.000000000 +0200
++++ netkit-telnet-0.17/configure	2004-07-05 10:50:36.492963840 +0200
+@@ -263,14 +263,19 @@
+ cat <<EOF >__conftest.cc
+ #include <unistd.h>
+ #include <signal.h>
+-int count=0;
++volatile int count=0;
+ void handle(int foo) { count++; }
+ int main() {
++    sigset_t sset;
+     int pid=getpid();
++    sigemptyset(&sset);
++    sigaddset(&sset, SIGINT);
++    sigprocmask(SIG_UNBLOCK, &sset, NULL);
+     signal(SIGINT, handle);
+     kill(pid,SIGINT);
+     kill(pid,SIGINT);
+     kill(pid,SIGINT);
++    sleep(1);
+     if (count!=3) return 1;
+     return 0;
+ }
diff --git a/SOURCES/telnet-0.17-env.patch b/SOURCES/telnet-0.17-env.patch
new file mode 100644
index 0000000..88e7c01
--- /dev/null
+++ b/SOURCES/telnet-0.17-env.patch
@@ -0,0 +1,84 @@
+--- netkit-telnet-0.17-pre-20000204/telnet/commands.c.env	Thu Apr  8 19:30:20 1999
++++ netkit-telnet-0.17-pre-20000204/telnet/commands.c	Tue May 16 17:19:47 2000
+@@ -1815,11 +1815,11 @@
+ }
+ 
+ 	unsigned char *
+-env_getvalue(unsigned char *var)
++env_getvalue(unsigned char *var, int exported_only)
+ {
+-	struct env_lst *ep;
++	struct env_lst *ep = env_find(var);
+ 
+-	if ((ep = env_find(var)))
++	if (ep && (!exported_only || ep->export))
+ 		return(ep->value);
+ 	return(NULL);
+ }
+--- netkit-telnet-0.17-pre-20000204/telnet/telnet.c.env	Tue May 16 17:19:47 2000
++++ netkit-telnet-0.17-pre-20000204/telnet/telnet.c	Tue May 16 17:19:47 2000
+@@ -438,7 +438,7 @@
+ #endif
+ 
+ 	    case TELOPT_XDISPLOC:	/* X Display location */
+-		if (env_getvalue((unsigned char *)"DISPLAY"))
++		if (env_getvalue((unsigned char *)"DISPLAY", 0))
+ 		    new_state_ok = 1;
+ 		break;
+ 
+@@ -693,7 +693,7 @@
+ 		resettermname = 0;
+ 		if (tnamep && tnamep != unknown)
+ 			free(tnamep);
+-		if ((tname = (char *)env_getvalue((unsigned char *)"TERM")) &&
++		if ((tname = (char *)env_getvalue((unsigned char *)"TERM", 0)) &&
+ 				(setupterm(tname, 1, &errret) == 0)) {
+ 			tnamep = mklist(ttytype, tname);
+ 		} else {
+@@ -870,7 +870,7 @@
+ 	    unsigned char temp[50], *dp;
+ 	    int len;
+ 
+-	    if ((dp = env_getvalue((unsigned char *)"DISPLAY")) == NULL) {
++	    if ((dp = env_getvalue((unsigned char *)"DISPLAY", 0)) == NULL) {
+ 		/*
+ 		 * Something happened, we no longer have a DISPLAY
+ 		 * variable.  So, turn off the option.
+@@ -1527,7 +1527,7 @@
+ 			env_opt_add(ep);
+ 		return;
+ 	}
+-	vp = env_getvalue(ep);
++	vp = env_getvalue(ep, 1);
+ 	if (opt_replyp + (vp ? strlen((char *)vp) : 0) +
+ 				strlen((char *)ep) + 6 > opt_replyend)
+ 	{
+@@ -2170,7 +2170,7 @@
+ 	send_will(TELOPT_LINEMODE, 1);
+ 	send_will(TELOPT_NEW_ENVIRON, 1);
+ 	send_do(TELOPT_STATUS, 1);
+-	if (env_getvalue((unsigned char *)"DISPLAY"))
++	if (env_getvalue((unsigned char *)"DISPLAY", 0))
+ 	    send_will(TELOPT_XDISPLOC, 1);
+ 	if (binary)
+ 	    tel_enter_binary(binary);
+--- netkit-telnet-0.17-pre-20000204/telnet/externs.h.env	Mon Feb  8 15:56:11 1999
++++ netkit-telnet-0.17-pre-20000204/telnet/externs.h	Tue May 16 17:19:47 2000
+@@ -203,7 +203,7 @@
+ void env_send (unsigned char *);
+ void env_list (void);
+ unsigned char * env_default(int init, int welldefined);
+-unsigned char * env_getvalue(unsigned char *var);
++unsigned char * env_getvalue(unsigned char *var, int exported_only);
+ 
+ void set_escape_char(char *s);
+ unsigned long sourceroute(char *arg, char **cpp, int *lenp);
+@@ -335,7 +335,7 @@
+ void     env_opt_end (int);
+ 
+ unsigned char     *env_default (int, int);
+-unsigned char     *env_getvalue (unsigned char *);
++unsigned char     *env_getvalue (unsigned char *, int);
+ 
+ int get_status (void);
+ int dosynch (void);
diff --git a/SOURCES/telnet-0.17-errno_test_sys_bsd.patch b/SOURCES/telnet-0.17-errno_test_sys_bsd.patch
new file mode 100644
index 0000000..9a4fcba
--- /dev/null
+++ b/SOURCES/telnet-0.17-errno_test_sys_bsd.patch
@@ -0,0 +1,24 @@
+diff -up netkit-telnet-0.17/telnet/sys_bsd.c.errnosysbsd netkit-telnet-0.17/telnet/sys_bsd.c
+--- netkit-telnet-0.17/telnet/sys_bsd.c.errnosysbsd	2007-09-20 10:57:58.000000000 +0200
++++ netkit-telnet-0.17/telnet/sys_bsd.c	2007-09-20 11:10:08.000000000 +0200
+@@ -375,6 +375,7 @@ TerminalNewMode(int f)
+     int onoff;
+     int old;
+     cc_t esc;
++    int err;
+ 
+     globalmode = f&~MODE_FORCE;
+     if (prevmode == f)
+@@ -407,6 +408,12 @@ TerminalNewMode(int f)
+ 	    tcsetattr(tin, TCSADRAIN, &tmp_tc);
+ #endif	/* USE_TERMIO */
+ 	    old = ttyflush(SYNCHing|flushout);
++            if (old < 0) {
++	      err = errno;
++              if (! ((err == EINTR) || (err == EAGAIN) || (err == ENOSPC))) {
++                break;
++              }
++            }
+ 	} while (old < 0 || old > 1);
+     }
+ 
diff --git a/SOURCES/telnet-0.17-issue.patch b/SOURCES/telnet-0.17-issue.patch
new file mode 100644
index 0000000..c00df43
--- /dev/null
+++ b/SOURCES/telnet-0.17-issue.patch
@@ -0,0 +1,81 @@
+--- netkit-telnet-0.17/telnetd/utility.c.issue	Sun Dec 12 09:59:45 1999
++++ netkit-telnet-0.17/telnetd/utility.c	Wed Jul 18 11:14:11 2001
+@@ -460,13 +460,13 @@
+ 	putlocation = where;
+ 
+ 	while (*cp) {
+-		if (*cp != '%') {
++		if (*cp != '%' && *cp != '\\') {
+ 			putchr(*cp++);
+ 			continue;
+ 		}
+ 		switch (*++cp) {
+ 
+-		case 't':
++		case 'l':
+ 			slash = strrchr(line, '/');
+ 			if (slash == NULL)
+ 				putstr(line);
+@@ -474,21 +474,28 @@
+ 				putstr(slash+1);
+ 			break;
+ 
++		case 'n':
+ 		case 'h':
+ 			putstr(editedhost);
+ 			break;
+ 
++		case 't':
+ 		case 'd':
+ 			(void)time(&t);
+ 			(void)strftime(db, sizeof(db), fmtstr, localtime(&t));
+ 			putstr(db);
+ 			break;
+ 
++		case '\\':
++			putchr('\\');
++			break;
++			  
+ 		case '%':
+ 			putchr('%');
+ 			break;
+ 
+ 		case 'D':
++		case 'o':
+ 			{
+ 				char	buff[128];
+ 
+@@ -515,7 +522,7 @@
+ 							c = fgetc(fp);
+ 						} while (c != EOF && c != '\n');
+ 						continue;
+-					} else if (c == '%') {
++					} else if (c == '%' || c == '\\') {
+ 						buff[0] = c;
+ 						c = fgetc(fp);
+ 						if (c == EOF) break;
+--- netkit-telnet-0.17/telnetd/issue.net.5.issue	Sun Jul 30 19:57:09 2000
++++ netkit-telnet-0.17/telnetd/issue.net.5	Wed Jul 18 11:03:09 2001
+@@ -15,16 +15,17 @@
+ .Pa /etc/issue.net
+ is a text file which contains a message or system identification to be
+ printed before the login prompt of a telnet session. It may contain
+-various `%-char' sequences. The following sequences are supported by
++various `%-char' (or, alternatively, '\\-char') sequences. The following
++sequences are supported by
+ .Ic telnetd :
+ .Bl -tag -offset indent -compact -width "abcde"
+-.It %t
++.It %l
+ - show the current tty
+-.It %h
++.It %h, %n
+ - show the system node name (FQDN)
+-.It %D
++.It %D, %o
+ - show the name of the NIS domain
+-.It %d
++.It %d, %t
+ - show the current time and date
+ .It %s
+ - show the name of the operating system
diff --git a/SOURCES/telnet-0.17-pek.patch b/SOURCES/telnet-0.17-pek.patch
new file mode 100644
index 0000000..0f4c400
--- /dev/null
+++ b/SOURCES/telnet-0.17-pek.patch
@@ -0,0 +1,37 @@
+diff -u telnet/commands.c telnet.new/commands.c
+--- telnet/commands.c	Sat Sep  1 12:55:18 2001
++++ telnet.new/commands.c	Sat Sep  1 12:54:36 2001
+@@ -2354,6 +2354,7 @@
+ 	hints.ai_flags = AI_CANONNAME;
+ 	if (portp == NULL) {
+ 		portp = "telnet";
++		telnetport = 1;
+ 	} else if (*portp == '-') {
+ 		portp++;
+ 		telnetport = 1;
+@@ -2397,7 +2398,6 @@
+ 	    if (error) {
+ 	        warn("%s: %s", aliasp, gai_strerror(error));
+ 	        close(net);
+-	        freeaddrinfo(ares);
+ 	        continue;
+ 	    }
+ 	    if (bind(net, ares->ai_addr, ares->ai_addrlen) < 0) {
+@@ -2414,7 +2414,7 @@
+ 		perror("setsockopt (IP_OPTIONS)");
+ #endif
+ #if	defined(IPPROTO_IP) && defined(IP_TOS)
+-	{
++	if (res->ai_family == AF_INET) {
+ # if	defined(HAS_GETTOS)
+ 	    struct tosent *tp;
+ 	    if (tos < 0 && (tp = gettosbyname("telnet", "tcp")))
+@@ -2438,7 +2438,7 @@
+ 	    char hbuf[NI_MAXHOST];
+ 	    
+ 	    if (getnameinfo(res->ai_addr, res->ai_addrlen, hbuf, sizeof(hbuf),
+-		    NULL, 0, NI_NUMERICHOST) != 0) {
++		    NULL, 0, niflags) != 0) {
+ 	        strcpy(hbuf, "(invalid)");
+ 	    }
+ 	    fprintf(stderr, "telnet: connect to address %s: %s\n", hbuf,
diff --git a/SOURCES/telnet-0.17-sa-01-49.patch b/SOURCES/telnet-0.17-sa-01-49.patch
new file mode 100644
index 0000000..64ed23c
--- /dev/null
+++ b/SOURCES/telnet-0.17-sa-01-49.patch
@@ -0,0 +1,208 @@
+diff -up netkit-telnet-0.17/telnetd/ext.h.sa-01-49 netkit-telnet-0.17/telnetd/ext.h
+--- netkit-telnet-0.17/telnetd/ext.h.sa-01-49	1999-12-12 15:59:44.000000000 +0100
++++ netkit-telnet-0.17/telnetd/ext.h	2011-01-20 22:39:54.000000000 +0100
+@@ -86,7 +86,10 @@ extern char *neturg;		/* one past last b
+ extern int pcc, ncc;
+ 
+ /* printf into netobuf */
+-void netoprintf(const char *fmt, ...) __attribute((format (printf, 1, 2))); 
++/* void netoprintf(const char *fmt, ...) __attribute((format (printf, 1, 2))); */
++#define netoprintf output_data
++int	output_data(const char *, ...) __attribute((format (printf, 1, 2))); 
++void	output_datalen(const char *, int);
+ 
+ extern int pty, net;
+ extern char *line;
+@@ -182,7 +185,10 @@ void tty_setsofttab(int);
+ void tty_tspeed(int);
+ void willoption(int);
+ void wontoption(int);
++
++#if 0
+ void writenet(unsigned char *, int);
++#endif
+ 
+ #if defined(ENCRYPT)
+ extern void (*encrypt_output)(unsigned char *, int);
+diff -up netkit-telnet-0.17/telnetd/slc.c.sa-01-49 netkit-telnet-0.17/telnetd/slc.c
+--- netkit-telnet-0.17/telnetd/slc.c.sa-01-49	1999-12-12 15:59:44.000000000 +0100
++++ netkit-telnet-0.17/telnetd/slc.c	2011-01-20 22:39:54.000000000 +0100
+@@ -183,7 +183,7 @@ int end_slc(unsigned char **bufp) {
+ 	else {
+ 	    snprintf(slcbuf+slcoff, sizeof(slcbuf)-slcoff, "%c%c", IAC, SE);
+ 	    slcoff += 2;
+-	    writenet(slcbuf, slcoff);
++	    output_datalen(slcbuf, slcoff);
+ 	    netflush();  /* force it out immediately */
+ 	}
+     }
+diff -up netkit-telnet-0.17/telnetd/state.c.sa-01-49 netkit-telnet-0.17/telnetd/state.c
+--- netkit-telnet-0.17/telnetd/state.c.sa-01-49	1999-12-12 20:41:44.000000000 +0100
++++ netkit-telnet-0.17/telnetd/state.c	2011-01-20 22:43:34.000000000 +0100
+@@ -37,6 +37,7 @@
+ char state_rcsid[] = 
+   "$Id: state.c,v 1.12 1999/12/12 19:41:44 dholland Exp $";
+ 
++#include <stdarg.h>
+ #include "telnetd.h"
+ 
+ int not42 = 1;
+@@ -1365,7 +1366,7 @@ void send_status(void) {
+     ADD(IAC);
+     ADD(SE);
+ 
+-    writenet(statusbuf, ncp - statusbuf);
++    output_datalen(statusbuf, ncp - statusbuf);
+     netflush();	/* Send it on its way */
+ 
+     DIAG(TD_OPTIONS, {printsub('>', statusbuf, ncp - statusbuf); netflush();});
+diff -up netkit-telnet-0.17/telnetd/termstat.c.sa-01-49 netkit-telnet-0.17/telnetd/termstat.c
+--- netkit-telnet-0.17/telnetd/termstat.c.sa-01-49	1999-12-12 15:59:45.000000000 +0100
++++ netkit-telnet-0.17/telnetd/termstat.c	2011-01-20 22:39:54.000000000 +0100
+@@ -128,7 +128,6 @@ static int _terminit = 0;
+ 	void
+ localstat()
+ {
+-	void netflush();
+ 	int need_will_echo = 0;
+ 
+ 	/*
+diff -up netkit-telnet-0.17/telnetd/utility.c.sa-01-49 netkit-telnet-0.17/telnetd/utility.c
+--- netkit-telnet-0.17/telnetd/utility.c.sa-01-49	2011-01-20 22:39:54.000000000 +0100
++++ netkit-telnet-0.17/telnetd/utility.c	2011-01-20 22:48:02.000000000 +0100
+@@ -38,8 +38,10 @@ char util_rcsid[] = 
+   "$Id: utility.c,v 1.11 1999/12/12 14:59:45 dholland Exp $";
+ 
+ #define PRINTOPTIONS
++#define _GNU_SOURCE
+ 
+ #include <stdarg.h>
++#include <stdio.h>
+ #include <sys/utsname.h>
+ 
+ #ifdef AUTHENTICATE
+@@ -52,6 +54,53 @@ char util_rcsid[] = 
+  * utility functions performing io related tasks
+  */
+ 
++/*
++ * This function appends data to nfrontp and advances nfrontp.
++ * Returns the number of characters written altogether (the
++ * buffer may have been flushed in the process).
++ */
++
++int
++output_data(const char *format, ...)
++{
++	va_list args;
++	int len;
++	char *buf;
++
++	va_start(args, format);
++	if ((len = vasprintf(&buf, format, args)) == -1)
++		return -1;
++	output_datalen(buf, len);
++	va_end(args);
++	free(buf);
++	return (len);
++}
++
++void
++output_datalen(const char *buf, int len)
++{
++	int remaining, copied;
++	
++	remaining = BUFSIZ - (nfrontp - netobuf);
++	while (len > 0) {
++		/* Free up enough space if the room is too low*/
++		if ((len > BUFSIZ ? BUFSIZ : len) > remaining) {
++			netflush();
++			remaining = BUFSIZ - (nfrontp - netobuf);
++		}
++
++		/* Copy out as much as will fit */
++		copied = remaining > len ? len : remaining;
++		memmove(nfrontp, buf, copied);
++		nfrontp += copied;
++		len -= copied;
++		remaining -= copied;
++		buf += copied;
++	}
++	return;
++}
++
++/**
+ void
+ netoprintf(const char *fmt, ...)
+ {
+@@ -67,7 +116,7 @@ netoprintf(const char *fmt, ...)
+       va_end(ap);
+ 
+       if (len<0 || len==maxsize) {
+-	 /* didn't fit */
++		/ * did not fit * /
+ 	 netflush();
+       }
+       else {
+@@ -76,6 +125,7 @@ netoprintf(const char *fmt, ...)
+    }
+    nfrontp += len;
+ }
++*/
+ 
+ /*
+  * ttloop
+@@ -273,10 +323,15 @@ netflush(void)
+     int n;
+ 
+     if ((n = nfrontp - nbackp) > 0) {
++
++#if 0
++	/* XXX This causes output_data() to recurse and die */
+ 	DIAG(TD_REPORT,
+ 	    { netoprintf("td: netflush %d chars\r\n", n);
+ 	      n = nfrontp - nbackp;  /* update count */
+ 	    });
++#endif
++
+ #if	defined(ENCRYPT)
+ 	if (encrypt_output) {
+ 		char *s = nclearto ? nclearto : nbackp;
+@@ -310,11 +365,14 @@ netflush(void)
+ 	    }
+ 	}
+     }
+-    if (n < 0) {
+-	if (errno == EWOULDBLOCK || errno == EINTR)
+-		return;
+-	cleanup(0);
+-    }
++
++	 if (n == -1) {
++		if (errno == EWOULDBLOCK || errno == EINTR)
++		  return;
++		cleanup(0);
++		/* NOTREACHED */
++	 }
++
+     nbackp += n;
+ #if	defined(ENCRYPT)
+     if (nbackp > nclearto)
+@@ -332,7 +390,7 @@ netflush(void)
+     return;
+ }  /* end of netflush */
+ 
+-
++#if 0
+ /*
+  * writenet
+  *
+@@ -355,7 +413,7 @@ void writenet(register unsigned char *pt
+ 	nfrontp += len;
+ 
+ }  /* end of writenet */
+-
++#endif
+ 
+ /*
+  * miscellaneous functions doing a variety of little jobs follow ...
diff --git a/SOURCES/telnet-client-cvs.patch b/SOURCES/telnet-client-cvs.patch
new file mode 100644
index 0000000..5fc57a7
--- /dev/null
+++ b/SOURCES/telnet-client-cvs.patch
@@ -0,0 +1,1721 @@
+diff -uNr telnet/Makefile telnet.obsd-cvs/Makefile
+--- telnet/Makefile	Mon Jul 27 18:25:13 1998
++++ telnet.obsd-cvs/Makefile	Sat Mar 10 10:54:26 2001
+@@ -36,22 +36,20 @@
+ 
+ PROG=	telnet
+ 
+-CFLAGS+=-DTERMCAP -DKLUDGELINEMODE -DUSE_TERMIO -DSKEY -Dunix
+-CFLAGS+=-DENV_HACK -D_USE_OLD_CURSES_
++CFLAGS+=-DKLUDGELINEMODE -DUSE_TERMIO -DENV_HACK -DSKEY -Dunix
+ CFLAGS+=-I${.CURDIR}/../../lib
+-LDADD+=	-locurses -ltelnet
+-DPADD=	${LIBOLDCURSES} ${LIBTELNET}
++LDADD+=	-lcurses -ltelnet
++DPADD=	${LIBCURSES} ${LIBTELNET
+ 
+ SRCS=	authenc.c commands.c main.c network.c ring.c sys_bsd.c telnet.c \
+ 	terminal.c tn3270.c utilities.c
+ 
+ .include <bsd.own.mk> # for KERBEROS
+ 
+-.if (${KERBEROS} == "yes")
++.if (${KERBEROS:L} == "yes")
+ CFLAGS+=-DENCRYPTION -DAUTHENTICATION -DKRB4
+ LDADD+= -lkrb -ldes
+ DPADD+= ${LIBDES} ${LIBKRB}
+ .endif
+ 
+ .include <bsd.prog.mk>
+-
+diff -uNr telnet/commands.c telnet.obsd-cvs/commands.c
+--- telnet/commands.c	Fri Apr  9 02:30:20 1999
++++ telnet.obsd-cvs/commands.c	Sat Mar 10 10:51:22 2001
+@@ -1,4 +1,4 @@
+-/*	$OpenBSD: commands.c,v 1.20 1999/01/04 07:55:05 art Exp $	*/
++/*	$OpenBSD: commands.c,v 1.34 2000/11/08 21:49:44 aaron Exp $	*/
+ /*	$NetBSD: commands.c,v 1.14 1996/03/24 22:03:48 jtk Exp $	*/
+ 
+ /*
+@@ -69,7 +69,7 @@
+ 	int status;
+ 
+ 	if(argc != 3) {
+-		printf("%s sequence challenge\n", argv[0]);
++		printf("usage: %s sequence challenge\n", argv[0]);
+ 		return 0;
+ 	}
+ 
+@@ -2175,17 +2175,19 @@
+     int gotmachine = 0;
+     int l1 = strlen(m1);
+     int l2 = strlen(m2);
+-    char m1save[64];
++    char m1save[MAXHOSTNAMELEN];
+ 
+     if (skiprc)
+ 	return;
+ 
+-    strcpy(m1save, m1);
++    strncpy(m1save, m1, sizeof(m1save));
+     m1 = m1save;
+ 
+     if (rcname[0] == 0) {
+ 	char *home = getenv("HOME");
+ 
++	if (home == NULL || *home == '\0')
++	    return;
+ 	snprintf (rcname, sizeof(rcname), "%s/.telnetrc",
+ 		  home ? home : "");
+     }
+@@ -2248,15 +2250,9 @@
+     int
+ tn(int argc, char *argv[])
+ {
+-    struct hostent *host = 0, *alias = 0;
+-#if defined(AF_INET6)
+-    struct sockaddr_in6 sin6;
+-#endif
++    struct addrinfo hints, *res, *res0;
++    int error;
+     struct sockaddr_in sin;
+-    struct sockaddr_in ladr;
+-    struct sockaddr *sa;
+-    int sa_size;
+-    struct servent *sp = 0;
+     unsigned long temp;
+ #if !defined(__linux__)
+     extern char *inet_ntoa();
+@@ -2266,15 +2262,18 @@
+     int srlen;
+ #endif
+     char *cmd, *hostp = 0, *portp = 0, *user = 0, *aliasp = 0;
+-    int family, port = 0;
+-
++    int retry;
++#ifdef NI_WITHSCOPEID
++    const int niflags = NI_NUMERICHOST | NI_WITHSCOPEID;
++#else
++    const int niflags = NI_NUMERICHOST;
++#endif
++    
+     /* clear the socket address prior to use */
+     memset((char *)&sin, 0, sizeof(sin));
+ 
+     if (connected) {
+ 	printf("?Already connected to %s\r\n", hostname);
+-	seteuid(getuid());
+-	setuid(getuid());
+ 	return 0;
+     }
+     if (argc < 2) {
+@@ -2324,8 +2323,6 @@
+ 	}
+     usage:
+ 	printf("usage: %s [-l user] [-a] host-name [port]\r\n", cmd);
+-	seteuid(getuid());
+-	setuid(getuid());
+ 	return 0;
+     }
+     if (hostp == 0)
+@@ -2340,185 +2337,80 @@
+ 	temp = sourceroute(hostp, &srp, &srlen);
+ 	if (temp == 0) {
+ 	    herror(srp);
+-	    seteuid(getuid());
+-	    setuid(getuid());
+ 	    return 0;
+ 	} else if (temp == -1) {
+ 	    printf("Bad source route option: %s\r\n", hostp);
+-	    seteuid(getuid());
+-	    setuid(getuid());
+ 	    return 0;
+ 	} else {
+ 	    abort();
+ 	}
+-    } else {
+-#endif
+-	memset (&sin, 0, sizeof(sin));
+-#if defined(HAVE_INET_PTON) && defined(AF_INET6)
+-	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);
+-	    strcpy(_hostname, hostp);
+-	    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);
+-		strcpy(_hostname, hostp);
+-		hostname = _hostname;
+-	    } else {
+-#ifdef HAVE_GETHOSTBYNAME2
+-		host = gethostbyname2(hostp, AF_INET6);
+-		if(host == NULL)
+-		    host = gethostbyname2(hostp, AF_INET);
+-#else
+-		host = gethostbyname(hostp);
+-#endif
+-		if (host) {
+-		    strncpy(_hostname, host->h_name, sizeof(_hostname));
+-		    family = host->h_addrtype;
+-
+-		    switch(family) {
+-		    case AF_INET:
+-			memset(&sin, 0, sizeof(sin));
+-			sa_size = sizeof(sin);
+-			sa = (struct sockaddr *)&sin;
+-			sin.sin_family = family;
+-
+-			memcpy(&sin.sin_addr, *host->h_addr_list, sizeof(struct in_addr));
+-			break;
+-#if defined(AF_INET6) && defined(HAVE_STRUCT_SOCKADDR_IN6)
+-		    case AF_INET6:
+-			memset(&sin6, 0, sizeof(sin6));
+-			sa_size = sizeof(sin6);
+-			sa = (struct sockaddr *)&sin6;
+-			sin6.sin6_family = family;
+-			memcpy(&sin6.sin6_addr, *host->h_addr_list, sizeof(struct in6_addr));
+-			break;
+-#endif
+-		    default:
+-			fprintf(stderr, "Bad address family: %d\n", family);
+-			return 0;
+-		    }
+-		    
+-		    _hostname[sizeof(_hostname)-1] = '\0';
+-		    hostname = _hostname;
+-		} else {
+-		    herror(hostp);
+-		    seteuid(getuid());
+-		    setuid(getuid());
+-		    return 0;
+-		}
+-	    }
+-#if	defined(IP_OPTIONS) && defined(IPPROTO_IP)
+-    }
++    } else
+ #endif
+-    if (portp) {
+-	if (*portp == '-') {
+-	    portp++;
+-	    telnetport = 1;
+-	} else
+-	    telnetport = 0;
+-	port = atoi(portp);
+-	if (port == 0) {
+-	    sp = getservbyname(portp, "tcp");
+-	    if (sp)
+-		port = sp->s_port;
+-	    else {
+-		printf("%s: bad port number\r\n", portp);
+-		seteuid(getuid());
+-		setuid(getuid());
+-		return 0;
+-	    }
+-	} else {
+-	    port = htons(port);
+-	}
+-    } else {
+-	if (sp == 0) {
+-	    sp = getservbyname("telnet", "tcp");
+-	    if (sp == 0) {
+-		fprintf(stderr, "telnet: tcp/telnet: unknown service\r\n");
+-		seteuid(getuid());
+-		setuid(getuid());
+-		return 0;
+-	    }
+-	    port = sp->s_port;
++    {
++	hostname = hostp;
++	memset(&hints, 0, sizeof(hints));
++	hints.ai_family = PF_UNSPEC;
++	hints.ai_socktype = SOCK_STREAM;
++	hints.ai_flags = AI_CANONNAME;
++	if (portp == NULL) {
++		portp = "telnet";
++	} else if (*portp == '-') {
++		portp++;
++		telnetport = 1;
++	}
++	h_errno = 0;
++	error = getaddrinfo(hostp, portp, &hints, &res0);
++	if (error) {
++	    if (error == EAI_SERVICE)
++	        warnx("%s: bad port", portp);
++	    else
++		warnx("%s: %s", hostp, gai_strerror(error));
++	   if (h_errno)
++		herror(hostp);
++	   return 0;
+ 	}
+-	telnetport = 1;
+     }
+-    switch(family) {
+-    case AF_INET:
+-	sin.sin_port = port;
+-	printf("Trying %s...\r\n", inet_ntoa(sin.sin_addr));
+-	break;
+-#if defined(AF_INET6) && defined(HAVE_STRUCT_SOCKADDR_IN6)
+-    case AF_INET6: {
+-#ifndef INET6_ADDRSTRLEN
+-#define INET6_ADDRSTRLEN 46 
+-#endif
+ 
+-	char buf[INET6_ADDRSTRLEN];
+-
+-	sin6.sin6_port = port;
+-#ifdef HAVE_INET_NTOP
+-	printf("Trying %s...\r\n", inet_ntop(AF_INET6,
+-					     &sin6.sin6_addr,
+-					     buf,
+-					     sizeof(buf)));
+-#endif
+-	break;
+-    }
+-#endif
+-    default:
+-	abort();
+-    }
+-
+-    do {
+-	net = socket(family, SOCK_STREAM, 0);
+-	seteuid(getuid());
+-	setuid(getuid());
+-	if (net < 0) {
+-	    perror("telnet: socket");
+-	    return 0;
++    net = -1;
++    retry = 0;
++    for (res = res0; res; res = res->ai_next) {
++	if (1 /* retry */) {
++	    char hbuf[NI_MAXHOST];
++	    
++	    if (getnameinfo(res->ai_addr, res->ai_addrlen, hbuf, sizeof(hbuf),
++	            NULL, 0, niflags) != 0) {
++		strcpy(hbuf, "(invalid)");
++	    }
++	    printf("Trying %s...\r\n", hbuf);
+ 	}
++	net = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
++	if (net < 0)
++	    continue;
++	    
+ 	if (aliasp) {
+-	    memset ((caddr_t)&ladr, 0, sizeof (ladr));
+-	    temp = inet_addr(aliasp);
+-	    if (temp != INADDR_NONE) {
+-	        ladr.sin_addr.s_addr = temp;
+-	        ladr.sin_family = AF_INET;
+-	        alias = gethostbyaddr((char *)&temp, sizeof(temp), AF_INET);
+-	    } else {
+-	        alias = gethostbyname(aliasp);
+-	        if (alias) {
+-		    ladr.sin_family = alias->h_addrtype;
+-#if	defined(h_addr)		/* In 4.3, this is a #define */
+-		    memmove((caddr_t)&ladr.sin_addr,
+-			alias->h_addr_list[0], alias->h_length);
+-#else	/* defined(h_addr) */
+-		    memmove((caddr_t)&ladr.sin_addr, alias->h_addr,
+-			alias->h_length);
+-#endif	/* defined(h_addr) */
+-	        } else {
+-		    herror(aliasp);
+-		    return 0;
+-	        }
++	    struct addrinfo ahints, *ares;
++	    memset(&ahints, 0, sizeof(ahints));
++	    ahints.ai_family = PF_UNSPEC;
++	    ahints.ai_socktype = SOCK_STREAM;
++	    ahints.ai_flags = AI_PASSIVE;
++	    error = getaddrinfo(aliasp, "0", &ahints, &ares);
++	    if (error) {
++	        warn("%s: %s", aliasp, gai_strerror(error));
++	        close(net);
++	        freeaddrinfo(ares);
++	        continue;
+ 	    }
+-            ladr.sin_port = htons(0);
+-  
+-            if (bind (net, (struct sockaddr *)&ladr, sizeof(ladr)) < 0) {
+-                perror(aliasp);; 
++	    if (bind(net, ares->ai_addr, ares->ai_addrlen) < 0) {
++	        perror(aliasp);
+                 (void) close(net);   /* dump descriptor */
+-		return 0;
++		freeaddrinfo(ares);
++		continue;
+             }
++	    freeaddrinfo(ares);
+         }
+  #if	defined(IP_OPTIONS) && defined(IPPROTO_IP)
+-	if (srp && setsockopt(net, IPPROTO_IP, IP_OPTIONS, (char *)srp, srlen) < 0)
++	if (srp && res->ai_family == AF_INET
++	 && setsockopt(net, IPPROTO_IP, IP_OPTIONS, (char *)srp, srlen) < 0)
+ 		perror("setsockopt (IP_OPTIONS)");
+ #endif
+ #if	defined(IPPROTO_IP) && defined(IP_TOS)
+@@ -2542,65 +2434,32 @@
+ 		perror("setsockopt (SO_DEBUG)");
+ 	}
+ 
+-	if (connect(net, sa, sa_size) < 0) {
+-	    int retry = 0;
+-
+-	    if (host && host->h_addr_list[1]) {
+-		int oerrno = errno;
+-	        retry = 1;
+-
+-		switch(family) {
+-		case AF_INET :
+-		    fprintf(stderr, "telnet: connect to address %s: ",
+-			    inet_ntoa(sin.sin_addr));
+-		    ++host->h_addr_list;
+-		    memcpy(&sin.sin_addr, *host->h_addr_list, sizeof(struct in_addr));
+-		    break;
+-#if defined(AF_INET6) && defined(HAVE_STRUCT_SOCKADDR_IN6)
+-		case AF_INET6: {
+-		    char buf[INET6_ADDRSTRLEN];
+-
+-		    fprintf(stderr, "telnet: connect to address %s: ",
+-			    inet_ntop(AF_INET6, &sin6.sin6_addr, buf,
+-				      sizeof(buf)));
+-		    ++host->h_addr_list;
+-		    memcpy(&sin6.sin6_addr, *host->h_addr_list, sizeof(struct in6_addr));
+-		    break;
+-		}
+-#endif
+-		default:
+-		    abort();
+-		}
+-                   
+-		errno = oerrno;
+-		perror(NULL);
+-
+-		switch(family) {
+-		case AF_INET :
+-			printf("Trying %s...\r\n", inet_ntoa(sin.sin_addr));
+-			break;
+-#if defined(AF_INET6) && defined(HAVE_STRUCT_SOCKADDR_IN6)
+-		case AF_INET6: {
+-		    printf("Trying %s...\r\n", inet_ntop(AF_INET6,
+-					     &sin6.sin6_addr,
+-					     buf,
+-					     sizeof(buf)));
+-		    break;
+-		}
+-#endif
+-		}
+-		
+-		(void) NetClose(net);
+-		continue;
++	if (connect(net, res->ai_addr, res->ai_addrlen) < 0) {
++	    char hbuf[NI_MAXHOST];
++	    
++	    if (getnameinfo(res->ai_addr, res->ai_addrlen, hbuf, sizeof(hbuf),
++		    NULL, 0, NI_NUMERICHOST) != 0) {
++	        strcpy(hbuf, "(invalid)");
+ 	    }
+-	    perror("telnet: Unable to connect to remote host");
+-	    return 0;
++	    fprintf(stderr, "telnet: connect to address %s: %s\n", hbuf,
++	        strerror(errno));
++	
++	    close(net);
++	    net = -1;
++	    retry++;
++	    continue;
+ 	}
++
+ 	connected++;
+ #if	defined(AUTHENTICATION) || defined(ENCRYPTION)
+ 	auth_encrypt_connect(connected);
+ #endif	/* defined(AUTHENTICATION) */
+-    } while (connected == 0);
++	break;
++    }
++    freeaddrinfo(res0);
++    if (net < 0) {
++        return 0;
++    }
+     cmdrc(hostp, hostname);
+     if (autologin && user == NULL) {
+ 	struct passwd *pw;
+@@ -2652,6 +2511,9 @@
+         encrypthelp[] = "turn on (off) encryption ('encrypt ?' for more)",
+ #endif
+ 	zhelp[] =	"suspend telnet",
++#ifdef SKEY
++	skeyhelp[] =	"compute response to s/key challenge",
++#endif
+ 	shellhelp[] =	"invoke a subshell",
+ 	envhelp[] =	"change environment variables ('environ ?' for more)",
+ 	modestring[] = "try to enter line or character mode ('mode ?' for more)";
+@@ -2690,7 +2552,7 @@
+ 	{ "environ",	envhelp,	env_cmd,	0 },
+ 	{ "?",		helphelp,	help,		0 },
+ #if	defined(SKEY)
+-	{ "skey",	NULL,		skey_calc,	0 },
++	{ "skey",	skeyhelp,	skey_calc,	0 },
+ #endif		
+ 	{ 0,		0,		0,		0 }
+ };
+diff -uNr telnet/externs.h telnet.obsd-cvs/externs.h
+--- telnet/externs.h	Mon Feb  8 22:56:11 1999
++++ telnet.obsd-cvs/externs.h	Sat Mar 10 10:54:35 2001
+@@ -1,4 +1,4 @@
+-/*	$OpenBSD: externs.h,v 1.4 1998/03/12 17:31:32 deraadt Exp $	*/
++/*	$OpenBSD: externs.h,v 1.5 1998/03/12 2001/01/22 11:03:38 fgsch Exp $	*/
+ /* $KTH: externs.h,v 1.16 1997/11/29 02:28:35 joda Exp $ */
+ 
+ /*
+@@ -447,7 +447,7 @@
+     *Ibackp,           /* Oldest byte of 3270 data */
+     Ibuf[],            /* 3270 buffer */
+     *Ifrontp,          /* Where next 3270 byte goes */
+-    tline[],
++    tline[200],
+     *transcom;         /* Transparent command */
+ 
+ extern int
+diff -uNr telnet/main.c telnet.obsd-cvs/main.c
+--- telnet/main.c	Wed Apr  7 23:23:35 1999
++++ telnet.obsd-cvs/main.c	Sat Mar 10 09:59:35 2001
+@@ -1,4 +1,4 @@
+-/*	$OpenBSD: main.c,v 1.7 1998/05/15 03:16:38 art Exp $	*/
++/*	$OpenBSD: main.c,v 1.10 2001/01/21 22:46:37 aaron Exp $	*/
+ /*	$NetBSD: main.c,v 1.5 1996/02/28 21:04:05 thorpej Exp $	*/
+ 
+ /*
+@@ -81,10 +81,10 @@
+ 	    prompt,
+ #ifdef	AUTHENTICATION
+ 	    "[-8] [-E] [-K] [-L] [-S tos] [-X atype] [-a] [-c] [-d] [-e char]",
+-	    "\n\t[-k realm] [-l user] [-f/-F] [-n tracefile] [-b hostalias ]",
++	    "\n\t[-k realm] [-l user] [-f/-F] [-n tracefile] [-b hostalias ] ",
+ #else
+ 	    "[-8] [-E] [-L] [-S tos] [-a] [-c] [-d] [-e char] [-l user]",
+-	    "\n\t[-n tracefile] [-b hostalias ]",
++	    "\n\t[-n tracefile] [-b hostalias ] ",
+ #endif
+ #if defined(TN3270) && defined(unix)
+ # ifdef AUTHENTICATION
+@@ -95,13 +95,11 @@
+ #else
+ 	    "[-r] ",
+ #endif
++	    "\n\r "
+ #ifdef ENCRYPTION
+-	    "[-x] [host-name [port]]"
+-#else
+-
+-	    "[host-name [port]]"
++	    "[-x] " 
+ #endif
+-	);
++	    "[host-name [port]]");
+ 	exit(1);
+ }
+ 
+@@ -276,8 +274,8 @@
+ 			break;
+ 		case 't':
+ #if defined(TN3270) && defined(unix)
++			(void)strncpy(tline, optarg, sizeof(tline));
+ 			transcom = tline;
+-			(void)strcpy(transcom, optarg);
+ #else
+ 			fprintf(stderr,
+ 			   "%s: Warning: -t ignored, no TN3270 support.\n",
+diff -uNr telnet/sys_bsd.c telnet.obsd-cvs/sys_bsd.c
+--- telnet/sys_bsd.c	Wed Apr  7 21:38:31 1999
++++ telnet.obsd-cvs/sys_bsd.c	Sat Mar 10 10:55:18 2001
+@@ -1,4 +1,4 @@
+-/*	$OpenBSD: sys_bsd.c,v 1.6 1998/12/28 11:13:51 deraadt Exp $	*/
++/*	$OpenBSD: sys_bsd.c,v 1.8 2000/10/10 15:41:10 millert Exp $	*/
+ /*	$NetBSD: sys_bsd.c,v 1.11 1996/02/28 21:04:10 thorpej Exp $	*/
+ 
+ /*
+@@ -35,6 +35,7 @@
+  */
+ 
+ #include "telnet_locl.h"
++#include <err.h>
+ 
+ /*
+  * The following routines try to encapsulate what is system dependent
+@@ -198,9 +199,10 @@
+ TerminalFlushOutput(void)
+ {
+ #ifdef	TIOCFLUSH
+-    (void) ioctl(fileno(stdout), TIOCFLUSH, (char *) 0);
++    int com = FWRITE;
++    (void) ioctl(fileno(stdout), TIOCFLUSH, (int *) &com);
+ #else
+-    (void) ioctl(fileno(stdout), TCFLSH, (char *) 0);
++    (void) ioctl(fileno(stdout), TCFLSH, (int *) 0);
+ #endif
+ }
+ 
+diff -uNr telnet/telnet.c telnet.obsd-cvs/telnet.c
+--- telnet/telnet.c	Wed Apr  7 23:22:14 1999
++++ telnet.obsd-cvs/telnet.c	Sat Mar 10 11:02:34 2001
+@@ -1,4 +1,4 @@
+-/*	$OpenBSD: telnet.c,v 1.6 1998/07/27 15:29:29 millert Exp $	*/
++/*	$OpenBSD: telnet.c,v 1.11 2000/11/10 15:33:13 provos millert Exp $	*/
+ /*	$NetBSD: telnet.c,v 1.7 1996/02/28 21:04:15 thorpej Exp $	*/
+ 
+ /*
+@@ -35,6 +35,8 @@
+  */
+ 
+ #include "telnet_locl.h"
++#include <curses.h>
++#include <term.h>
+ 
+ #define        strip(x) (eight ? (x) : ((x) & 0x7f))
+ 
+@@ -523,10 +525,9 @@
+ }
+ 
+ /*
+- * Given a buffer returned by tgetent(), this routine will turn
+- * the pipe seperated list of names in the buffer into an array
+- * of pointers to null terminated names.  We toss out any bad,
+- * duplicate, or verbose names (names with spaces).
++ * This routine will turn a pipe seperated list of names in the buffer
++ * into an array of pointers to NUL terminated names.  We toss out any
++ * bad, duplicate, or verbose names (names with spaces).
+  */
+ 
+ int is_unique P((char *, char **, char **));
+@@ -554,7 +555,7 @@
+ 	/*
+ 	 * Count up the number of names.
+ 	 */
+-	for (n = 1, cp = buf; *cp && *cp != ':'; cp++) {
++	for (n = 1, cp = buf; *cp; cp++) {
+ 		if (*cp == '|')
+ 			n++;
+ 	}
+@@ -659,25 +660,6 @@
+ 	return (1);
+ }
+ 
+-static char termbuf[1024];
+-
+-int telnet_setupterm	P((char *tname, int fd, int *errp)); /* XXX move elsewhere */
+-	/*ARGSUSED*/
+-	int
+-telnet_setupterm(char *tname, int fd, int *errp)
+-{
+-	(void)fd;
+-	if (tgetent(termbuf, tname) == 1) {
+-		termbuf[1023] = '\0';
+-		if (errp)
+-			*errp = 1;
+-		return(0);
+-	}
+-	if (errp)
+-		*errp = 0;
+-	return(-1);
+-}
+-
+ int resettermname = 1;
+ 
+ char *gettermname P((void));	/* XXX move elsewhere */
+@@ -687,15 +669,15 @@
+ 	char *tname;
+ 	static char **tnamep = 0;
+ 	static char **next;
+-	int err;
++	int errret;
+ 
+ 	if (resettermname) {
+ 		resettermname = 0;
+ 		if (tnamep && tnamep != unknown)
+ 			free(tnamep);
+ 		if ((tname = (char *)env_getvalue((unsigned char *)"TERM")) &&
+-				(telnet_setupterm(tname, 1, &err) == 0)) {
+-			tnamep = mklist(termbuf, tname);
++				(setupterm(tname, 1, &errret) == 0)) {
++			tnamep = mklist(ttytype, tname);
+ 		} else {
+ 			if (tname && ((int)strlen(tname) <= 40)) {
+ 				unknown[0] = tname;
+@@ -1482,10 +1464,15 @@
+ 	void
+ env_opt_start(void)
+ {
+-	if (opt_reply)
+-		opt_reply = (unsigned char *)realloc(opt_reply, OPT_REPLY_SIZE);
+-	else
+-		opt_reply = (unsigned char *)malloc(OPT_REPLY_SIZE);
++	unsigned char *p;
++	
++	if (opt_reply) {
++		p = (unsigned char *)realloc(opt_reply, OPT_REPLY_SIZE);
++		if (p == NULL)
++			free(opt_reply);
++	} else
++		p = (unsigned char *)malloc(OPT_REPLY_SIZE);
++	opt_reply = p;	
+ 	if (opt_reply == NULL) {
+ /*@*/		printf("env_opt_start: malloc()/realloc() failed!!!\n");
+ 		opt_reply = opt_replyp = opt_replyend = NULL;
+@@ -1532,9 +1519,13 @@
+ 				strlen((char *)ep) + 6 > opt_replyend)
+ 	{
+ 		int len;
++		unsigned char *p;
+ 		opt_replyend += OPT_REPLY_SIZE;
+ 		len = opt_replyend - opt_reply;
+-		opt_reply = (unsigned char *)realloc(opt_reply, len);
++		p = (unsigned char *)realloc(opt_reply, len);
++		if (p == NULL)
++			free(opt_reply);
++		opt_reply = p;
+ 		if (opt_reply == NULL) {
+ /*@*/			printf("env_opt_add: realloc() failed!!!\n");
+ 			opt_reply = opt_replyp = opt_replyend = NULL;
+@@ -1945,7 +1936,7 @@
+ 				command(0, "z\n", 2);
+ 				continue;
+ 			}
+-			if (sc == escape) {
++			if (sc == escape && escape != _POSIX_VDISABLE) {
+ 				command(0, (char *)tbp, tcc);
+ 				bol = 1;
+ 				count += tcc;
+@@ -1962,7 +1953,7 @@
+ 		}
+ 		if ((sc == '\n') || (sc == '\r'))
+ 			bol = 1;
+-	} else if (sc == escape) {
++	} else if (sc == escape && escape != _POSIX_VDISABLE) {
+ 	    /*
+ 	     * Double escape is a pass through of a single escape character.
+ 	     */
+diff -uNr telnet/telnet_locl.h telnet.obsd-cvs/telnet_locl.h
+--- telnet/telnet_locl.h	Thu Mar 12 06:57:44 1998
++++ telnet.obsd-cvs/telnet_locl.h	Sat Mar 10 11:12:37 2001
+@@ -1,4 +1,4 @@
+-/*	$OpenBSD: telnet_locl.h,v 1.1 1998/03/12 04:57:44 art Exp $	*/
++/*	$OpenBSD: telnet_locl.h,v 1.2 1999/12/11 09:08:09 itojun Exp $	*/
+ /* $KTH: telnet_locl.h,v 1.13 1997/11/03 21:37:55 assar Exp $ */
+ 
+ /*
+@@ -86,7 +86,5 @@
+ #include "defines.h"
+ #include "types.h"
+ 
+-#undef AF_INET6 /* XXX - it has not been tested and it doesn't exist yet */
+-
+ /* prototypes */
+ 
+diff -uNr libtelnet/kerberos.c libtelnet.obsd-cvs/kerberos.c
+--- libtelnet/kerberos.c	Mon Feb  8 23:38:17 1999
++++ libtelnet.obsd-cvs/kerberos.c	Sat Mar 10 11:11:03 2001
+@@ -320,11 +320,10 @@
+ 	    char ts[MAXPATHLEN];
+ 	    struct passwd *pw = getpwnam(UserNameRequested);
+ 
+-	    if(pw){
++	    if (pw) {
+ 		snprintf(ts, sizeof(ts),
+-			 "%s%u",
+-			 TKT_ROOT,
+-			 (unsigned)pw->pw_uid);
++			"%s%u", TKT_ROOT, (unsigned)pw->pw_uid);
++		/* XXX allocation failure? */
+ 		setenv("KRBTKFILE", ts, 1);
+ 	    }
+ 	    Data(ap, KRB_ACCEPT, NULL, 0);
+@@ -609,16 +608,26 @@
+ {
+     unsigned char *p = buf;
+     
+-    p += krb_put_nir(cred->service, cred->instance, cred->realm, p);
++    memcpy (p, cred->service, ANAME_SZ);
++    p += ANAME_SZ;
++    memcpy (p, cred->instance, INST_SZ);
++    p += INST_SZ;
++    memcpy (p, cred->realm, REALM_SZ);
++    p += REALM_SZ;
+     memcpy(p, cred->session, 8);
+     p += 8;
+     *p++ = cred->lifetime;
+     *p++ = cred->kvno;
+-    p += krb_put_int(cred->ticket_st.length, p, 4);
++    p += krb_put_int(cred->ticket_st.length, p, 4, 4);
+     memcpy(p, cred->ticket_st.dat, cred->ticket_st.length);
+     p += cred->ticket_st.length;
+-    p += krb_put_int(cred->issue_date, p, 4);
+-    p += krb_put_nir(cred->pname, cred->pinst, NULL, p);
++    p += krb_put_int(cred->issue_date, p, 4, 4);
++    strncpy (cred->pname, p, ANAME_SZ);
++    cred->pname[ANAME_SZ - 1] = '\0';
++    p += ANAME_SZ;
++    strncpy (cred->pinst, p, INST_SZ);
++    cred->pinst[INST_SZ - 1] = '\0';
++    p += INST_SZ;
+     return p - buf;
+ }
+ 
+@@ -627,7 +636,16 @@
+ {
+     unsigned char *p = buf;
+ 
+-    p += krb_get_nir(p, cred->service, cred->instance, cred->realm);
++    strncpy (cred->service, p, ANAME_SZ);
++    cred->service[ANAME_SZ - 1] = '\0';
++    p += ANAME_SZ;
++    strncpy (cred->instance, p, INST_SZ);
++    cred->instance[INST_SZ - 1] = '\0';
++    p += INST_SZ;
++    strncpy (cred->realm, p, REALM_SZ);
++    cred->realm[REALM_SZ - 1] = '\0';
++    p += REALM_SZ;
++
+     memcpy(cred->session, p, 8);
+     p += 8;
+     cred->lifetime = *p++;
+@@ -636,7 +654,10 @@
+     memcpy(cred->ticket_st.dat, p, cred->ticket_st.length);
+     cred->ticket_st.mbz = 0;
+     p += krb_get_int(p, (u_int32_t *)&cred->issue_date, 4, 0);
+-    p += krb_get_nir(p, cred->pname, cred->pinst, NULL);
++    p += krb_get_nir(p, 
++		    cred->pname, sizeof(cred->pname),
++		    cred->pinst, sizeof(cred->pinst),
++		    NULL, 0);
+     return 0;
+ }
+ 
+--- telnet/telnet.1	Thu Nov 12 01:01:46 1998
++++ telnet.obsd-cvs/telnet.1	Thu Nov  9 19:52:41 2000
+@@ -1,4 +1,4 @@
+-.\"	$OpenBSD: telnet.1,v 1.14 1998/11/11 23:01:46 aaron Exp $
++.\"	$OpenBSD: telnet.1,v 1.27 2000/11/09 17:52:41 aaron Exp $
+ .\"	$NetBSD: telnet.1,v 1.5 1996/02/28 21:04:12 thorpej Exp $
+ .\"
+ .\" Copyright (c) 1983, 1990, 1993
+@@ -36,45 +36,34 @@
+ .\"
+ .Dd February 3, 1994
+ .Dt TELNET 1
+-.Os BSD 4.2
++.Os
+ .Sh NAME
+ .Nm telnet
+-.Nd user interface to the 
++.Nd user interface to the
+ .Tn TELNET
+ protocol
+ .Sh SYNOPSIS
+ .Nm telnet
+-.Op Fl 8
+-.Op Fl E
+-.Op Fl F
+-.Op Fl K
+-.Op Fl L
+-.Op Fl S Ar tos
++.Op Fl 8EFKLacdfrx
+ .Op Fl X Ar authtype
+-.Op Fl a
+ .Op Fl b Ar hostalias
+-.Op Fl c
+-.Op Fl d
+ .Op Fl e Ar escapechar
+-.Op Fl f
+ .Op Fl k Ar realm
+ .Op Fl l Ar user
+ .Op Fl n Ar tracefile
+-.Op Fl r
+-.Op Fl x
+ .Oo
+ .Ar host
+ .Op Ar port
+ .Oc
+ .Sh DESCRIPTION
+ The
+-.Nm telnet
++.Nm
+ command
+-is used to communicate with another host using the 
++is used to communicate with another host using the
+ .Tn TELNET
+ protocol.
+ If
+-.Nm telnet
++.Nm
+ is invoked without the
+ .Ar host
+ argument, it enters command mode,
+@@ -85,11 +74,11 @@
+ .Ic open
+ command with those arguments.
+ .Pp
+-Options:
+-.Bl -tag -width indent
++The options are as follows:
++.Bl -tag -width Ds
+ .It Fl 8
+-Specifies an 8-bit data path.  This causes an attempt to
+-negotiate the
++Specifies an 8-bit data path.
++This causes an attempt to negotiate the
+ .Dv TELNET BINARY
+ option on both input and output.
+ .It Fl E
+@@ -103,18 +92,9 @@
+ .It Fl K
+ Specifies no automatic login to the remote system.
+ .It Fl L
+-Specifies an 8-bit data path on output.  This causes the
+-BINARY option to be negotiated on output.
+-.It Fl S Ar tos
+-Sets the IP type-of-service (TOS) option for the telnet
+-connection to the value
+-.Ar tos ,
+-which can be a numeric TOS value
+-or, on systems that support it, a symbolic
+-TOS name found in the
+-.Pa /etc/iptos
+-file.
+-.It Fl X Ar atype 
++Specifies an 8-bit data path on output.
++This causes the BINARY option to be negotiated on output.
++.It Fl X Ar atype
+ Disables the
+ .Ar atype
+ type of authentication.
+@@ -144,7 +124,8 @@
+ .It Fl c
+ Disables the reading of the user's
+ .Pa \&.telnetrc
+-file.  (See the
++file.
++(See the
+ .Ic toggle skiprc
+ command on this man page.)
+ .It Fl d
+@@ -152,7 +133,7 @@
+ .Ic debug
+ toggle to
+ .Dv TRUE .
+-.It Fl e Ar escapechar 
++.It Fl e Ar escapechar
+ Sets the initial
+ .Nm
+ escape character to
+@@ -169,14 +150,14 @@
+ If Kerberos authentication is being used, the
+ .Fl k
+ option requests that
+-.Nm telnet
++.Nm
+ obtain tickets for the remote host in
+ realm
+ .Ar realm
+ instead of the remote host's realm, as determined
+ by
+ .Xr krb_realmofhost 3 .
+-.It Fl l Ar user 
++.It Fl l Ar user
+ When connecting to the remote system, if the remote system
+ understands the
+ .Ev ENVIRON
+@@ -189,7 +170,7 @@
+ This option may also be used with the
+ .Ic open
+ command.
+-.It Fl n Ar tracefile 
++.It Fl n Ar tracefile
+ Opens
+ .Ar tracefile
+ for recording trace information.
+@@ -210,35 +191,38 @@
+ Indicates the official name, an alias, or the Internet address
+ of a remote host.
+ .It Ar port
+-Indicates a port number (address of an application).  If a number is
+-not specified, the default
+-.Nm telnet
++Indicates a port number (address of an application).
++If a number is not specified, the default
++.Nm
+ port is used.
+ .El
+ .Pp
+-When in rlogin mode, a line of the form ~.  disconnects from the
++When in rlogin mode, a line of the form ~.
++disconnects from the
+ remote host; ~ is the telnet escape character.
+ Similarly, the line ~^Z suspends the telnet session.
+ The line ~^] escapes to the normal telnet escape prompt.
+ .Pp
+ Once a connection has been opened,
+-.Nm telnet
++.Nm
+ will attempt to enable the
+ .Dv TELNET LINEMODE
+ option.
+ If this fails,
+-.Nm telnet
++.Nm
+ will revert to one of two input modes:
+ either ``character at a time''
+ or ``old line by line''
+ depending on what the remote system supports.
+ .Pp
+-When 
++When
+ .Dv LINEMODE
+ is enabled, character processing is done on the
+-local system, under the control of the remote system.  When input
++local system, under the control of the remote system.
++When input
+ editing or character echoing is to be disabled, the remote system
+-will relay that information.  The remote system will also relay
++will relay that information.
++The remote system will also relay
+ changes to any special characters that happen on the remote
+ system, so that they can take effect on the local system.
+ .Pp
+@@ -252,7 +236,7 @@
+ (this would mostly be used to enter passwords
+ without the password being echoed).
+ .Pp
+-If the 
++If the
+ .Dv LINEMODE
+ option is enabled, or if the
+ .Ic localchars
+@@ -267,7 +251,7 @@
+ characters are trapped locally, and sent as
+ .Tn TELNET
+ protocol sequences to the remote side.
+-If 
++If
+ .Dv LINEMODE
+ has ever been enabled, then the user's
+ .Ic susp
+@@ -278,9 +262,9 @@
+ protocol sequences,
+ and
+ .Ic quit
+-is sent as a 
++is sent as a
+ .Dv TELNET ABORT
+-instead of 
++instead of
+ .Dv BREAK .
+ There are options (see
+ .Ic toggle
+@@ -296,17 +280,26 @@
+ (in the case of
+ .Ic quit
+ and
+-.Ic intr  ) .
++.Ic intr ) .
+ .Pp
+ While connected to a remote host,
+-.Nm telnet
++.Nm
+ command mode may be entered by typing the
+-.Nm telnet
++.Nm
+ ``escape character'' (initially ``^]'').
+ When in command mode, the normal terminal editing conventions are available.
++Note that the escape character will return to the command mode of the initial
++invocation of
++.Nm
++that has the controlling terminal.
++Use the
++.Cm send escape
++command to switch to command mode in subsequent
++.Nm
++processes on remote hosts.
+ .Pp
+ The following
+-.Nm telnet
++.Nm
+ commands are available.
+ Only enough of each command to uniquely identify it need be typed
+ (this is also true for arguments to the
+@@ -320,26 +313,28 @@
+ .Ic display
+ commands).
+ .Bl -tag -width "mode type"
+-.It Ic auth Ar argument Op Ar ... 
++.It Ic auth Ar argument Op Ar ...
+ The
+ .Ic auth
+ command manipulates the information sent through the
+ .Dv TELNET AUTHENTICATE
+-option.  Valid arguments for the
+-auth command are as follows:
++option.
++Valid arguments for the
++.Ic auth
++command are as follows:
+ .Bl -tag -width "disable type"
+ .It Ic disable Ar type
+ Disables the specified
+ .Ar type
+-of authentication.  To
+-obtain a list of available types, use the
++of authentication.
++To obtain a list of available types, use the
+ .Ic auth disable \&?
+ command.
+ .It Ic enable Ar type
+ Enables the specified
+ .Ar type
+-of authentication.  To
+-obtain a list of available types, use the
++of authentication.
++To obtain a list of available types, use the
+ .Ic auth enable \&?
+ command.
+ .It Ic status
+@@ -350,7 +345,7 @@
+ Close a
+ .Tn TELNET
+ session and return to command mode.
+-.It Ic display Ar argument Op Ar ... 
++.It Ic display Ar argument Op Ar ...
+ Displays all, or some, of the
+ .Ic set
+ and
+@@ -368,26 +363,27 @@
+ .It Ic disable Ar type Ic [input|output]
+ Disables the specified
+ .Ar type
+-of encryption.  If you
+-omit
++of encryption.
++If you omit
+ .Ic input
+ and
+ .Ic output ,
+ both input and output
+-are disabled.  To obtain a list of available
+-types, use the
++are disabled.
++To obtain a list of available types, use the
+ .Ic encrypt disable \&?
+ command.
+ .It Ic enable Ar type Ic [input|output]
+ Enables the specified
+ .Ar type
+-of encryption.  If you
+-omit
++of encryption.
++If you omit
+ .Ic input
+ and
+ .Ic output ,
+ both input and output are
+-enabled.  To obtain a list of available types, use the
++enabled.
++To obtain a list of available types, use the
+ .Ic encrypt enable \&?
+ command.
+ .It Ic input
+@@ -407,18 +403,20 @@
+ .Ic encrypt stop output
+ command.
+ .It Ic start Ic [input|output]
+-Attempts to start encryption.  If you omit
++Attempts to start encryption.
++If you omit
+ .Ic input
+ and
+-.Ic output,
+-both input and output are enabled.  To
+-obtain a list of available types, use the
++.Ic output ,
++both input and output are enabled.
++To obtain a list of available types, use the
+ .Ic encrypt enable \&?
+ command.
+ .It Ic status
+ Lists the current status of encryption.
+ .It Ic stop Ic [input|output]
+-Stops encryption.  If you omit
++Stops encryption.
++If you omit
+ .Ic input
+ and
+ .Ic output ,
+@@ -431,7 +429,7 @@
+ .Ic encrypt stop
+ commands.
+ .El
+-.It Ic environ Ar arguments Op Ar ... 
++.It Ic environ Ar arguments Op Ar ...
+ The
+ .Ic environ
+ command is used to manipulate the
+@@ -456,7 +454,7 @@
+ .Ic environ
+ command are:
+ .Bl -tag -width Fl
+-.It Ic define Ar variable value 
++.It Ic define Ar variable value
+ Define the variable
+ .Ar variable
+ to have a value of
+@@ -466,15 +464,15 @@
+ .Ar value
+ may be enclosed in single or double quotes so
+ that tabs and spaces may be included.
+-.It Ic undefine Ar variable 
++.It Ic undefine Ar variable
+ Remove
+ .Ar variable
+ from the list of environment variables.
+-.It Ic export Ar variable 
++.It Ic export Ar variable
+ Mark the variable
+ .Ar variable
+ to be exported to the remote side.
+-.It Ic unexport Ar variable 
++.It Ic unexport Ar variable
+ Mark the variable
+ .Ar variable
+ to not be exported unless
+@@ -508,7 +506,7 @@
+ suspending a user's session for later reattachment,
+ the logout argument indicates that you
+ should terminate the session immediately.
+-.It Ic mode Ar type 
++.It Ic mode Ar type
+ .Ar type
+ is one of several options, depending on the state of the
+ .Tn TELNET
+@@ -529,40 +527,40 @@
+ option, or, if the remote side does not understand the
+ .Dv LINEMODE
+ option, then attempt to enter ``old-line-by-line'' mode.
+-.It Ic isig Pq Ic \-isig 
+-Attempt to enable (disable) the 
++.It Ic isig Pq Ic \-isig
++Attempt to enable (disable) the
+ .Dv TRAPSIG
+-mode of the 
++mode of the
+ .Dv LINEMODE
+ option.
+-This requires that the 
++This requires that the
+ .Dv LINEMODE
+ option be enabled.
+-.It Ic edit Pq Ic \-edit 
+-Attempt to enable (disable) the 
++.It Ic edit Pq Ic \-edit
++Attempt to enable (disable) the
+ .Dv EDIT
+-mode of the 
++mode of the
+ .Dv LINEMODE
+ option.
+-This requires that the 
++This requires that the
+ .Dv LINEMODE
+ option be enabled.
+-.It Ic softtabs Pq Ic \-softtabs 
+-Attempt to enable (disable) the 
++.It Ic softtabs Pq Ic \-softtabs
++Attempt to enable (disable) the
+ .Dv SOFT_TAB
+-mode of the 
++mode of the
+ .Dv LINEMODE
+ option.
+-This requires that the 
++This requires that the
+ .Dv LINEMODE
+ option be enabled.
+-.It Ic litecho Pq Ic \-litecho 
+-Attempt to enable (disable) the 
++.It Ic litecho Pq Ic \-litecho
++Attempt to enable (disable) the
+ .Dv LIT_ECHO
+-mode of the 
++mode of the
+ .Dv LINEMODE
+ option.
+-This requires that the 
++This requires that the
+ .Dv LINEMODE
+ option be enabled.
+ .It Ic \&?
+@@ -579,7 +577,7 @@
+ Open a connection to the named host.
+ If no port number
+ is specified,
+-.Nm telnet
++.Nm
+ will attempt to contact a
+ .Tn TELNET
+ server at the default port.
+@@ -594,24 +592,29 @@
+ .Ev ENVIRON
+ option.
+ When connecting to a non-standard port,
+-.Nm telnet
++.Nm
+ omits any automatic initiation of
+ .Tn TELNET
+-options.  When the port number is preceded by a minus sign,
++options.
++When the port number is preceded by a minus sign,
+ the initial option negotiation is done.
+ After establishing a connection, the file
+ .Pa \&.telnetrc
+ in the
+-user's home directory is opened.  Lines beginning with a ``#'' are
+-comment lines.  Blank lines are ignored.  Lines that begin
+-without white space are the start of a machine entry.  The
+-first thing on the line is the name of the machine that is
+-being connected to.  The rest of the line, and successive
+-lines that begin with white space are assumed to be
+-.Nm telnet
++user's home directory is opened.
++Lines beginning with a ``#'' are
++comment lines.
++Blank lines are ignored.
++Lines that begin
++without whitespace are the start of a machine entry.
++The first thing on the line is the name of the machine that is
++being connected to.
++The rest of the line, and successive
++lines that begin with whitespace are assumed to be
++.Nm
+ commands and are processed as if they had been typed
+ in manually to the
+-.Nm telnet
++.Nm
+ command prompt.
+ .It Ic quit
+ Close any open
+@@ -619,7 +622,7 @@
+ session and exit
+ .Nm telnet .
+ An end-of-file (in command mode) will also close a session and exit.
+-.It Ic send Ar arguments 
++.It Ic send Ar arguments
+ Sends one or more special character sequences to the remote host.
+ The following are the arguments which may be specified
+ (more than one argument may be specified at a time):
+@@ -673,7 +676,7 @@
+ sequence.
+ .It Ic escape
+ Sends the current
+-.Nm telnet
++.Nm
+ escape character (initially ``^]'').
+ .It Ic ga
+ Sends the
+@@ -788,12 +791,12 @@
+ .Ic send
+ command.
+ .El
+-.It Ic set Ar argument value 
+-.It Ic unset Ar argument value 
++.It Ic set Ar argument value
++.It Ic unset Ar argument value
+ The
+ .Ic set
+ command will set any one of a number of
+-.Nm telnet
++.Nm
+ variables to a specific value or to
+ .Dv TRUE .
+ The special value
+@@ -811,7 +814,8 @@
+ .Ic display
+ command.
+ The variables which may be set or unset, but not toggled, are
+-listed here.  In addition, any of the variables for the
++listed here.
++In addition, any of the variables for the
+ .Ic toggle
+ command may be explicitly set or unset using
+ the
+@@ -832,7 +836,8 @@
+ sequence (see
+ .Ic send ayt
+ preceding) is sent to the
+-remote host.  The initial value for the "Are You There"
++remote host.
++The initial value for the "Are You There"
+ character is the terminal's status character.
+ .It Ic echo
+ This is the value (initially ``^E'') which, when in
+@@ -841,7 +846,7 @@
+ echoing of entered characters (for entering, say, a password).
+ .It Ic eof
+ If
+-.Nm telnet
++.Nm
+ is operating in
+ .Dv LINEMODE
+ or ``old line by line'' mode, entering this character
+@@ -854,7 +859,7 @@
+ character.
+ .It Ic erase
+ If
+-.Nm telnet
++.Nm
+ is in
+ .Ic localchars
+ mode (see
+@@ -862,7 +867,7 @@
+ .Ic localchars
+ below),
+ and if
+-.Nm telnet
++.Nm
+ is operating in ``character at a time'' mode, then when this
+ character is typed, a
+ .Dv TELNET EC
+@@ -879,14 +884,14 @@
+ character.
+ .It Ic escape
+ This is the
+-.Nm telnet
++.Nm
+ escape character (initially ``^['') which causes entry
+ into
+-.Nm telnet
++.Nm
+ command mode (when connected to a remote system).
+ .It Ic flushoutput
+ If
+-.Nm telnet
++.Nm
+ is in
+ .Ic localchars
+ mode (see
+@@ -916,12 +921,13 @@
+ .Dv LINEMODE ,
+ these are the
+ characters that, when typed, cause partial lines to be
+-forwarded to the remote system.  The initial value for
++forwarded to the remote system.
++The initial value for
+ the forwarding characters are taken from the terminal's
+ eol and eol2 characters.
+ .It Ic interrupt
+ If
+-.Nm telnet
++.Nm
+ is in
+ .Ic localchars
+ mode (see
+@@ -945,7 +951,7 @@
+ character.
+ .It Ic kill
+ If
+-.Nm telnet
++.Nm
+ is in
+ .Ic localchars
+ mode (see
+@@ -953,7 +959,7 @@
+ .Ic localchars
+ below),
+ and if
+-.Nm telnet
++.Nm
+ is operating in ``character at a time'' mode, then when this
+ character is typed, a
+ .Dv TELNET EL
+@@ -970,7 +976,7 @@
+ character.
+ .It Ic lnext
+ If
+-.Nm telnet
++.Nm
+ is operating in
+ .Dv LINEMODE
+ or ``old line by line'' mode, then this character is taken to
+@@ -985,7 +991,7 @@
+ character.
+ .It Ic quit
+ If
+-.Nm telnet
++.Nm
+ is in
+ .Ic localchars
+ mode (see
+@@ -1009,7 +1015,7 @@
+ character.
+ .It Ic reprint
+ If
+-.Nm telnet
++.Nm
+ is operating in
+ .Dv LINEMODE
+ or old line by line'' mode, then this character is taken to
+@@ -1031,8 +1037,9 @@
+ This character, at the beginning of a line, followed by
+ a "." closes the connection; when followed by a ^Z it
+ suspends the
+-.Nm telnet
+-command.  The initial state is to
++.Nm
++command.
++The initial state is to
+ disable the
+ .Ic rlogin
+ escape character.
+@@ -1066,7 +1073,7 @@
+ character.
+ .It Ic susp
+ If
+-.Nm telnet
++.Nm
+ is in
+ .Ic localchars
+ mode, or
+@@ -1093,12 +1100,13 @@
+ .Ic option
+ tracing being
+ .Dv TRUE ,
+-will be written.  If it is set to
++will be written.
++If it is set to
+ .Dq Fl ,
+ then tracing information will be written to standard output (the default).
+ .It Ic worderase
+ If
+-.Nm telnet
++.Nm
+ is operating in
+ .Dv LINEMODE
+ or ``old line by line'' mode, then this character is taken to
+@@ -1117,25 +1125,32 @@
+ .Pq Ic unset
+ commands.
+ .El
+-.It Ic slc Ar state 
++.It Ic skey Ar sequence challenge
++The
++.Ic skey
++command computes a response to the S/Key challenge.
++See
++.Xr skey 1
++for more information on the S/Key system.
++.It Ic slc Ar state
+ The
+ .Ic slc
+ command (Set Local Characters) is used to set
+ or change the state of the special
+-characters when the 
++characters when the
+ .Dv TELNET LINEMODE
+ option has
+-been enabled.  Special characters are characters that get
+-mapped to 
++been enabled.
++Special characters are characters that get mapped to
+ .Tn TELNET
+ commands sequences (like
+ .Ic ip
+ or
+-.Ic quit  )
++.Ic quit )
+ or line editing characters (like
+ .Ic erase
+ and
+-.Ic kill  ) .
++.Ic kill ) .
+ By default, the local special characters are exported.
+ .Bl -tag -width Fl
+ .It Ic check
+@@ -1144,15 +1159,15 @@
+ character settings, and if there are any discrepancies with
+ the local side, the local side will switch to the remote value.
+ .It Ic export
+-Switch to the local defaults for the special characters.  The
+-local default characters are those of the local terminal at
++Switch to the local defaults for the special characters.
++The local default characters are those of the local terminal at
+ the time when
+-.Nm telnet
++.Nm
+ was started.
+ .It Ic import
+ Switch to the remote defaults for the special characters.
+ The remote default characters are those of the remote system
+-at the time when the 
++at the time when the
+ .Tn TELNET
+ connection was established.
+ .It Ic \&?
+@@ -1165,13 +1180,13 @@
+ .Nm telnet .
+ This includes the peer one is connected to, as well
+ as the current mode.
+-.It Ic toggle Ar arguments Op Ar ... 
++.It Ic toggle Ar arguments Op Ar ...
+ Toggle (between
+ .Dv TRUE
+ and
+ .Dv FALSE )
+ various flags that control how
+-.Nm telnet
++.Nm
+ responds to events.
+ These flags may be set explicitly to
+ .Dv TRUE
+@@ -1206,7 +1221,7 @@
+ sequences; see
+ .Ic set
+ above for details),
+-.Nm telnet
++.Nm
+ refuses to display any data on the user's terminal
+ until the remote system acknowledges (via a
+ .Dv TELNET TIMING MARK
+@@ -1220,13 +1235,14 @@
+ done an "stty noflsh", otherwise
+ .Dv FALSE
+ (see
+-.Xr stty  1  ) .
++.Xr stty 1 ) .
+ .It Ic autodecrypt
+ When the
+ .Dv TELNET ENCRYPT
+ option is negotiated, by
+ default the actual encryption (decryption) of the data
+-stream does not start automatically.  The
++stream does not start automatically.
++The
+ .Ic autoencrypt
+ .Pq Ic autodecrypt
+ command states that encryption of the
+@@ -1238,7 +1254,8 @@
+ .Dv TELNET AUTHENTICATION
+ option
+ .Tn TELNET
+-attempts to use it to perform automatic authentication.  If the
++attempts to use it to perform automatic authentication.
++If the
+ .Dv AUTHENTICATION
+ option is not supported, the user's login
+ name are propagated through the
+@@ -1314,7 +1331,7 @@
+ The initial value for this toggle is
+ .Dv FALSE .
+ .It Ic debug
+-Toggles socket level debugging (useful only to the super-user).
++Toggles socket level debugging (useful only to the superuser).
+ The initial value for this toggle is
+ .Dv FALSE .
+ .It Ic encdebug
+@@ -1340,7 +1357,7 @@
+ .Ic brk ,
+ .Ic ec ,
+ and
+-.Ic el  ;
++.Ic el ;
+ see
+ .Ic send
+ above).
+@@ -1379,7 +1396,7 @@
+ .Dv FALSE .
+ .It Ic options
+ Toggles the display of some internal
+-.Nm telnet
++.Nm
+ protocol processing (having to do with
+ .Tn TELNET
+ options).
+@@ -1404,8 +1421,8 @@
+ skips the reading of the
+ .Pa \&.telnetrc
+ file in the user's home
+-directory when connections are opened.  The initial
+-value for this toggle is
++directory when connections are opened.
++The initial value for this toggle is
+ .Dv FALSE .
+ .It Ic termdata
+ Toggles the display of all terminal data (in hexadecimal format).
+@@ -1416,9 +1433,10 @@
+ .Ic verbose_encrypt
+ toggle is
+ .Dv TRUE ,
+-.Nm telnet
++.Nm
+ prints out a message each time encryption is enabled or
+-disabled.  The initial value for this toggle is
++disabled.
++The initial value for this toggle is
+ .Dv FALSE .
+ .It Ic \&?
+ Displays the legal
+@@ -1430,22 +1448,24 @@
+ .Nm telnet .
+ This command only works when the user is using the
+ .Xr csh 1 .
+-.It Ic \&! Op Ar command 
++.It Ic \&! Op Ar command
+ Execute a single command in a subshell on the local
+-system.  If
++system.
++If
+ .Ar command
+ is omitted, then an interactive
+ subshell is invoked.
+-.It Ic \&? Op Ar command 
+-Get help.  With no arguments,
+-.Nm telnet
++.It Ic \&? Op Ar command
++Get help.
++With no arguments,
++.Nm
+ prints a help summary.
+ If a command is specified,
+-.Nm telnet
++.Nm
+ will print the help information for just that command.
+ .El
+ .Sh ENVIRONMENT
+-.Nm telnet
++.Nm
+ uses at least the
+ .Ev HOME ,
+ .Ev SHELL ,
+@@ -1464,16 +1484,18 @@
+ .El
+ .Sh HISTORY
+ The
+-.Nm telnet
++.Nm
+ command appeared in
+ .Bx 4.2 .
+ .Sh NOTES
+ On some remote systems, echo has to be turned off manually when in
+ ``old line by line'' mode.
+ .Pp
+-In ``old line by line'' mode or 
++In ``old line by line'' mode or
+ .Dv LINEMODE
+ the terminal's
+ .Ic eof
+ character is only recognized (and sent to the remote system)
+ when it is the first character on a line.
++.Pp
++Source routing is not supported yet for IPv6.
diff --git a/SOURCES/telnet-gethostbyname.patch b/SOURCES/telnet-gethostbyname.patch
new file mode 100644
index 0000000..e1c1976
--- /dev/null
+++ b/SOURCES/telnet-gethostbyname.patch
@@ -0,0 +1,48 @@
+--- netkit-telnet-0.17/telnet/commands.c.old	2006-04-30 10:24:49.000000000 -0700
++++ netkit-telnet-0.17/telnet/commands.c	2006-04-30 10:37:10.000000000 -0700
+@@ -1669,9 +1669,15 @@
+ 
+ 		/* If this is not the full name, try to get it via DNS */
+ 		if (strchr(hbuf, '.') == 0) {
+-			struct hostent *he = gethostbyname(hbuf);
+-			if (he != 0)
+-				strncpy(hbuf, he->h_name, sizeof hbuf-1);
++			struct addrinfo hints;
++			struct addrinfo *res;
++			memset (&hints, '\0', sizeof (hints));
++			hints.ai_flags = AI_V4MAPPED | AI_ADDRCONFIG | AI_CANONNAME;
++			if (getaddrinfo (hbuf, NULL, &hints, &res) == 0) {
++				if (res->ai_canonname != NULL)
++					strncpy(hbuf, res->ai_canonname, sizeof hbuf-1);
++				freeaddrinfo (res);
++			}
+ 			hbuf[sizeof hbuf-1] = '\0';
+ 		}
+ 
+@@ -2832,17 +2838,15 @@
+ 		if (!c)
+ 			cp2 = 0;
+ 
+-		if ((tmp = inet_addr(cp)) != -1) {
+-			sin_addr.s_addr = tmp;
+-		} else if ((host = gethostbyname(cp))) {
+-#if	defined(h_addr)
+-			memmove((caddr_t)&sin_addr,
+-				host->h_addr_list[0], 
+-				sizeof(sin_addr));
+-#else
+-			memmove((caddr_t)&sin_addr, host->h_addr, 
+-				sizeof(sin_addr));
+-#endif
++		struct addrinfo hints;
++		memset (&hints, '\0', sizeof (hints));
++		// XXX The code here seems to allow only IPv4 addresses.
++		hints.ai_family = AF_INET;
++		hints.ai_flags = AI_ADDRCONFIG;
++		struct addrinfo *aires;
++		if (getaddrinfo (cp, NULL, &hints, &aires) == 0) {
++			sin_addr = ((struct sockaddr_in *) aires->ai_addr)->sin_addr;
++			freeaddrinfo (aires);
+ 		} else {
+ 			*cpp = cp;
+ 			return(0);
diff --git a/SOURCES/telnet-rh674942.patch b/SOURCES/telnet-rh674942.patch
new file mode 100644
index 0000000..f06d99d
--- /dev/null
+++ b/SOURCES/telnet-rh674942.patch
@@ -0,0 +1,47 @@
+--- netkit-telnet-0.17/telnetd/telnetd.c.orig	2011-01-31 12:05:37.942942871 -0600
++++ netkit-telnet-0.17/telnetd/telnetd.c	2011-01-31 18:20:22.400743499 -0600
+@@ -82,6 +82,7 @@ char	ptyibuf2[BUFSIZ];
+ int	hostinfo = 1;			/* do we print login banner? */
+ 
+ int debug = 0;
++int debugsix = 0;
+ int keepalive = 1;
+ char *loginprg = _PATH_LOGIN;
+ char *progname;
+@@ -150,8 +151,11 @@ main(int argc, char *argv[], char *env[]
+ #endif /* BFTPDAEMON */
+ 
+ 		case 'd':
+-			if (strcmp(optarg, "ebug") == 0) {
++			if (strncmp(optarg, "ebug", 4) == 0) {
+ 				debug++;
++				if (strncmp(optarg, "ebug6", 5) == 0) {
++					debugsix++;
++				}
+ 				break;
+ 			}
+ 			usage();
+@@ -271,6 +275,8 @@ main(int argc, char *argv[], char *env[]
+ 	        hints.ai_socktype = SOCK_STREAM;
+ 	        hints.ai_flags = AI_ADDRCONFIG | AI_PASSIVE;
+ 	        hints.ai_protocol = IPPROTO_TCP;
++		if (debugsix)
++			hints.ai_family = AF_INET6;
+ 
+ 	        if (argc == 0) {
+ 	            if (getaddrinfo(NULL, "telnet", &hints, &ai) != 0) {
+@@ -380,12 +386,12 @@ usage(void)
+ {
+ 	fprintf(stderr, "Usage: telnetd");
+ #ifdef	AUTHENTICATE
+-	fprintf(stderr, " [-a (debug|other|user|valid|off)]\n\t");
++	fprintf(stderr, " [-a (debug|debug6|other|user|valid|off)]\n\t");
+ #endif
+ #ifdef BFTPDAEMON
+ 	fprintf(stderr, " [-B]");
+ #endif
+-	fprintf(stderr, " [-debug]");
++	fprintf(stderr, " [-debug|-debug6]");
+ #ifdef DIAGNOSTICS
+ 	fprintf(stderr, " [-D (options|report|exercise|netdata|ptydata)]\n\t");
+ #endif
diff --git a/SOURCES/telnet-rh678324.patch b/SOURCES/telnet-rh678324.patch
new file mode 100644
index 0000000..d3cfbe9
--- /dev/null
+++ b/SOURCES/telnet-rh678324.patch
@@ -0,0 +1,21 @@
+diff -up netkit-telnet-0.17/telnetd/telnetd.c.rh678324 netkit-telnet-0.17/telnetd/telnetd.c
+--- netkit-telnet-0.17/telnetd/telnetd.c.rh678324	2011-06-28 14:51:09.996726296 +0200
++++ netkit-telnet-0.17/telnetd/telnetd.c	2011-06-28 14:52:38.212726283 +0200
+@@ -92,7 +92,7 @@ extern void usage(void);
+ int
+ main(int argc, char *argv[], char *env[])
+ {
+-	struct sockaddr from;
++	struct sockaddr_storage from;
+ 	int on = 1;
+ 	socklen_t fromlen;
+ 	register int ch;
+@@ -344,7 +344,7 @@ main(int argc, char *argv[], char *env[]
+ 
+ 	openlog("telnetd", LOG_PID | LOG_ODELAY, LOG_DAEMON);
+ 	fromlen = sizeof (from);
+-	if (getpeername(s, &from, &fromlen) < 0) {
++	if (getpeername(s, (struct sockaddr *)&from, &fromlen) < 0) {
+ 		fprintf(stderr, "%s: ", progname);
+ 		perror("getpeername");
+ 		_exit(1);
diff --git a/SOURCES/telnet-rh704604.patch b/SOURCES/telnet-rh704604.patch
new file mode 100644
index 0000000..9c040ba
--- /dev/null
+++ b/SOURCES/telnet-rh704604.patch
@@ -0,0 +1,24 @@
+--- netkit-telnet-0.17/telnet/commands.c.hostalias	2011-07-11 08:07:22.000000000 -0400
++++ netkit-telnet-0.17/telnet/commands.c	2011-07-11 08:10:12.131039660 -0400
+@@ -2400,17 +2400,21 @@ 
+ 	    ahints.ai_family = PF_UNSPEC;
+ 	    ahints.ai_socktype = SOCK_STREAM;
+ 	    ahints.ai_flags = AI_PASSIVE;
+ 	    error = getaddrinfo(aliasp, "0", &ahints, &ares);
+ 	    if (error) {
++	        printf ("Couldn't get address for %s\n", aliasp);
+ 	        warn("%s: %s", aliasp, gai_strerror(error));
+ 	        close(net);
++		net = -1;
+ 	        continue;
+ 	    }
+ 	    if (bind(net, ares->ai_addr, ares->ai_addrlen) < 0) {
++	        printf ("Couldn't bind to %s\n", aliasp);
+ 	        perror(aliasp);
+                 (void) close(net);   /* dump descriptor */
++		net = -1;
+ 		freeaddrinfo(ares);
+ 		continue;
+             }
+ 	    freeaddrinfo(ares);
+         }
diff --git a/SOURCES/telnet-rh825946.patch b/SOURCES/telnet-rh825946.patch
new file mode 100644
index 0000000..250ba7c
--- /dev/null
+++ b/SOURCES/telnet-rh825946.patch
@@ -0,0 +1,25 @@
+diff -up netkit-telnet-0.17/telnetd/sys_term.c.rh825946 netkit-telnet-0.17/telnetd/sys_term.c
+--- netkit-telnet-0.17/telnetd/sys_term.c.rh825946	1999-12-17 15:28:47.000000000 +0100
++++ netkit-telnet-0.17/telnetd/sys_term.c	2012-06-14 14:05:30.538342755 +0200
+@@ -723,6 +723,9 @@ void cleanup(int sig) {
+     char *p;
+     (void)sig;
+ 
++    /* to avoid a race for wtmp lock */
++    signal(SIGCHLD, SIG_IGN);
++
+     p = line + sizeof("/dev/") - 1;
+     if (logout(p)) logwtmp(p, "", "");
+ #ifdef PARANOID_TTYS
+diff -up netkit-telnet-0.17/telnetd/telnetd.c.rh825946 netkit-telnet-0.17/telnetd/telnetd.c
+--- netkit-telnet-0.17/telnetd/telnetd.c.rh825946	2012-06-14 14:04:42.000000000 +0200
++++ netkit-telnet-0.17/telnetd/telnetd.c	2012-06-14 14:06:01.547291404 +0200
+@@ -1147,8 +1147,6 @@ void telnet(int f, int p)
+ 	if (FD_ISSET(p, &obits) && (pfrontp - pbackp) > 0)
+ 	    ptyflush();
+     }
+-    /* to avoid a race for wtmp lock */
+-    signal(SIGCHLD, SIG_IGN);
+     cleanup(0);
+ }  /* end of telnet */
+ 	
diff --git a/SOURCES/telnet.socket b/SOURCES/telnet.socket
new file mode 100644
index 0000000..811b672
--- /dev/null
+++ b/SOURCES/telnet.socket
@@ -0,0 +1,10 @@
+[Unit]
+Description=Telnet Server Activation Socket
+Documentation=man:telnetd(8)
+
+[Socket]
+ListenStream=23
+Accept=true
+
+[Install]
+WantedBy=sockets.target
diff --git a/SOURCES/telnet.wmconfig b/SOURCES/telnet.wmconfig
new file mode 100644
index 0000000..0f776c2
--- /dev/null
+++ b/SOURCES/telnet.wmconfig
@@ -0,0 +1,4 @@
+telnet name "telnet"
+telnet description "Telnet Client"
+telnet exec "xterm -e telnet &"
+telnet group "Networking"
diff --git a/SOURCES/telnet@.service b/SOURCES/telnet@.service
new file mode 100644
index 0000000..7bf5914
--- /dev/null
+++ b/SOURCES/telnet@.service
@@ -0,0 +1,7 @@
+[Unit]
+Description=Telnet Server
+After=local-fs.target
+
+[Service]
+ExecStart=-/usr/sbin/in.telnetd
+StandardInput=socket
diff --git a/SOURCES/telnetd-0.17-pty_read.patch b/SOURCES/telnetd-0.17-pty_read.patch
new file mode 100644
index 0000000..1760ddd
--- /dev/null
+++ b/SOURCES/telnetd-0.17-pty_read.patch
@@ -0,0 +1,25 @@
+--- telnetd/telnetd.c	2005-01-19 14:37:25.000000000 +0000
++++ telnetd/telnetd.c.new	2005-01-19 14:48:12.000000000 +0000
+@@ -697,6 +697,7 @@
+     int on = 1;
+     char *HE;
+     const char *IM;
++    int pty_read_ok = 0; /* track whether the pty read has worked yet */
+ 
+     /*
+      * Initialize the slc mapping table.
+@@ -1016,12 +1017,13 @@
+ 	     * off the master side before the slave side is
+ 	     * opened, we get EIO.
+ 	     */
+-	    if (pcc < 0 && (errno == EWOULDBLOCK || errno == EIO)) {
++	    if (pcc < 0 && (errno == EWOULDBLOCK || (errno == EIO && pty_read_ok == 0))) {
+ 		pcc = 0;
+ 	    } 
+ 	    else {
+ 		if (pcc <= 0)
+ 		    break;
++		pty_read_ok = 1;	/* mark connection up for read */
+ #ifdef	LINEMODE
+ 				/*
+ 				 * If ioctl from pty, pass it through net
diff --git a/SOURCES/telnetd-0.17.diff b/SOURCES/telnetd-0.17.diff
new file mode 100644
index 0000000..f53415f
--- /dev/null
+++ b/SOURCES/telnetd-0.17.diff
@@ -0,0 +1,21 @@
+--- telnetd/telnetd.c	Thu Apr 13 00:36:12 2000
++++ telnetd.new/telnetd.c	Sun Mar 11 03:10:43 2001
+@@ -44,7 +44,7 @@
+ #include "../version.h"
+ 
+ #include <netdb.h>
+-#include <termcap.h>
++#include <ncurses/termcap.h>
+ #include <netinet/in.h>
+ /* #include <netinet/ip.h> */ /* Don't think this is used at all here */
+ #include <arpa/inet.h>
+--- telnetd/defs.h	Mon Aug  2 06:14:03 1999
++++ telnetd.new/defs.h	Sun Mar 11 03:28:13 2001
+@@ -56,6 +56,7 @@
+ #include <sys/file.h>
+ #include <sys/stat.h>
+ #include <sys/time.h>
++#include <time.h>
+ #include <sys/ioctl.h>
+ #include <netinet/in.h>
+ #include <arpa/telnet.h>
diff --git a/SPECS/telnet.spec b/SPECS/telnet.spec
new file mode 100644
index 0000000..458ad99
--- /dev/null
+++ b/SPECS/telnet.spec
@@ -0,0 +1,435 @@
+%global _hardened_build 1
+
+Summary: The client program for the Telnet remote login protocol
+Name: telnet
+Version: 0.17
+Release: 57%{?dist}
+Epoch: 1
+License: BSD
+Group: Applications/Internet
+Source0: ftp://ftp.uk.linux.org/pub/linux/Networking/netkit/netkit-telnet-%{version}.tar.gz
+Url: http://web.archive.org/web/20070819111735/www.hcs.harvard.edu/~dholland/computers/old-netkit.html
+# telnet-client tarball is snapshot of the OpenBSD client telnet
+Source2: telnet-client.tar.gz
+Source4: telnet.wmconfig
+Source5: telnet@.service
+Source6: telnet.socket
+Patch1: telnet-client-cvs.patch
+Patch5: telnetd-0.17.diff
+Patch6: telnet-0.17-env.patch
+Patch7: telnet-0.17-issue.patch
+Patch8: telnet-0.17-sa-01-49.patch
+Patch10: telnet-0.17-pek.patch
+Patch11: telnet-0.17-8bit.patch
+Patch12: telnet-0.17-argv.patch
+Patch13: telnet-0.17-conf.patch
+Patch14: telnet-0.17-cleanup_race.patch
+Patch15: telnetd-0.17-pty_read.patch
+Patch16: telnet-0.17-CAN-2005-468_469.patch
+Patch18: telnet-gethostbyname.patch
+Patch19: netkit-telnet-0.17-ipv6.diff
+Patch20: netkit-telnet-0.17-nodns.patch
+Patch21: telnet-0.17-errno_test_sys_bsd.patch
+Patch22: netkit-telnet-0.17-reallynodns.patch
+Patch23: telnet-rh678324.patch
+Patch24: telnet-rh674942.patch
+Patch25: telnet-rh704604.patch
+Patch26: telnet-rh825946.patch
+
+BuildRequires: ncurses-devel systemd
+
+%description
+Telnet is a popular protocol for logging into remote systems over the
+Internet. The package provides a command line Telnet client
+
+%package server
+Requires: systemd
+Requires(post): systemd
+Requires(preun): systemd
+Requires(postun): systemd
+Group: System Environment/Daemons
+Summary: The server program for the Telnet remote login protocol
+
+%description server
+Telnet is a popular protocol for logging into remote systems over the
+Internet. The package includes a daemon that supports Telnet remote
+logins into the host machine. The daemon is disabled by default.
+You may enable the daemon by editing /etc/xinetd.d/telnet
+
+%prep
+%setup -q -n netkit-telnet-%{version}
+
+mv telnet telnet-NETKIT
+%setup -T -D -q -a 2 -n netkit-telnet-%{version}
+
+%patch1 -p0 -b .cvs
+%patch5 -p0 -b .fix
+%patch6 -p1 -b .env
+%patch10 -p0 -b .pek
+%patch7 -p1 -b .issue
+%patch8 -p1 -b .sa-01-49
+%patch11 -p1 -b .8bit
+%patch12 -p1 -b .argv
+%patch13 -p1 -b .confverb
+%patch14 -p1 -b .cleanup_race 
+%patch15 -p0 -b .pty_read
+%patch16 -p1 -b .CAN-2005-468_469
+#%patch17 -p1 -b .linemode
+%patch18 -p1 -b .gethost
+%patch19 -p1 -b .gethost2
+%patch20 -p1 -b .nodns
+%patch21 -p1 -b .errnosysbsd
+%patch22 -p1 -b .reallynodns
+%patch23 -p1 -b .rh678324
+%patch24 -p1 -b .rh674942
+%patch25 -p1 -b .rh704604
+%patch26 -p1 -b .rh825946
+
+%build
+%ifarch s390 s390x
+    export CC_FLAGS="$RPM_OPT_FLAGS -fPIE"
+%else
+    export CC_FLAGS="$RPM_OPT_FLAGS -fpie"
+%endif
+
+export LD_FLAGS="$LD_FLAGS -z now -pie"
+
+sh configure --with-c-compiler=gcc 
+perl -pi -e '
+    s,-O2,\$(CC_FLAGS),;
+    s,LDFLAGS=.*,LDFLAGS=\$(LD_FLAGS),;
+    s,^BINDIR=.*$,BINDIR=%{_bindir},;
+    s,^MANDIR=.*$,MANDIR=%{_mandir},;
+    s,^SBINDIR=.*$,SBINDIR=%{_sbindir},;
+    ' MCONFIG
+
+# remove stripping
+perl -pi -e 's|install[ ]+-s|install|g' \
+    ./telnet/GNUmakefile \
+    ./telnetd/Makefile \
+    ./telnetlogin/Makefile \
+    ./telnet-NETKIT/Makefile
+
+make %{?_smp_mflags}
+
+%install
+mkdir -p ${RPM_BUILD_ROOT}%{_bindir}
+mkdir -p ${RPM_BUILD_ROOT}%{_sbindir}
+mkdir -p ${RPM_BUILD_ROOT}%{_unitdir}
+mkdir -p ${RPM_BUILD_ROOT}%{_mandir}/man1
+mkdir -p ${RPM_BUILD_ROOT}%{_mandir}/man5
+mkdir -p ${RPM_BUILD_ROOT}%{_mandir}/man8
+
+make INSTALLROOT=${RPM_BUILD_ROOT} install
+
+install -p -m644 %SOURCE5 ${RPM_BUILD_ROOT}%{_unitdir}/telnet@.service
+install -p -m644 %SOURCE6 ${RPM_BUILD_ROOT}%{_unitdir}/telnet.socket
+
+%post server
+%systemd_post telnet.socket
+
+%preun server
+%systemd_preun telnet.socket
+
+%postun server
+%systemd_postun_with_restart telnet.socket
+
+%files
+%doc README
+%defattr(-,root,root,-)
+%{_bindir}/telnet
+%{_mandir}/man1/telnet.1*
+
+%files server
+%defattr(-,root,root,-)
+%{_unitdir}/*
+%{_sbindir}/in.telnetd
+%{_mandir}/man5/issue.net.5*
+%{_mandir}/man8/in.telnetd.8*
+%{_mandir}/man8/telnetd.8*
+
+%changelog
+* Wed Jul 17 2013 Michal Sekletar <msekleta@redhat.com> - 1:0.17-57
+- enable hardened build
+- fix dates in changelog
+- add systemd to BuildRequires
+
+* Mon May 06 2013 Michal Sekletar <msekleta@redhat.com> - 1:0.17-56
+- telnet-server will use systemd socket based activation instead of xinetd
+
+* Fri Feb 15 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:0.17-55
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild
+
+* Sat Jul 21 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:0.17-54
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Thu Jun 14 2012 Adam Tkac <atkac redhat com> 1:0.17-53
+- update /var/run/utmp even on some corner cases
+
+* Sat Jan 14 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:0.17-52
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
+
+* Wed Jul 13 2011 Adam Tkac <atkac redhat com> 1:0.17-51
+- add "-debug6" option to telnetd (#rh674942)
+- telnet wasn't interruptable (^C) when started with specious -b argument (#704604)
+
+* Tue Jun 28 2011 Adam Tkac <atkac redhat com> 1:0.17-50
+- telnetd: store "from" address in sockaddr_storage (#678324)
+
+* Wed Feb 09 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:0.17-49
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Thu Jan 20 2011 Karsten Hopp <karsten@redhat.com> 1:0.17-48
+- update telnet-0.17-sa-01-49.patch to make it apply with fuzz=0
+
+* Tue Mar 09 2010 Adam Tkac <atkac redhat com> 1:0.17-47
+- add URL and README
+
+* Fri Nov 27 2009 Adam Tkac <atkac redhat com> 1:0.17-46
+- changes related package review (#226484)
+- remove unused patches
+  - telnet-0.17-linemode.patch
+  - telnet-0.17-env-5x.patch
+
+* Wed Sep 02 2009 Adam Tkac <atkac redhat com> 1:0.17-45
+- add new option -N to disable DNS lookups (#490242)
+
+* Sun Jul 26 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:0.17-44
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
+
+* Wed Feb 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:0.17-43
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Mon Feb 18 2008 Fedora Release Engineering <rel-eng@fedoraproject.org> - 1:0.17-42
+- Autorebuild for GCC 4.3
+
+* Tue Sep 25 2007 Adam Tkac <atkac redhat com> 1:0.17-41
+- rebased "nodns" patch with patch from Bryn M. Reeves
+
+* Thu Sep 20 2007 Adam Tkac <atkac redhat com> 1:0.17-40
+- improved patch to #274991
+
+* Wed Aug 22 2007 Harald Hoyer <harald@redhat.com> - 1:0.17-39
+- added patch to prevent a rare loop in the client
+
+* Fri Apr 13 2007 Adam Tkac <atkac redhat com> - 1:0.17-38.fc7
+- added -c option which disables reverse dns checking (#223448)
+- added smp_mflags to make
+- start using dist macro
+
+* Fri Jul 14 2006 Harald Hoyer <harald@redhat.com> - 1:0.17-37
+- added netkit-telnet-0.17-ipv6.diff from Marek Grác, 
+  which adds IPv6 support to telnetd
+
+* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 1:0.17-36.1
+- rebuild
+
+* Mon May 08 2006 Harald Hoyer <harald@redhat.com> - 1:0.17-36
+- patch to remove gethostbyname() (bug #190296)
+
+* Fri Feb 10 2006 Jesse Keating <jkeating@redhat.com> - 1:0.17-35.2.1
+- bump again for double-long bug on ppc(64)
+
+* Tue Feb 07 2006 Jesse Keating <jkeating@redhat.com> - 1:0.17-35.2
+- rebuilt for new gcc4.1 snapshot and glibc changes
+
+* Fri Dec 09 2005 Jesse Keating <jkeating@redhat.com>
+- rebuilt
+
+* Thu Mar 17 2005 Harald Hoyer <harald@redhat.com> - 1:0.17-35
+- fixed CAN-2005-468 and CAN-2005-469
+
+* Wed Mar 02 2005 Harald Hoyer <harald@redhat.com> 
+- rebuilt
+
+* Fri Jan 21 2005 Harald Hoyer <harald@redhat.com> - 1:0.17-33
+- added patch telnetd-0.17-pty_read.patch, which fixes 145636
+
+* Thu Jan 13 2005 Jason Vas Dias <jvdias@redhat.com> - 1:0.17-31
+- bug 143929 / 145004 : fix race condition in telnetd on wtmp lock 
+- when cleanup() is entered from main process and in signal
+- handler 
+
+* Mon Jun 28 2004 Harald Hoyer <harald@redhat.com> - 1:0.17-30
+- fixed 126858: Too long /proc/X/cmdline: bad ps output when 
+                piped to less/more
+
+* Tue Jun 15 2004 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Fri Feb 13 2004 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Thu Feb  5 2004 Harald Hoyer <harald@redhat.com> - 1:0.17-27
+- added PIE compile flags
+
+* Wed Jun 04 2003 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Wed May 28 2003 Harald Hoyer <harald@redhat.de> 1:0.17-26
+- cleanup of spec file
+- 8bit binary patch #91023
+
+* Wed Jan 29 2003 Harald Hoyer <harald@redhat.de> 0.17-25
+- rebuilt 
+
+* Wed Jan 22 2003 Tim Powers <timp@redhat.com>
+- rebuilt
+
+* Mon Nov 11 2002 Harald Hoyer <harald@redhat.de> 0.17-24
+- changed description
+- removed unused .desktop files
+
+* Tue Jul 23 2002 Harald Hoyer <harald@redhat.de> 0.17-23
+- removed prestripping
+
+* Tue Jul  9 2002 Harald Hoyer <harald@redhat.de>
+- removed x86 -O gcc-2.96 hack (#59514)
+
+* Fri Jun 21 2002 Tim Powers <timp@redhat.com>
+- automated rebuild
+
+* Thu Jun  6 2002 Tim Powers <timp@redhat.com>
+- bump release number and rebuild
+
+* Thu May 23 2002 Tim Powers <timp@redhat.com>
+- automated rebuild
+
+* Thu Sep 06 2001 Harald Hoyer <harald@redhat.de> 0.17-20
+- hopefully fixed #52817, #52224
+
+* Thu Aug 16 2001 Bill Nottingham <notting@redhat.com>
+- bump version for 7.2
+
+* Wed Aug 15 2001 Bill Nottingham <notting@redhat.com>
+- fix versioning
+
+* Tue Jul 31 2001 Harald Hoyer <harald@redhat.de>
+- fixed security issues (#50335)
+- patched the patches to fit the 5x version
+- one world -> one spec file for all versions ;)
+
+* Sat Jul 21 2001 Tim Powers <timp@redhat.com>
+- no applnk file, it's clutrtering the menus
+
+* Wed Jul 18 2001 Bill Nottingham <notting@redhat.com>
+- apply the patch, duh (and fix it while we're here)
+
+* Tue Jul 10 2001 Bill Nottingham <notting@redhat.com>
+- make /etc/issue.net parsing match the various gettys
+
+* Mon Jun 18 2001 Harald Hoyer <harald@redhat.de>
+- merged Jakubs and Pekka's patches 
+
+* Wed Apr  4 2001 Jakub Jelinek <jakub@redhat.com>
+- don't let configure to guess compiler, it can pick up egcs
+
+* Fri Mar  9 2001 Pekka Savola <pekkas@netcore.fi>
+- update to 0.17
+- apply latest changes from CVS to telnet client, enable IPv6
+- BuildPreReq ncurses-devel
+
+* Mon Jan 22 2001 Helge Deller <hdeller@redhat.com>
+- added swedish & german translation to .desktop-file (#15332)
+
+* Sat Dec 30 2000 Nalin Dahyabhai <nalin@redhat.com>
+- mark the xinetd config file as config(noreplace)
+
+* Fri Dec 01 2000 Trond Eivind Glomsrød <teg@redhat.com>
+- make sure the server is turned off by default
+
+* Tue Jul 18 2000 Bill Nottingham <notting@redhat.com>
+- add description & default to xinetd file
+
+* Wed Jul 12 2000 Prospector <bugzilla@redhat.com>
+- automatic rebuild
+
+* Mon Jun 19 2000 Jeff Johnson <jbj@redhat.com>
+- FHS packaging.
+- update to 0.17-pre20000412.
+
+* Tue May 23 2000 Trond Eivind Glomsrød <teg@redhat.com>
+- moved the xinet entry to the server
+
+* Mon May 22 2000 Trond Eivind Glomsrød <teg@redhat.com>
+- add an entry to /etc/xinetd.d
+
+* Tue May 16 2000 Jeff Johnson <jbj@redhat.com>
+- permit telnet queries only for exported variables.
+
+* Fri Mar 24 2000 Bernhard Rosenkraenzer <bero@redhat.com>
+- 0.17
+
+* Tue Mar  7 2000 Jeff Johnson <jbj@redhat.com>
+- rebuild for sparc baud rates > 38400.
+
+* Fri Feb 11 2000 Bill Nottingham <notting@redhat.com>
+- fix description
+
+* Mon Feb 07 2000 Preston Brown <pbrown@redhat.com>
+- wmconfig gone
+
+* Wed Feb 02 2000 Cristian Gafton <gafton@redhat.com>
+- man pages are compressed
+- fix description
+
+* Tue Jan  4 2000 Bill Nottingham <notting@redhat.com>
+- split client and server
+
+* Tue Dec 21 1999 Jeff Johnson <jbj@redhat.com>
+- update to 0.16.
+
+* Sun Oct 10 1999 Matt Wilson <msw@redhat.com>
+- corrected the Terminal setting of the .desktop (needs to be 'true' not '1')
+
+* Sat Sep 25 1999 Preston Brown <pbrown@redhat.com>
+- red hat .desktop entry
+
+* Sat Aug 21 1999 Jeff Johnson <jbj@redhat.com>
+- rebuild for 6.1.
+
+* Wed Aug 18 1999 Bill Nottingham <notting@redhat.com>
+- don't trust random TERM variables in telnetd (#4560)
+
+* Wed Jun  2 1999 Jeff Johnson <jbj@redhat.com>
+- fix (#3098).
+
+* Thu May 27 1999 Antti Andreimann <Antti.Andreimann@mail.ee>
+- fixed the problem with escape character (it could not be disabled)
+- changed the spec file to use %%setup macro for unpacking telnet-client
+
+* Thu Apr 15 1999 Jeff Johnson <jbj@redhat.com>
+- use glibc utmp routines.
+
+* Thu Apr  8 1999 Jeff Johnson <jbj@redhat.com>
+- fix the fix (wrong way memcpy).
+
+* Wed Apr  7 1999 Jeff Johnson <jbj@redhat.com>
+- fix "telnet localhost" bus error on sparc64 (alpha?).
+
+* Tue Apr  6 1999 Jeff Johnson <jbj@redhat.com>
+- use OpenBSD telnet client (and fix minor core dump with .telnetrc #247)
+
+* Thu Mar 25 1999 Erik Troan <ewt@redhat.com>
+- use openpty in telnetd
+
+* Sun Mar 21 1999 Cristian Gafton <gafton@redhat.com> 
+- auto rebuild in the new build environment (release 22)
+
+* Mon Mar 15 1999 Jeff Johnson <jbj@redhat.com>
+- compile for 6.0.
+
+* Fri Apr 24 1998 Prospector System <bugs@redhat.com>
+- translations modified for de, fr, tr
+
+* Fri Apr 24 1998 Cristian Gafton <gafton@redhat.com>
+- compile C++ code using egcs
+
+* Tue Apr 14 1998 Erik Troan <ewt@redhat.com>
+- built against new ncurses
+
+* Wed Oct 29 1997 Donnie Barnes <djb@redhat.com>
+- added wmconfig entry
+
+* Tue Jul 15 1997 Erik Troan <ewt@redhat.com>
+- initial build