commit f6558615807a3bab2bd16c1836998119af0ad618 Author: CentOS Sources Date: Fri Aug 2 08:45:44 2019 -0400 import telnet-0.17-73.el8 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7478575 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +SOURCES/netkit-telnet-0.17.tar.gz +SOURCES/telnet-client.tar.gz 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/SOURCES/netkit-telnet-0.17-core-dump.patch b/SOURCES/netkit-telnet-0.17-core-dump.patch new file mode 100644 index 0000000..c0fda04 --- /dev/null +++ b/SOURCES/netkit-telnet-0.17-core-dump.patch @@ -0,0 +1,13 @@ +diff --git a/telnet/main.c.old b/telnet/main.c +index 599f0af..cf67ea6 100644 +--- a/telnet/main.c.old ++++ b/telnet/main.c +@@ -337,7 +337,7 @@ main(int argc, char *argv[]) + argv += optind; + + if (argc) { +- char *args[7], **argp = args; ++ char *args[8], **argp = args; + + if (argc > 2) + usage(); diff --git a/SOURCES/netkit-telnet-0.17-covscan.patch b/SOURCES/netkit-telnet-0.17-covscan.patch new file mode 100644 index 0000000..6f2619a --- /dev/null +++ b/SOURCES/netkit-telnet-0.17-covscan.patch @@ -0,0 +1,54 @@ +--- a/telnet/commands.c.old ++++ b/telnet/commands.c +@@ -2181,12 +2181,13 @@ cmdrc(char *m1, char *m2) + int gotmachine = 0; + int l1 = strlen(m1); + int l2 = strlen(m2); +- char m1save[MAXHOSTNAMELEN]; ++ char m1save[MAXHOSTNAMELEN+1]; + + if (skiprc) + return; + + strncpy(m1save, m1, sizeof(m1save)); ++ m1save[MAXHOSTNAMELEN] = 0; + m1 = m1save; + + if (rcname[0] == 0) { +@@ -2218,11 +2218,11 @@ cmdrc(char *m1, char *m2) + if (isspace(line[0])) + continue; + if (strncasecmp(line, m1, l1) == 0) +- strncpy(line, &line[l1], sizeof(line) - l1); ++ memmove(line, &line[l1], sizeof(line) - l1); + else if (strncasecmp(line, m2, l2) == 0) +- strncpy(line, &line[l2], sizeof(line) - l2); ++ memmove(line, &line[l2], sizeof(line) - l2); + else if (strncasecmp(line, "DEFAULT", 7) == 0) +- strncpy(line, &line[7], sizeof(line) - 7); ++ memmove(line, &line[7], sizeof(line) - 7); + else + continue; + if (line[0] != ' ' && line[0] != '\t' && line[0] != '\n') +@@ -2345,6 +2345,7 @@ tn(int argc, char *argv[]) + } + usage: + printf("usage: %s [-l user] [-a] host-name [port]\r\n", cmd); ++ free(user); + return 0; + } + if (hostp == 0) +--- a/telnetd/utility.c ++++ b/telnetd/utility.c +@@ -68,8 +68,10 @@ output_data(const char *format, ...) + char *buf; + + va_start(args, format); +- if ((len = vasprintf(&buf, format, args)) == -1) ++ if ((len = vasprintf(&buf, format, args)) == -1) { ++ va_end(args); + return -1; ++ } + output_datalen(buf, len); + va_end(args); + free(buf); diff --git a/SOURCES/netkit-telnet-0.17-gcc7.patch b/SOURCES/netkit-telnet-0.17-gcc7.patch new file mode 100644 index 0000000..761dd01 --- /dev/null +++ b/SOURCES/netkit-telnet-0.17-gcc7.patch @@ -0,0 +1,121 @@ +diff --git a/telnet/utilities.c b/telnet/utilities.c +index 0bb0eab..d89ca37 100644 +--- a/telnet/utilities.c ++++ b/telnet/utilities.c +@@ -748,6 +748,7 @@ printsub(char direction, unsigned char *pointer, int length) + env_common: + { + register int noquote = 2; ++ char* msg; + #if defined(ENV_HACK) && defined(OLD_ENVIRON) + extern int old_env_var, old_env_value; + #endif +@@ -758,14 +759,24 @@ printsub(char direction, unsigned char *pointer, int length) + /* case NEW_ENV_OVAR: */ + if (pointer[0] == TELOPT_OLD_ENVIRON) { + # ifdef ENV_HACK +- if (old_env_var == OLD_ENV_VALUE) +- fprintf(NetTrace, "\" (VALUE) " + noquote); +- else ++ if (old_env_var == OLD_ENV_VALUE) { ++ msg = "\" (VALUE) "; ++ fprintf(NetTrace, "%s", msg + noquote); ++ } ++ else { + # endif +- fprintf(NetTrace, "\" VAR " + noquote); ++ msg = "\" VAR "; ++ fprintf(NetTrace, "%s", msg + noquote); ++# ifdef ENV_HACK ++ } ++#endif /*ENV_HACK*/ + } else + #endif /* OLD_ENVIRON */ +- fprintf(NetTrace, "\" VALUE " + noquote); ++ msg = "\" VALUE "; ++ fprintf(NetTrace, "%s", msg + noquote); ++#ifdef OLD_ENVIRON ++ } ++#endif /* OLD_ENVIRON */ + noquote = 2; + break; + +@@ -774,24 +785,36 @@ printsub(char direction, unsigned char *pointer, int length) + /* case OLD_ENV_VALUE: */ + if (pointer[0] == TELOPT_OLD_ENVIRON) { + # ifdef ENV_HACK +- if (old_env_value == OLD_ENV_VAR) +- fprintf(NetTrace, "\" (VAR) " + noquote); +- else ++ if (old_env_value == OLD_ENV_VAR) { ++ msg = "\" (VAR) "; ++ fprintf(NetTrace, "%s", msg + noquote); ++ } ++ else { + # endif +- fprintf(NetTrace, "\" VALUE " + noquote); +- } else ++ msg = "\" VALUE "; ++ fprintf(NetTrace, "%s", msg + noquote); ++# ifdef ENV_HACK ++ } ++# endif ++ } else { + #endif /* OLD_ENVIRON */ +- fprintf(NetTrace, "\" VAR " + noquote); ++ msg = "\" VAR "; ++ fprintf(NetTrace, "%s", msg + noquote); ++#ifdef OLD_ENVIRON ++ } ++#endif + noquote = 2; + break; + + case ENV_ESC: +- fprintf(NetTrace, "\" ESC " + noquote); ++ msg = "\" ESC "; ++ fprintf(NetTrace, "%s", msg + noquote); + noquote = 2; + break; + + case ENV_USERVAR: +- fprintf(NetTrace, "\" USERVAR " + noquote); ++ msg = "\" USERVAR "; ++ fprintf(NetTrace, "%s", msg + noquote); + noquote = 2; + break; + +diff --git a/telnetd/utility.c b/telnetd/utility.c +index 4a438be..82edee5 100644 +--- a/telnetd/utility.c ++++ b/telnetd/utility.c +@@ -969,22 +969,26 @@ printsub(char direction, unsigned char *pointer, int length) + env_common: + { + register int noquote = 2; ++ char* msg; + for (i = 2; i < length; i++ ) { + switch (pointer[i]) { + case ENV_VAR: + if (pointer[1] == TELQUAL_SEND) + goto def_case; +- netoprintf("\" VAR " + noquote); ++ msg = "\" VAR "; ++ netoprintf("%s", msg + noquote); + noquote = 2; + break; + + case ENV_VALUE: +- netoprintf("\" VALUE " + noquote); ++ msg = "\" VALUE "; ++ netoprintf("%s", msg + noquote); + noquote = 2; + break; + + case ENV_ESC: +- netoprintf("\" ESC " + noquote); ++ msg = "\" ESC "; ++ netoprintf("%s", msg + noquote); + noquote = 2; + break; + 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 */ /* Don't think this is used at all here */ + #include + #include ++#include + #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-manpage.patch b/SOURCES/netkit-telnet-0.17-manpage.patch new file mode 100644 index 0000000..f4c4644 --- /dev/null +++ b/SOURCES/netkit-telnet-0.17-manpage.patch @@ -0,0 +1,15 @@ +diff --git a/telnet/telnet.1 b/telnet/telnet.1 +index f30e034..e3a873e 100644 +--- a/telnet/telnet.1 ++++ b/telnet/telnet.1 +@@ -74,6 +74,10 @@ If it is invoked with arguments, it performs an + .Ic open + command with those arguments. + .Pp ++If a hostname is resolved to multiple IP addresses, ++.Nm ++attempts to establish a connection with each address until one of them is successful or until no more addresses are left. ++.Pp + The options are as follows: + .Bl -tag -width Ds + .It Fl 4 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 <__conftest.cc + #include + #include +-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-force-ipv6-ipv4.patch b/SOURCES/telnet-0.17-force-ipv6-ipv4.patch new file mode 100644 index 0000000..b6f7f3f --- /dev/null +++ b/SOURCES/telnet-0.17-force-ipv6-ipv4.patch @@ -0,0 +1,132 @@ +diff --git a/commands.c b/commands.c +index 49619ac..636fb5c 100644 +--- a/telnet/commands.c ++++ b/telnet/commands.c +@@ -2267,6 +2267,7 @@ tn(int argc, char *argv[]) + char *srp = 0; + int srlen; + #endif ++ int family = AF_UNSPEC; + char *cmd, *hostp = 0, *portp = 0, *user = 0, *aliasp = 0; + int retry; + #ifdef NI_WITHSCOPEID +@@ -2317,6 +2318,21 @@ tn(int argc, char *argv[]) + autologin = 1; + continue; + } ++ ++ if (strcmp(*argv, "-6") == 0) { ++ --argc; ++argv; ++#ifdef AF_INET6 ++ family = AF_INET6; ++#else ++ puts("IPv6 unsupported"); ++#endif ++ continue; ++ } ++ if (strcmp(*argv, "-4") == 0) { ++ --argc; ++argv; ++ family = AF_INET; ++ continue; ++ } + if (hostp == 0) { + hostp = *argv++; + --argc; +@@ -2355,7 +2371,7 @@ tn(int argc, char *argv[]) + { + hostname = hostp; + memset(&hints, 0, sizeof(hints)); +- hints.ai_family = PF_UNSPEC; ++ hints.ai_family = family; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_CANONNAME; + if (portp == NULL) { +diff --git a/main.c b/main.c +index 5fa96e8..599f0af 100644 +--- a/telnet/main.c ++++ b/telnet/main.c +@@ -80,10 +80,10 @@ usage(void) + fprintf(stderr, "Usage: %s %s%s%s%s\n", + prompt, + #ifdef AUTHENTICATION +- "[-8] [-E] [-K] [-L] [-S tos] [-X atype] [-a] [-c] [-d] [-e char]", ++ "[-4] [-6] [-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 ] ", + #else +- "[-8] [-E] [-L] [-S tos] [-a] [-c] [-d] [-e char] [-l user]", ++ "[-4] [-6] [-8] [-E] [-L] [-S tos] [-a] [-c] [-d] [-e char] [-l user]", + "\n\t[-n tracefile] [-b hostalias ] ", + #endif + #if defined(TN3270) && defined(unix) +@@ -116,6 +116,7 @@ main(int argc, char *argv[]) + #endif + int ch; + char *user, *alias; ++ int family; + #ifdef FORWARD + extern int forward_flags; + #endif /* FORWARD */ +@@ -130,7 +131,6 @@ main(int argc, char *argv[]) + prompt = argv[0]; + + user = alias = NULL; +- + rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE; + + /* +@@ -139,9 +139,19 @@ main(int argc, char *argv[]) + * passed + */ + autologin = -1; +- +- while ((ch = getopt(argc, argv, "78DEKLS:X:ab:cde:fFk:l:n:rt:x")) != -1) { ++ family = 0; ++ while ((ch = getopt(argc, argv, "4678DEKLS:X:ab:cde:fFk:l:n:rt:x")) != -1) { + switch(ch) { ++ case '4': ++ family = AF_INET; ++ break; ++ case '6': ++#ifdef AF_INET6 ++ family = AF_INET6; ++#else ++ fputs("IPv6 unsupported\n", stderr); ++#endif ++ break; + case '8': + binary = 3; /* send TELNET BINARY option for output and input */ + break; +@@ -340,6 +350,9 @@ main(int argc, char *argv[]) + *argp++ = "-b"; + *argp++ = alias; + } ++ if (family) { ++ *argp++ = family == AF_INET ? "-4" : "-6"; ++ } + *argp++ = argv[0]; /* host */ + if (argc > 1) + *argp++ = argv[1]; /* port */ +diff --git a/telnet.1 b/telnet.1 +index 50015a6..f30e034 100644 +--- a/telnet/telnet.1 ++++ b/telnet/telnet.1 +@@ -44,7 +44,7 @@ + protocol + .Sh SYNOPSIS + .Nm telnet +-.Op Fl 8EFKLacdfrx ++.Op Fl 468EFKLacdfrx + .Op Fl X Ar authtype + .Op Fl b Ar hostalias + .Op Fl e Ar escapechar +@@ -76,6 +76,10 @@ command with those arguments. + .Pp + The options are as follows: + .Bl -tag -width Ds ++.It Fl 4 ++Force IPv4 address resolution. ++.It Fl 6 ++Force IPv6 address resolution. + .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 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 + #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 ++#include + #include + + #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 # for KERBEROS + +-.if (${KERBEROS} == "yes") ++.if (${KERBEROS:L} == "yes") + CFLAGS+=-DENCRYPTION -DAUTHENTICATION -DKRB4 + LDADD+= -lkrb -ldes + DPADD+= ${LIBDES} ${LIBKRB} + .endif + + .include +- +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 + + /* + * 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 ++#include + + #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-log-address.patch b/SOURCES/telnet-log-address.patch new file mode 100644 index 0000000..ae8bd42 --- /dev/null +++ b/SOURCES/telnet-log-address.patch @@ -0,0 +1,75 @@ +diff --git a/telnetd/telnetd.8 b/telnetd/telnetd.8 +index 02b48c7..c72ab76 100644 +--- a/telnetd/telnetd.8 ++++ b/telnetd/telnetd.8 +@@ -42,7 +42,7 @@ + protocol server + .Sh SYNOPSIS + .Nm /usr/sbin/in.telnetd +-.Op Fl hnNs ++.Op Fl ihnNs + .Op Fl a Ar authmode + .Op Fl D Ar debugmode + .Op Fl L Ar loginprg +@@ -158,6 +158,10 @@ option may be used to enable encryption debugging code. + .It Fl h + Disables the printing of host-specific information before + login has been completed. ++.It Fl i ++Disable reverse DNS lookups and use the numeric IP address in logs ++and REMOTEHOST environment variable. (-i switch corresponds to ++utilities like last) + .It Fl L Ar loginprg + This option may be used to specify a different login program. + By default, +diff --git a/telnetd/telnetd.c b/telnetd/telnetd.c +index a4988a9..2ac8bc1 100644 +--- a/telnetd/telnetd.c ++++ b/telnetd/telnetd.c +@@ -84,6 +84,7 @@ int hostinfo = 1; /* do we print login banner? */ + int debug = 0; + int debugsix = 0; + int keepalive = 1; ++int numeric_hosts = 0; + char *loginprg = _PATH_LOGIN; + char *progname; + int lookupself = 1; +@@ -113,7 +114,7 @@ main(int argc, char *argv[], char *env[]) + + progname = *argv; + +- while ((ch = getopt(argc, argv, "d:a:e:lhnr:I:D:B:sS:a:X:L:N")) != EOF) { ++ while ((ch = getopt(argc, argv, "d:a:e:ilhnr:I:D:B:sS:a:X:L:N")) != EOF) { + switch(ch) { + + #ifdef AUTHENTICATE +@@ -196,6 +197,14 @@ main(int argc, char *argv[], char *env[]) + break; + #endif /* AUTHENTICATE */ + ++ /* ++ * Use ip address instead of hostname when ++ * calling login process. ++ */ ++ case 'i': ++ numeric_hosts = 1; ++ break; ++ + case 'h': + hostinfo = 0; + break; +@@ -663,10 +672,12 @@ doit(struct sockaddr *who, socklen_t wholen) + int error = -1; + char namebuf[255]; + +- error = getnameinfo(who, wholen, namebuf, sizeof(namebuf), NULL, 0, 0); ++ /* if we don't want hostname '-i', skip this call to getnameinfo */ ++ if (numeric_hosts == 0) ++ 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) ++ if(error == EAI_AGAIN || numeric_hosts != 0) + error = getnameinfo(who, wholen, namebuf, sizeof(namebuf), + NULL, 0, NI_NUMERICHOST); + 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 +-#include ++#include + #include + /* #include */ /* Don't think this is used at all here */ + #include +--- 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 + #include + #include ++#include + #include + #include + #include diff --git a/SPECS/telnet.spec b/SPECS/telnet.spec new file mode 100644 index 0000000..2de1383 --- /dev/null +++ b/SPECS/telnet.spec @@ -0,0 +1,499 @@ +%global _hardened_build 1 + +Summary: The client program for the Telnet remote login protocol +Name: telnet +Version: 0.17 +Release: 73%{?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 +Patch27: telnet-0.17-force-ipv6-ipv4.patch +Patch28: netkit-telnet-0.17-core-dump.patch +Patch29: netkit-telnet-0.17-gcc7.patch +Patch30: netkit-telnet-0.17-manpage.patch +Patch31: netkit-telnet-0.17-covscan.patch +Patch32: telnet-log-address.patch + +BuildRequires: ncurses-devel systemd +BuildRequires: perl-interpreter + +%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 +%patch27 -p1 -b .ipv6-support +%patch28 -p1 -b .core-dump +%patch29 -p1 -b .gcc7 +%patch30 -p1 -b .manpage +%patch31 -p1 -b .covscan +%patch32 -p1 -b .log-address + +%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 +* Thu Oct 04 2018 Michal Ruprich - 1:0.17-73 +- Resolves: #1602711 - Please review important issues found by covscan +- Resolves: #1637085 - Option -i is missing in telnet in el8 but is available in el7 + +* Fri Feb 09 2018 Fedora Release Engineering - 1:0.17-72 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Thu Aug 03 2017 Fedora Release Engineering - 1:0.17-71 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Thu Jul 27 2017 Fedora Release Engineering - 1:0.17-70 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Tue Apr 25 2017 Michal Ruprich - 1:0.17-69 +- Resolves: #1445259 - telnet won't build with latest gcc +- added note about address resolution in manpage + +* Sat Feb 11 2017 Fedora Release Engineering - 1:0.17-68 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Mon Jan 23 2017 Michal Ruprich - 1:0.17-67 +- Resolves: #1415706 - telnet dumps core with certain combination of parameters + +* Sat Oct 01 2016 Richard W.M. Jones - 1:0.17-66 +- BR perl + (https://fedoraproject.org/wiki/Changes/Build_Root_Without_Perl) + +* Fri Feb 05 2016 Fedora Release Engineering - 1:0.17-65 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Mon Jan 25 2016 Luboš Uhliarik - 1:0.17-64 +- Related: #1069809 - fixed wrong paths in patch + +* Thu Oct 29 2015 Luboš Uhliarik - 1:0.17-63 +- Related: #1069809 - changed patch name + some minor changes in patch + +* Wed Sep 30 2015 Luboš Uhliarik - 1:0.17-62 +- Resolves: #1069809 - No option to specify IPv6 or IPv4 explicitly must be used + +* Fri Jun 19 2015 Fedora Release Engineering - 1:0.17-61 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Mon Aug 18 2014 Fedora Release Engineering - 1:0.17-60 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Sun Jun 08 2014 Fedora Release Engineering - 1:0.17-59 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Sun Aug 04 2013 Fedora Release Engineering - 1:0.17-58 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Wed Jul 17 2013 Michal Sekletar - 1:0.17-57 +- enable hardened build +- fix dates in changelog +- add systemd to BuildRequires + +* Mon May 06 2013 Michal Sekletar - 1:0.17-56 +- telnet-server will use systemd socket based activation instead of xinetd + +* Fri Feb 15 2013 Fedora Release Engineering - 1:0.17-55 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Sat Jul 21 2012 Fedora Release Engineering - 1:0.17-54 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Thu Jun 14 2012 Adam Tkac 1:0.17-53 +- update /var/run/utmp even on some corner cases + +* Sat Jan 14 2012 Fedora Release Engineering - 1:0.17-52 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Wed Jul 13 2011 Adam Tkac 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 1:0.17-50 +- telnetd: store "from" address in sockaddr_storage (#678324) + +* Wed Feb 09 2011 Fedora Release Engineering - 1:0.17-49 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Thu Jan 20 2011 Karsten Hopp 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 1:0.17-47 +- add URL and README + +* Fri Nov 27 2009 Adam Tkac 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 1:0.17-45 +- add new option -N to disable DNS lookups (#490242) + +* Sun Jul 26 2009 Fedora Release Engineering - 1:0.17-44 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Wed Feb 25 2009 Fedora Release Engineering - 1:0.17-43 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Mon Feb 18 2008 Fedora Release Engineering - 1:0.17-42 +- Autorebuild for GCC 4.3 + +* Tue Sep 25 2007 Adam Tkac 1:0.17-41 +- rebased "nodns" patch with patch from Bryn M. Reeves + +* Thu Sep 20 2007 Adam Tkac 1:0.17-40 +- improved patch to #274991 + +* Wed Aug 22 2007 Harald Hoyer - 1:0.17-39 +- added patch to prevent a rare loop in the client + +* Fri Apr 13 2007 Adam Tkac - 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 - 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 - 1:0.17-36.1 +- rebuild + +* Mon May 08 2006 Harald Hoyer - 1:0.17-36 +- patch to remove gethostbyname() (bug #190296) + +* Fri Feb 10 2006 Jesse Keating - 1:0.17-35.2.1 +- bump again for double-long bug on ppc(64) + +* Tue Feb 07 2006 Jesse Keating - 1:0.17-35.2 +- rebuilt for new gcc4.1 snapshot and glibc changes + +* Fri Dec 09 2005 Jesse Keating +- rebuilt + +* Thu Mar 17 2005 Harald Hoyer - 1:0.17-35 +- fixed CAN-2005-468 and CAN-2005-469 + +* Wed Mar 02 2005 Harald Hoyer +- rebuilt + +* Fri Jan 21 2005 Harald Hoyer - 1:0.17-33 +- added patch telnetd-0.17-pty_read.patch, which fixes 145636 + +* Thu Jan 13 2005 Jason Vas Dias - 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 - 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 +- rebuilt + +* Fri Feb 13 2004 Elliot Lee +- rebuilt + +* Thu Feb 5 2004 Harald Hoyer - 1:0.17-27 +- added PIE compile flags + +* Wed Jun 04 2003 Elliot Lee +- rebuilt + +* Wed May 28 2003 Harald Hoyer 1:0.17-26 +- cleanup of spec file +- 8bit binary patch #91023 + +* Wed Jan 29 2003 Harald Hoyer 0.17-25 +- rebuilt + +* Wed Jan 22 2003 Tim Powers +- rebuilt + +* Mon Nov 11 2002 Harald Hoyer 0.17-24 +- changed description +- removed unused .desktop files + +* Tue Jul 23 2002 Harald Hoyer 0.17-23 +- removed prestripping + +* Tue Jul 9 2002 Harald Hoyer +- removed x86 -O gcc-2.96 hack (#59514) + +* Fri Jun 21 2002 Tim Powers +- automated rebuild + +* Thu Jun 6 2002 Tim Powers +- bump release number and rebuild + +* Thu May 23 2002 Tim Powers +- automated rebuild + +* Thu Sep 06 2001 Harald Hoyer 0.17-20 +- hopefully fixed #52817, #52224 + +* Thu Aug 16 2001 Bill Nottingham +- bump version for 7.2 + +* Wed Aug 15 2001 Bill Nottingham +- fix versioning + +* Tue Jul 31 2001 Harald Hoyer +- 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 +- no applnk file, it's clutrtering the menus + +* Wed Jul 18 2001 Bill Nottingham +- apply the patch, duh (and fix it while we're here) + +* Tue Jul 10 2001 Bill Nottingham +- make /etc/issue.net parsing match the various gettys + +* Mon Jun 18 2001 Harald Hoyer +- merged Jakubs and Pekka's patches + +* Wed Apr 4 2001 Jakub Jelinek +- don't let configure to guess compiler, it can pick up egcs + +* Fri Mar 9 2001 Pekka Savola +- update to 0.17 +- apply latest changes from CVS to telnet client, enable IPv6 +- BuildPreReq ncurses-devel + +* Mon Jan 22 2001 Helge Deller +- added swedish & german translation to .desktop-file (#15332) + +* Sat Dec 30 2000 Nalin Dahyabhai +- mark the xinetd config file as config(noreplace) + +* Fri Dec 01 2000 Trond Eivind Glomsrød +- make sure the server is turned off by default + +* Tue Jul 18 2000 Bill Nottingham +- add description & default to xinetd file + +* Wed Jul 12 2000 Prospector +- automatic rebuild + +* Mon Jun 19 2000 Jeff Johnson +- FHS packaging. +- update to 0.17-pre20000412. + +* Tue May 23 2000 Trond Eivind Glomsrød +- moved the xinet entry to the server + +* Mon May 22 2000 Trond Eivind Glomsrød +- add an entry to /etc/xinetd.d + +* Tue May 16 2000 Jeff Johnson +- permit telnet queries only for exported variables. + +* Fri Mar 24 2000 Bernhard Rosenkraenzer +- 0.17 + +* Tue Mar 7 2000 Jeff Johnson +- rebuild for sparc baud rates > 38400. + +* Fri Feb 11 2000 Bill Nottingham +- fix description + +* Mon Feb 07 2000 Preston Brown +- wmconfig gone + +* Wed Feb 02 2000 Cristian Gafton +- man pages are compressed +- fix description + +* Tue Jan 4 2000 Bill Nottingham +- split client and server + +* Tue Dec 21 1999 Jeff Johnson +- update to 0.16. + +* Sun Oct 10 1999 Matt Wilson +- corrected the Terminal setting of the .desktop (needs to be 'true' not '1') + +* Sat Sep 25 1999 Preston Brown +- red hat .desktop entry + +* Sat Aug 21 1999 Jeff Johnson +- rebuild for 6.1. + +* Wed Aug 18 1999 Bill Nottingham +- don't trust random TERM variables in telnetd (#4560) + +* Wed Jun 2 1999 Jeff Johnson +- fix (#3098). + +* Thu May 27 1999 Antti Andreimann +- 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 +- use glibc utmp routines. + +* Thu Apr 8 1999 Jeff Johnson +- fix the fix (wrong way memcpy). + +* Wed Apr 7 1999 Jeff Johnson +- fix "telnet localhost" bus error on sparc64 (alpha?). + +* Tue Apr 6 1999 Jeff Johnson +- use OpenBSD telnet client (and fix minor core dump with .telnetrc #247) + +* Thu Mar 25 1999 Erik Troan +- use openpty in telnetd + +* Sun Mar 21 1999 Cristian Gafton +- auto rebuild in the new build environment (release 22) + +* Mon Mar 15 1999 Jeff Johnson +- compile for 6.0. + +* Fri Apr 24 1998 Prospector System +- translations modified for de, fr, tr + +* Fri Apr 24 1998 Cristian Gafton +- compile C++ code using egcs + +* Tue Apr 14 1998 Erik Troan +- built against new ncurses + +* Wed Oct 29 1997 Donnie Barnes +- added wmconfig entry + +* Tue Jul 15 1997 Erik Troan +- initial build