[Re: [oe] [meta-networking][PATCH] netkit-telnet : add new recipe] On 14.11.21 (Fri 22:58) akuster808 wrote:
> Would you like the rest of the netkit series? > > maybe a recipes-netkit to house them? Sure, I certainly wouldn't object to them, and housing them together in recipes-netkit would definitely make sense. -J. > > - Armin > > On 11/21/2014 08:59 PM, Joe MacDonald wrote: > >Hi Li, > > > >Technically this seems okay, but I do have a few (hopefully) small > >requests. > > > > - Can you add an upstream-status added to the patches? And if you > > didn't author them, an indication of where they came from, ideally. > > If you did author them, can you add a more detailed description > > (and maybe remove the suggestion about what to do with Idiots :)). > > > > - Can you also clear up a couple of trailing whitepsace items in the > > new files being added? The one that jumps out at me when I look at > > the changes below is telnet-xinetd, but I thought there was a > > second one. Anyway, just have a look to make sure you aren't > > adding trailing whitespace issues. Unless, of course, it's in > > patches that you didn't author. > > > > - Can you also provide a systemd-friendly startup script for > > telnetd, then make the xinetd version optional? This one is > > probably less critical, anyway, since ... I admit, I have a bias > > against running telnetd on anything and anything I ever wanted > > telnet for I can accomplish with screen, netcat or ssh. But I > > understand that both the server and the client are useful in some > > scenarios, so we can merge the recipe when you're done of it. > > > >Thanks, > >-J. > > > > > >[[oe] [meta-networking][PATCH] netkit-telnet : add new recipe] On 14.11.21 > >(Fri 15:47) Li xin wrote: > > > >>netkit-telnet includes the telnetd and client. > >>telnetd : daemon for telnet protocol > >>telnet : client for telnet protocol > >> > >>Signed-off-by: Li Xin <[email protected]> > >>--- > >> .../files/configure-modify-parameter.patch | 71 ++ > >> .../netkit-telnet/files/telnet-modify-files.patch | 1213 > >> ++++++++++++++++++++ > >> .../netkit-telnet/files/telnet-xinetd | 14 + > >> .../files/telnetd-Makefile-modify-parameter.patch | 36 + > >> .../netkit-telnet/netkit-telnet_0.17.bb | 50 + > >> 5 files changed, 1384 insertions(+) > >> create mode 100644 > >> meta-networking/recipes-daemons/netkit-telnet/files/configure-modify-parameter.patch > >> create mode 100644 > >> meta-networking/recipes-daemons/netkit-telnet/files/telnet-modify-files.patch > >> create mode 100644 > >> meta-networking/recipes-daemons/netkit-telnet/files/telnet-xinetd > >> create mode 100644 > >> meta-networking/recipes-daemons/netkit-telnet/files/telnetd-Makefile-modify-parameter.patch > >> create mode 100644 > >> meta-networking/recipes-daemons/netkit-telnet/netkit-telnet_0.17.bb > >> > >>diff --git > >>a/meta-networking/recipes-daemons/netkit-telnet/files/configure-modify-parameter.patch > >> > >>b/meta-networking/recipes-daemons/netkit-telnet/files/configure-modify-parameter.patch > >>new file mode 100644 > >>index 0000000..4763118 > >>--- /dev/null > >>+++ > >>b/meta-networking/recipes-daemons/netkit-telnet/files/configure-modify-parameter.patch > >>@@ -0,0 +1,71 @@ > >>+From d9d2572dcc99cea7f00f651f0eddeb3c813b6025 Mon Sep 17 00:00:00 2001 > >>+From: Li xin <[email protected]> > >>+Date: Wed, 19 Nov 2014 18:38:08 +0900 > >>+Subject: [PATCH] configure : modify parameter > >>+ > >>+Signed-off-by: Li Xin <[email protected]> > >>+--- > >>+ configure | 12 ++++++------ > >>+ 1 file changed, 6 insertions(+), 6 deletions(-) > >>+ > >>+diff --git a/configure b/configure > >>+index 429167a..f6f44a1 100755 > >>+--- a/configure > >>++++ b/configure > >>+@@ -67,7 +67,7 @@ fi > >>+ > >>+ ################################################## > >>+ > >>+-WARNINGS='-Wall -W -Wpointer-arith -Wbad-function-cast -Wcast-qual > >>-Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations > >>-Wnested-externs -Winline ' > >>++WARNINGS='-Wall -Wno-trigraphs ' > >>+ > >>+ cat << EOF > __conftest.c > >>+ int main() { int class=0; return class; } > >>+@@ -94,7 +94,7 @@ else > >>+ echo -n 'Checking if C compiler works... ' > >>+ if ( > >>+ $CC __conftest.c -o __conftest || exit 1 > >>+- ./__conftest || exit 1 > >>++ # Idiots belong shot! ./__conftest || exit 1 > >>+ ) >/dev/null 2>&1; then > >>+ echo 'yes' > >>+ else > >>+@@ -117,7 +117,7 @@ fi > >>+ > >>+ cat << EOF > __conftest.cc > >>+ template <class T> class fnord { public: T x; fnord(T y) { x=y; }}; > >>+- int main() { fnord<int> a(0); return a.x; } > >>++ int main() { fnord<int> *a = new fnord<int>(0); return a->x; } > >>+ EOF > >>+ > >>+ if [ x"$CXX" = x ]; then > >>+@@ -141,7 +141,7 @@ else > >>+ echo -n 'Checking if C++ compiler works... ' > >>+ if ( > >>+ $CXX __conftest.cc -o __conftest || exit 1 > >>+- ./__conftest || exit 1 > >>++ # Iditios belong shot! ./__conftest || exit 1 > >>+ ) >/dev/null 2>&1; then > >>+ echo 'yes' > >>+ else > >>+@@ -284,7 +284,7 @@ if ( > >>+ else > >>+ if ( > >>+ $CXX $CXXFLAGS -D__USE_BSD_SIGNAL __conftest.cc -o __conftest > >>|| exit 1 > >>+- ./__conftest || exit 1 > >>++ # running still does not work./__conftest || exit 1 > >>+ ) >/dev/null 2>&1; then > >>+ echo '-D__USE_BSD_SIGNAL' > >>+ CFLAGS="$CFLAGS -D__USE_BSD_SIGNAL" > >>+@@ -501,7 +501,7 @@ int main() { > >>+ EOF > >>+ if ( > >>+ $CXX $CXXFLAGS __conftest.cc $LIBBSD -o __conftest || exit 1 > >>+- ./__conftest || exit 1 > >>++ # argh! morons!./__conftest || exit 1 > >>+ ) >/dev/null 2>&1; then > >>+ echo 'ok' > >>+ else > >>+-- > >>+1.8.4.2 > >>+ > >>diff --git > >>a/meta-networking/recipes-daemons/netkit-telnet/files/telnet-modify-files.patch > >> > >>b/meta-networking/recipes-daemons/netkit-telnet/files/telnet-modify-files.patch > >>new file mode 100644 > >>index 0000000..bd1361d > >>--- /dev/null > >>+++ > >>b/meta-networking/recipes-daemons/netkit-telnet/files/telnet-modify-files.patch > >>@@ -0,0 +1,1213 @@ > >>+From 41014adf9491aacef8f03e6c4b4bebb227efa844 Mon Sep 17 00:00:00 2001 > >>+From: Li xin <[email protected]> > >>+Date: Wed, 19 Nov 2014 15:11:10 +0900 > >>+Subject: [PATCH] telnet : modify files > >>+ > >>+Signed-off-by: Li Xin <[email protected]> > >>+--- > >>+ telnet/Makefile | 4 +- > >>+ telnet/commands.cc | 270 > >>+++++++++++++++++++++++++++++++++++----------------- > >>+ telnet/defines.h | 2 + > >>+ telnet/externs.h | 7 +- > >>+ telnet/main.cc | 65 ++++++++++--- > >>+ telnet/netlink.cc | 78 +++++++++------ > >>+ telnet/netlink.h | 7 +- > >>+ telnet/network.cc | 1 + > >>+ telnet/proto.h | 2 +- > >>+ telnet/ring.cc | 2 +- > >>+ telnet/ring.h | 2 +- > >>+ telnet/sys_bsd.cc | 11 +++ > >>+ telnet/telnet.1 | 37 +++++-- > >>+ telnet/telnet.cc | 45 +++++---- > >>+ telnet/terminal.cc | 17 +++- > >>+ telnet/utilities.cc | 2 + > >>+ 16 files changed, 380 insertions(+), 172 deletions(-) > >>+ > >>+diff --git a/telnet/Makefile b/telnet/Makefile > >>+index cef866f..39249e1 100644 > >>+--- a/telnet/Makefile > >>++++ b/telnet/Makefile > >>+@@ -7,7 +7,7 @@ include ../MRULES > >>+ > >>+ # -DAUTHENTICATE > >>+ CXXFLAGS += -DUSE_TERMIO -DKLUDGELINEMODE > >>+-LIBS += $(LIBTERMCAP) > >>++LIBS = $(LIBTERMCAP) > >>+ > >>+ SRCS = commands.cc main.cc network.cc ring.cc sys_bsd.cc telnet.cc \ > >>+ terminal.cc tn3270.cc utilities.cc genget.cc environ.cc netlink.cc > >>+@@ -22,7 +22,7 @@ depend: > >>+ $(CXX) $(CXXFLAGS) -MM $(SRCS) >depend.mk > >>+ > >>+ install: telnet > >>+- install -s -m$(BINMODE) telnet $(INSTALLROOT)$(BINDIR) > >>++ install -m$(BINMODE) telnet $(INSTALLROOT)$(BINDIR) > >>+ install -m$(MANMODE) telnet.1 $(INSTALLROOT)$(MANDIR)/man1 > >>+ > >>+ clean: > >>+diff --git a/telnet/commands.cc b/telnet/commands.cc > >>+index d92bccd..02c593e 100644 > >>+--- a/telnet/commands.cc > >>++++ b/telnet/commands.cc > >>+@@ -86,10 +86,6 @@ char cmd_rcsid[] = > >>+ > >>+ #define HELPINDENT ((int) sizeof ("connect")) > >>+ > >>+-#ifndef MAXHOSTNAMELEN > >>+-#define MAXHOSTNAMELEN 64 > >>+-#endif MAXHOSTNAMELEN > >>+- > >>+ #if defined(HAS_IPPROTO_IP) && defined(IP_TOS) > >>+ int tos = -1; > >>+ #endif /* defined(HAS_IPPROTO_IP) && defined(IP_TOS) */ > >>+@@ -98,7 +94,7 @@ static unsigned long sourceroute(char *arg, char **cpp, > >>int *lenp); > >>+ > >>+ > >>+ char *hostname; > >>+-static char _hostname[MAXHOSTNAMELEN]; > >>++static char *_hostname; > >>+ > >>+ //typedef int (*intrtn_t)(int argc, const char *argv[]); > >>+ > >>+@@ -161,7 +157,7 @@ class command_entry { > >>+ assert(argc>=1); > >>+ if (nargs>=0 && argc!=nargs+1) { > >>+ fprintf(stderr, "Wrong number of arguments for command.\n"); > >>+- fprintf(stderr, "Try %s ? for help\n", argv[0]); > >>++ fprintf(stderr, "Try ? %s for help\n", argv[0]); > >>+ return 0; /* is this right? */ > >>+ } > >>+ if (nargs==-2) { > >>+@@ -480,6 +476,7 @@ static int send_wontcmd(const char *name, const char > >>*) { > >>+ int send_tncmd(int (*func)(int, int), const char *cmd, const char *name) { > >>+ char **cpp; > >>+ extern char *telopts[]; > >>++ long opt; > >>+ > >>+ if (isprefix(name, "help") || isprefix(name, "?")) { > >>+ register int col, len; > >>+@@ -506,16 +503,23 @@ int send_tncmd(int (*func)(int, int), const char > >>*cmd, const char *name) { > >>+ name, cmd); > >>+ return 0; > >>+ } > >>++ > >>++ opt = cpp - telopts; > >>+ if (cpp == 0) { > >>+- fprintf(stderr, "'%s': unknown argument ('send %s ?' for help).\n", > >>++ char *end; > >>++ > >>++ opt = strtol(name, &end, 10); > >>++ if (*end || opt < 0 || opt > 255) { > >>++ fprintf(stderr, "'%s': unknown argument ('send %s ?' for help).\n", > >>+ name, cmd); > >>+- return 0; > >>++ return 0; > >>++ } > >>+ } > >>+ if (!connected) { > >>+ printf("?Need to be connected first.\n"); > >>+ return 0; > >>+ } > >>+- (*func)(cpp - telopts, 1); > >>++ (*func)(opt, 1); > >>+ return 1; > >>+ } > >>+ > >>+@@ -689,9 +693,9 @@ static struct togglelist Togglelist[] = { > >>+ "print encryption debugging information" }, > >>+ #endif > >>+ > >>+- { "skiprc", "don't read ~/.telnetrc file", > >>++ { "skiprc", "don't read the telnetrc files", > >>+ NULL, &skiprc, > >>+- "read ~/.telnetrc file" }, > >>++ "read the telnetrc files" }, > >>+ { "binary", > >>+ "sending and receiving of binary data", > >>+ togbinary, NULL, > >>+@@ -1615,15 +1619,20 @@ void ayt_status(int) { > >>+ #endif > >>+ > >>+ int tn(int argc, const char *argv[]) { > >>+- register struct hostent *host = 0; > >>+ struct sockaddr_in sn; > >>+- struct servent *sp = 0; > >>+ char *srp = NULL; > >>+ int srlen; > >>+- > >>+- const char *cmd, *volatile user = 0; > >>++ int family = 0; > >>++ const char *cmd, *volatile user = 0, *srchostp = 0; > >>+ const char *portp = NULL; > >>+ char *hostp = NULL; > >>++ char *resolv_hostp; > >>++ struct addrinfo hints; > >>++ struct addrinfo *hostaddr = 0; > >>++ int res; > >>++ char name[NI_MAXHOST]; > >>++ char service[NI_MAXSERV]; > >>++ struct addrinfo *tmpaddr; > >>+ > >>+ /* clear the socket address prior to use */ > >>+ memset(&sn, 0, sizeof(sn)); > >>+@@ -1632,6 +1641,10 @@ int tn(int argc, const char *argv[]) { > >>+ printf("?Already connected to %s\n", hostname); > >>+ return 0; > >>+ } > >>++ if (_hostname) { > >>++ delete[] _hostname; > >>++ _hostname = 0; > >>++ } > >>+ if (argc < 2) { > >>+ (void) strcpy(line, "open "); > >>+ printf("(to) "); > >>+@@ -1657,11 +1670,33 @@ int tn(int argc, const char *argv[]) { > >>+ --argc; > >>+ continue; > >>+ } > >>++ if (strcmp(*argv, "-b") == 0) { > >>++ --argc; ++argv; > >>++ if (argc == 0) > >>++ goto usage; > >>++ srchostp = *argv++; > >>++ --argc; > >>++ continue; > >>++ } > >>+ if (strcmp(*argv, "-a") == 0) { > >>+ --argc; ++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) { > >>+ /* this leaks memory - FIXME */ > >>+ hostp = strdup(*argv++); > >>+@@ -1680,6 +1715,8 @@ int tn(int argc, const char *argv[]) { > >>+ if (hostp == 0) > >>+ goto usage; > >>+ > >>++ resolv_hostp = hostp; > >>++ > >>+ #if defined(IP_OPTIONS) && defined(HAS_IPPROTO_IP) > >>+ if (hostp[0] == '@' || hostp[0] == '!') { > >>+ if ((hostname = strrchr(hostp, ':')) == NULL) > >>+@@ -1696,78 +1733,122 @@ int tn(int argc, const char *argv[]) { > >>+ } else { > >>+ sn.sin_addr.s_addr = temp; > >>+ sn.sin_family = AF_INET; > >>++ /* > >>++ * For source route we just make sure to get the IP given > >>++ * on the command line when looking up the port. > >>++ */ > >>++ resolv_hostp = inet_ntoa(sn.sin_addr); > >>+ } > >>+ } > >>+- else { > >>+-#endif > >>+- if (inet_aton(hostp, &sn.sin_addr)) { > >>+- sn.sin_family = AF_INET; > >>+- strcpy(_hostname, hostp); > >>+- hostname = _hostname; > >>+- } > >>+- else { > >>+- host = gethostbyname(hostp); > >>+- if (host) { > >>+- sn.sin_family = host->h_addrtype; > >>+- if (host->h_length > (int)sizeof(sn.sin_addr)) { > >>+- host->h_length = sizeof(sn.sin_addr); > >>+- } > >>+-#if defined(h_addr) /* In 4.3, this is a #define */ > >>+- memcpy((caddr_t)&sn.sin_addr, > >>+- host->h_addr_list[0], host->h_length); > >>+-#else /* defined(h_addr) */ > >>+- memcpy((caddr_t)&sn.sin_addr, host->h_addr, host->h_length); > >>+-#endif /* defined(h_addr) */ > >>+- strncpy(_hostname, host->h_name, sizeof(_hostname)); > >>+- _hostname[sizeof(_hostname)-1] = '\0'; > >>+- hostname = _hostname; > >>+- } else { > >>+- herror(hostp); > >>+- return 0; > >>+- } > >>+- } > >>+-#if defined(IP_OPTIONS) && defined(HAS_IPPROTO_IP) > >>+- } > >>+ #endif > >>++ > >>++ /* User port or the default name of telnet. */ > >>+ if (portp) { > >>+ if (*portp == '-') { > >>+ portp++; > >>+ telnetport = 1; > >>+- } else > >>++ } else { > >>+ telnetport = 0; > >>+- sn.sin_port = atoi(portp); > >>+- if (sn.sin_port == 0) { > >>+- sp = getservbyname(portp, "tcp"); > >>+- if (sp) > >>+- sn.sin_port = sp->s_port; > >>+- else { > >>+- printf("%s: bad port number\n", portp); > >>+- return 0; > >>++ if (*portp >='0' && *portp<='9') { > >>++ char *end; > >>++ long int p; > >>++ > >>++ p=strtol(portp, &end, 10); > >>++ if (ERANGE==errno && (LONG_MIN==p || LONG_MAX==p)) { > >>++ fprintf(stderr, "telnet: port %s overflows\n", portp); > >>++ return 0; > >>++ } else if (p<=0 || p>=65536) { > >>++ fprintf(stderr, "telnet: port %s out of range\n", portp); > >>++ return 0; > >>++ } > >>+ } > >>+- } > >>+- else { > >>+- sn.sin_port = htons(sn.sin_port); > >>+ } > >>+- } > >>++ } > >>+ else { > >>+- if (sp == 0) { > >>+- sp = getservbyname("telnet", "tcp"); > >>+- if (sp == 0) { > >>+- fprintf(stderr, "telnet: tcp/telnet: unknown service\n"); > >>+- return 0; > >>+- } > >>+- sn.sin_port = sp->s_port; > >>+- } > >>++ portp = "telnet"; > >>+ telnetport = 1; > >>+ } > >>+- printf("Trying %s...\n", inet_ntoa(sn.sin_addr)); > >>++ > >>++ /* We only understand SOCK_STREAM sockets. */ > >>++ memset(&hints, 0, sizeof(hints)); > >>++ hints.ai_socktype = SOCK_STREAM; > >>++ hints.ai_flags = AI_NUMERICHOST; > >>++ hints.ai_family = family; > >>++ > >>++ if (srchostp) { > >>++ res = getaddrinfo(srchostp, "0", &hints, &hostaddr); > >>++ if (res) { > >>++ fprintf(stderr, "telnet: could not resolve %s: %s\n", srchostp, > >>++ gai_strerror(res)); > >>++ return 0; > >>++ } > >>++ hints.ai_family = hostaddr->ai_family; > >>++ res = nlink.bind(hostaddr); > >>++ freeaddrinfo(hostaddr); > >>++ if (res < 0) > >>++ return 0; > >>++ } > >>++ > >>++ /* Resolve both the host and service simultaneously. */ > >>++ res = getaddrinfo(resolv_hostp, portp, &hints, &hostaddr); > >>++ if (res == EAI_NONAME) { > >>++ hints.ai_flags = AI_CANONNAME; > >>++ res = getaddrinfo(resolv_hostp, portp, &hints, &hostaddr); > >>++ } else if (hostaddr) { > >>++ hostaddr->ai_canonname = 0; > >>++ } > >>++ if (res || !hostaddr) { > >>++ fprintf(stderr, "telnet: could not resolve %s/%s: %s\n", resolv_hostp, > >>portp, gai_strerror(res)); > >>++ return 0; > >>++ } > >>++ > >>++ /* Try to connect to every listed round robin IP. */ > >>++ tmpaddr = hostaddr; > >>++ errno = 0; > >>+ do { > >>+- int x = nlink.connect(debug, host, &sn, srp, srlen, tos); > >>+- if (!x) return 0; > >>+- else if (x==1) continue; > >>++ int x; > >>++ > >>++ if (!tmpaddr) { > >>++ if (errno) > >>++ perror("telnet: Unable to connect to remote host"); > >>++ else > >>++ fputs("telnet: Unable to connect to remote host: " > >>++ "Bad port number\n", stderr); > >>++err: > >>++ freeaddrinfo(hostaddr); > >>++ return 0; > >>++ } > >>++ > >>++ if (tmpaddr->ai_family == AF_UNIX) { > >>++nextaddr: > >>++ tmpaddr = tmpaddr->ai_next; > >>++ continue; > >>++ } > >>++ > >>++ getnameinfo(tmpaddr->ai_addr, tmpaddr->ai_addrlen, > >>++ name, sizeof(name), service, sizeof(service), > >>++ NI_NUMERICHOST | NI_NUMERICSERV); > >>++ > >>++ printf("Trying %s...\n", name); > >>++ x = nlink.connect(debug, tmpaddr, srp, srlen, tos); > >>++ if (!x) > >>++ goto err; > >>++ else if (x==1) > >>++ goto nextaddr; > >>++ > >>+ connected++; > >>+ } while (connected == 0); > >>+- cmdrc(hostp, hostname); > >>++ if (tmpaddr->ai_canonname == 0) { > >>++ hostname = new char[strlen(hostp)+1]; > >>++ strcpy(hostname, hostp); > >>++ } > >>++ else { > >>++ hostname = new char[strlen(tmpaddr->ai_canonname)+1]; > >>++ strcpy(hostname, tmpaddr->ai_canonname); > >>++ } > >>++ > >>++ cmdrc(hostp, hostname, portp); > >>++ freeaddrinfo(hostaddr); > >>+ if (autologin && user == NULL) { > >>+ struct passwd *pw; > >>+ > >>+@@ -2013,30 +2094,21 @@ static int help(command_table *tab, int argc, > >>const char *argv[]) { > >>+ return 0; > >>+ } > >>+ > >>+-static char *rcname = 0; > >>+-static char rcbuf[128]; > >>+- > >>+-void cmdrc(const char *m1, const char *m2) { > >>++static void readrc(const char *m1, const char *m2, const char *port, > >>++ const char *rcname) > >>++{ > >>+ FILE *rcfile; > >>+ int gotmachine = 0; > >>+ int l1 = strlen(m1); > >>+ int l2 = strlen(m2); > >>+- char m1save[64]; > >>+- > >>+- if (skiprc) return; > >>++ int lport = strlen(port); > >>++ char m1save[l1 + 1]; > >>++ char portsave[lport + 1]; > >>+ > >>+ strcpy(m1save, m1); > >>+ m1 = m1save; > >>+- > >>+- if (rcname == 0) { > >>+- rcname = getenv("HOME"); > >>+- if (rcname) > >>+- strcpy(rcbuf, rcname); > >>+- else > >>+- rcbuf[0] = '\0'; > >>+- strcat(rcbuf, "/.telnetrc"); > >>+- rcname = rcbuf; > >>+- } > >>++ strcpy(portsave, port); > >>++ port = portsave; > >>+ > >>+ rcfile = fopen(rcname, "r"); > >>+ if (!rcfile) return; > >>+@@ -2061,6 +2133,13 @@ void cmdrc(const char *m1, const char *m2) { > >>+ strncpy(line, &line[7], sizeof(line) - 7); > >>+ else > >>+ continue; > >>++ > >>++ if (line[0] == ':') { > >>++ if (!strncasecmp(&line[1], port, lport)) > >>++ continue; > >>++ strncpy(line, &line[lport + 1], sizeof(line) - lport - 1); > >>++ } > >>++ > >>+ if (line[0] != ' ' && line[0] != '\t' && line[0] != '\n') > >>+ continue; > >>+ gotmachine = 1; > >>+@@ -2073,6 +2152,21 @@ void cmdrc(const char *m1, const char *m2) { > >>+ fclose(rcfile); > >>+ } > >>+ > >>++void cmdrc(const char *m1, const char *m2, const char *port) { > >>++ char *rcname = NULL; > >>++ > >>++ if (skiprc) return; > >>++ > >>++ readrc(m1, m2, port, "/etc/telnetrc"); > >>++ if (asprintf (&rcname, "%s/.telnetrc", getenv ("HOME")) == -1) > >>++ { > >>++ perror ("asprintf"); > >>++ return; > >>++ } > >>++ readrc(m1, m2, port, rcname); > >>++ free (rcname); > >>++} > >>++ > >>+ #if defined(IP_OPTIONS) && defined(HAS_IPPROTO_IP) > >>+ > >>+ /* > >>+diff --git a/telnet/defines.h b/telnet/defines.h > >>+index 2784400..d5edc46 100644 > >>+--- a/telnet/defines.h > >>++++ b/telnet/defines.h > >>+@@ -50,3 +50,5 @@ > >>+ #define MODE_COMMAND_LINE(m) ((m)==-1) > >>+ > >>+ #define CONTROL(x) ((x)&0x1f) /* CTRL(x) is not > >>portable */ > >>++ > >>++#define MODE_OUT8 0x8000 /* binary mode sans -opost */ > >>+diff --git a/telnet/externs.h b/telnet/externs.h > >>+index 955df79..0730e8a 100644 > >>+--- a/telnet/externs.h > >>++++ b/telnet/externs.h > >>+@@ -48,9 +48,7 @@ > >>+ typedef unsigned char cc_t; > >>+ #endif > >>+ > >>+-#ifdef __linux__ > >>+ #include <unistd.h> /* get _POSIX_VDISABLE */ > >>+-#endif > >>+ > >>+ #ifndef _POSIX_VDISABLE > >>+ #error "Please fix externs.h to define _POSIX_VDISABLE" > >>+@@ -60,7 +58,8 @@ typedef unsigned char cc_t; > >>+ > >>+ extern int autologin; /* Autologin enabled */ > >>+ extern int skiprc; /* Don't process the ~/.telnetrc file */ > >>+-extern int eight; /* use eight bit mode (binary in and/or out */ > >>++extern int eight; /* use eight bit mode (binary in and/or out) */ > >>++extern int binary; /* use binary option (in and/or out) */ > >>+ extern int flushout; /* flush output */ > >>+ extern int connected; /* Are we connected to the other side? > >>*/ > >>+ extern int globalmode; /* Mode tty should be in */ > >>+@@ -225,6 +224,8 @@ cc_t *tcval(int); > >>+ > >>+ //#if 0 > >>+ extern struct termios new_tc; > >>++extern struct termios old_tc; > >>++ > >>+ > >>+ #define termEofChar new_tc.c_cc[VEOF] > >>+ #define termEraseChar new_tc.c_cc[VERASE] > >>+diff --git a/telnet/main.cc b/telnet/main.cc > >>+index b67f2ce..b626e54 100644 > >>+--- a/telnet/main.cc > >>++++ b/telnet/main.cc > >>+@@ -45,7 +45,10 @@ char main_rcsid[] = > >>+ > >>+ #include <sys/types.h> > >>+ #include <getopt.h> > >>++#include <stdlib.h> > >>+ #include <string.h> > >>++#include <netdb.h> > >>++#include <errno.h> > >>+ > >>+ #include "ring.h" > >>+ #include "externs.h" > >>+@@ -80,12 +83,13 @@ tninit(void) > >>+ void usage(void) { > >>+ fprintf(stderr, "Usage: %s %s%s%s%s\n", > >>+ prompt, > >>+- " [-8] [-E] [-L] [-a] [-d] [-e char] [-l user] [-n tracefile]", > >>+- "\n\t", > >>++ "[-4] [-6] [-8] [-E] [-L] [-a] [-d] [-e char] [-l user]", > >>++ "\n\t[-n tracefile] [ -b addr ]", > >>+ #ifdef TN3270 > >>++ "\n\t" > >>+ "[-noasynch] [-noasynctty] [-noasyncnet] [-r] [-t transcom]\n\t", > >>+ #else > >>+- "[-r] ", > >>++ " [-r] ", > >>+ #endif > >>+ "[host-name [port]]" > >>+ ); > >>+@@ -102,7 +106,8 @@ main(int argc, char *argv[]) > >>+ extern char *optarg; > >>+ extern int optind; > >>+ int ch; > >>+- char *user; > >>++ char *user, *srcaddr; > >>++ int family; > >>+ > >>+ tninit(); /* Clear out things */ > >>+ #if defined(CRAY) && !defined(__STDC__) > >>+@@ -110,21 +115,38 @@ main(int argc, char *argv[]) > >>+ #endif > >>+ > >>+ TerminalSaveState(); > >>++ if ((old_tc.c_cflag & (CSIZE|PARENB)) != CS8) > >>++ eight = 0; > >>+ > >>+ if ((prompt = strrchr(argv[0], '/'))!=NULL) > >>+ ++prompt; > >>+ else > >>+ prompt = argv[0]; > >>+ > >>+- user = NULL; > >>++ user = srcaddr = NULL; > >>++ family = 0; > >>+ > >>+ rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE; > >>+ autologin = -1; > >>+ > >>+- while ((ch = getopt(argc, argv, "8EKLS:X:ade:k:l:n:rt:x")) != EOF) { > >>++ while ((ch = getopt(argc, argv, > >>++ "4678EKLS:X:ab:de:k:l:n:rt:x")) != EOF) { > >>+ 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 '7': > >>++ eight = 0; /* 7-bit ouput and input */ > >>++ break; > >>+ case '8': > >>+- eight = 3; /* binary output and input */ > >>++ binary = 3; /* binary output and input */ > >>+ break; > >>+ case 'E': > >>+ rlogin = escapechar = _POSIX_VDISABLE; > >>+@@ -133,23 +155,26 @@ main(int argc, char *argv[]) > >>+ //autologin = 0; > >>+ break; > >>+ case 'L': > >>+- eight |= 2; /* binary output only */ > >>++ binary |= 2; /* binary output only */ > >>+ break; > >>+ case 'S': > >>+ { > >>+-#ifdef HAS_GETTOS > >>+ extern int tos; > >>++ int num; > >>+ > >>+- if ((tos = parsetos(optarg, "tcp")) < 0) > >>++#ifdef HAS_GETTOS > >>++ if ((num = parsetos(optarg, "tcp")) < 0) { > >>++#else > >>++ errno = 0; > >>++ num = strtol(optarg, 0, 0); > >>++ if (errno) { > >>++#endif > >>+ fprintf(stderr, "%s%s%s%s\n", > >>+ prompt, ": Bad TOS argument '", > >>+ optarg, > >>+ "; will try to use default TOS"); > >>+-#else > >>+- fprintf(stderr, > >>+- "%s: Warning: -S ignored, no parsetos() support.\n", > >>+- prompt); > >>+-#endif > >>++ } else > >>++ tos = num; > >>+ } > >>+ break; > >>+ case 'X': > >>+@@ -210,6 +235,9 @@ main(int argc, char *argv[]) > >>+ "%s: -x ignored, no encryption support.\n", > >>+ prompt); > >>+ break; > >>++ case 'b': > >>++ srcaddr = optarg; > >>++ break; > >>+ case '?': > >>+ default: > >>+ usage(); > >>+@@ -233,6 +261,13 @@ main(int argc, char *argv[]) > >>+ *argp++ = "-l"; > >>+ *argp++ = user; > >>+ } > >>++ if (srcaddr) { > >>++ *argp++ = "-b"; > >>++ *argp++ = srcaddr; > >>++ } > >>++ if (family) { > >>++ *argp++ = family == AF_INET ? "-4" : "-6"; > >>++ } > >>+ *argp++ = argv[0]; /* host */ > >>+ if (argc > 1) > >>+ *argp++ = argv[1]; /* port */ > >>+diff --git a/telnet/netlink.cc b/telnet/netlink.cc > >>+index f439cff..f839747 100644 > >>+--- a/telnet/netlink.cc > >>++++ b/telnet/netlink.cc > >>+@@ -79,22 +79,61 @@ void netlink::close(int doshutdown) { > >>+ shutdown(net, 2); > >>+ } > >>+ ::close(net); > >>++ net = -1; > >>+ } > >>+ > >>+-int netlink::connect(int debug, struct hostent *host, > >>+- struct sockaddr_in *sn, > >>+- char *srcroute, int srlen, int tos) > >>++int netlink::bind(struct addrinfo *addr) > >>+ { > >>+- int on=1; > >>++ int res; > >>++ > >>++ res = socket(addr->ai_family); > >>++ if (res < 2) { > >>++ if (res == 1) > >>++ perror("telnet: socket"); > >>++ return -1; > >>++ } > >>++ > >>++ if (::bind(net, addr->ai_addr, addr->ai_addrlen) < 0) { > >>++ perror("telnet: bind"); > >>++ return -1; > >>++ } > >>++ > >>++ return 0; > >>++} > >>++ > >>++int netlink::socket(int family) > >>++{ > >>++ if (this->family != family) > >>++ close(0); > >>+ > >>+- net = socket(AF_INET, SOCK_STREAM, 0); > >>+ if (net < 0) { > >>+- perror("telnet: socket"); > >>+- return 0; > >>++ this->family = family; > >>++ net = ::socket(family, SOCK_STREAM, 0); > >>++ if (net < 0) { > >>++ if (errno == EAFNOSUPPORT) > >>++ return 1; > >>++ perror("telnet: socket"); > >>++ return 0; > >>++ } > >>+ } > >>+ > >>++ return 2; > >>++} > >>++ > >>++int netlink::connect(int debug, struct addrinfo *addr, > >>++ char *srcroute, int srlen, int tos) > >>++{ > >>++ int on=1; > >>++ int res; > >>++ > >>++ res = socket(addr->ai_family); > >>++ if (res < 2) > >>++ return res; > >>++ > >>+ #if defined(IP_OPTIONS) && defined(HAS_IPPROTO_IP) > >>+ if (srcroute) { > >>++ if (addr->ai_family != AF_INET) > >>++ fputs("Source route is only supported for IPv4\n", stderr); > >>+ if (setsockopt(net, IPPROTO_IP, IP_OPTIONS, srcroute, srlen) < 0) > >>+ perror("setsockopt (IP_OPTIONS)"); > >>+ } > >>+@@ -108,7 +147,7 @@ int netlink::connect(int debug, struct hostent *host, > >>+ #endif > >>+ if (tos < 0) tos = 020; /* Low Delay bit */ > >>+ if (tos && (setsockopt(net, IPPROTO_IP, IP_TOS, &tos, sizeof(int)) < > >>0) > >>+- && (errno != ENOPROTOOPT)) > >>++ && (errno != ENOPROTOOPT) && (errno != EOPNOTSUPP)) > >>+ perror("telnet: setsockopt (IP_TOS) (ignored)"); > >>+ #endif /* defined(IPPROTO_IP) && defined(IP_TOS) */ > >>+ > >>+@@ -116,27 +155,8 @@ int netlink::connect(int debug, struct hostent *host, > >>+ perror("setsockopt (SO_DEBUG)"); > >>+ } > >>+ > >>+- if (::connect(net, (struct sockaddr *)sn, sizeof(*sn)) < 0) { > >>+-#if defined(h_addr) /* In 4.3, this is a #define */ > >>+- if (host && host->h_addr_list[1]) { > >>+- int oerrno = errno; > >>+- > >>+- fprintf(stderr, "telnet: connect to address %s: ", > >>+- inet_ntoa(sn->sin_addr)); > >>+- errno = oerrno; > >>+- perror(NULL); > >>+- host->h_addr_list++; > >>+- if (host->h_length > (int)sizeof(sn->sin_addr)) { > >>+- host->h_length = sizeof(sn->sin_addr); > >>+- } > >>+- memcpy(&sn->sin_addr, host->h_addr_list[0], host->h_length); > >>+- close(net); > >>+- return 1; > >>+- } > >>+-#endif /* defined(h_addr) */ > >>+- > >>+- perror("telnet: Unable to connect to remote host"); > >>+- return 0; > >>++ if (::connect(net, addr->ai_addr, addr->ai_addrlen) < 0) { > >>++ return 1; > >>+ } > >>+ return 2; > >>+ } > >>+diff --git a/telnet/netlink.h b/telnet/netlink.h > >>+index 9852b30..0ac8a08 100644 > >>+--- a/telnet/netlink.h > >>++++ b/telnet/netlink.h > >>+@@ -1,13 +1,16 @@ > >>+ > >>+ class netlink { > >>++ private: > >>++ int family; > >>+ protected: > >>+ int net; > >>+ public: > >>+ netlink(); > >>+ ~netlink(); > >>+ > >>+- int connect(int debug, struct hostent *host, > >>+- struct sockaddr_in *sin, > >>++ int bind(struct addrinfo *hostaddr); > >>++ int socket(int family); > >>++ int connect(int debug, struct addrinfo *hostaddr, > >>+ char *srcroute, int srlen, > >>+ int tos); > >>+ void close(int doshutdown); > >>+diff --git a/telnet/network.cc b/telnet/network.cc > >>+index 6a2c374..0dcf3e2 100644 > >>+--- a/telnet/network.cc > >>++++ b/telnet/network.cc > >>+@@ -40,6 +40,7 @@ char net_rcsid[] = > >>+ #include <sys/types.h> > >>+ #include <sys/socket.h> > >>+ #include <sys/time.h> > >>++#include <stdlib.h> > >>+ #include <errno.h> > >>+ #include <arpa/telnet.h> > >>+ > >>+diff --git a/telnet/proto.h b/telnet/proto.h > >>+index 8be4a39..92f2419 100644 > >>+--- a/telnet/proto.h > >>++++ b/telnet/proto.h > >>+@@ -13,7 +13,7 @@ int TerminalWindowSize(long *rows, long *cols); > >>+ void auth_encrypt_user(char *); > >>+ void auth_name(unsigned char *, int); > >>+ void auth_printsub(unsigned char *, int, unsigned char *, int); > >>+-void cmdrc(const char *m1, const char *m2); > >>++void cmdrc(const char *, const char *, const char *); > >>+ void env_init(void); > >>+ int getconnmode(void); > >>+ void init_network(void); > >>+diff --git a/telnet/ring.cc b/telnet/ring.cc > >>+index be57396..772c6c5 100644 > >>+--- a/telnet/ring.cc > >>++++ b/telnet/ring.cc > >>+@@ -165,7 +165,7 @@ int ringbuf::flush() { > >>+ > >>+ /////////////////////////////////////////////////// supply ////////////// > >>+ > >>+-void ringbuf::printf(const char *format, ...) { > >>++void ringbuf::xprintf(const char *format, ...) { > >>+ char xbuf[256]; > >>+ va_list ap; > >>+ va_start(ap, format); > >>+diff --git a/telnet/ring.h b/telnet/ring.h > >>+index 15d3f3f..049377e 100644 > >>+--- a/telnet/ring.h > >>++++ b/telnet/ring.h > >>+@@ -83,7 +83,7 @@ class ringbuf { > >>+ // manual supply > >>+ void putch(char c) { write(&c, 1); } > >>+ void write(const char *buffer, int ct); > >>+- void printf(const char *format, ...); > >>++ void xprintf(const char *format, ...); > >>+ int empty_count() { return size - count; } > >>+ > >>+ // automatic supply > >>+diff --git a/telnet/sys_bsd.cc b/telnet/sys_bsd.cc > >>+index 93fba7e..a8c9aab 100644 > >>+--- a/telnet/sys_bsd.cc > >>++++ b/telnet/sys_bsd.cc > >>+@@ -189,18 +189,25 @@ void NetSetPgrp(int fd) { > >>+ * Various signal handling routines. > >>+ */ > >>+ > >>++#if 0 > >>+ static void deadpeer(int /*sig*/) { > >>+ setcommandmode(); > >>+ siglongjmp(peerdied, -1); > >>+ } > >>++#endif > >>+ > >>+ static void intr(int /*sig*/) { > >>+ if (localchars) { > >>+ intp(); > >>+ } > >>+ else { > >>++#if 0 > >>+ setcommandmode(); > >>+ siglongjmp(toplevel, -1); > >>++#else > >>++ signal(SIGINT, SIG_DFL); > >>++ raise(SIGINT); > >>++#endif > >>+ } > >>+ } > >>+ > >>+@@ -214,6 +221,8 @@ static void intr2(int /*sig*/) { > >>+ sendabort(); > >>+ return; > >>+ } > >>++ signal(SIGQUIT, SIG_DFL); > >>++ raise(SIGQUIT); > >>+ } > >>+ > >>+ #ifdef SIGWINCH > >>+@@ -238,7 +247,9 @@ void ayt(int sig) { > >>+ void sys_telnet_init(void) { > >>+ signal(SIGINT, intr); > >>+ signal(SIGQUIT, intr2); > >>++#if 0 > >>+ signal(SIGPIPE, deadpeer); > >>++#endif > >>+ #ifdef SIGWINCH > >>+ signal(SIGWINCH, sendwin); > >>+ #endif > >>+diff --git a/telnet/telnet.1 b/telnet/telnet.1 > >>+index 54a47fb..8365e42 100644 > >>+--- a/telnet/telnet.1 > >>++++ b/telnet/telnet.1 > >>+@@ -42,8 +42,9 @@ > >>+ protocol > >>+ .Sh SYNOPSIS > >>+ .Nm telnet > >>+-.Op Fl 8ELadr > >>++.Op Fl 468ELadr > >>+ .Op Fl S Ar tos > >>++.Op Fl b Ar address > >>+ .Op Fl e Ar escapechar > >>+ .Op Fl l Ar user > >>+ .Op Fl n Ar tracefile > >>+@@ -68,6 +69,10 @@ command implicitly; see the description below. > >>+ .Pp > >>+ Options: > >>+ .Bl -tag -width indent > >>++.It Fl 4 > >>++Force IPv4 address resolution. > >>++.It Fl 6 > >>++Force IPv6 address resolution. > >>+ .It Fl 8 > >>+ Request 8-bit operation. This causes an attempt to negotiate the > >>+ .Dv TELNET BINARY > >>+@@ -89,6 +94,8 @@ of the > >>+ option if supported by the remote system. The username is retrieved > >>+ via > >>+ .Xr getlogin 3 . > >>++.It Fl b Ar address > >>++Use bind(2) on the local socket to bind it to a specific local address. > >>+ .It Fl d > >>+ Sets the initial value of the > >>+ .Ic debug > >>+@@ -474,17 +481,29 @@ protocol without making a mess. Protocol negotiation > >>can be forced by > >>+ placing a dash before the port number. > >>+ .Pp > >>+ After establishing a connection, any commands associated with the > >>+-remote host in the user's > >>++remote host in > >>++.Pa /etc/telnetrc > >>++and the user's > >>+ .Pa .telnetrc > >>+-file are executed. > >>++file are executed, in that order. > >>+ .Pp > >>+-The format of the .telnetrc file is as follows: Lines beginning with a > >>++The format of the telnetrc files is as follows: Lines beginning with a > >>+ #, and blank lines, are ignored. The rest of the file should consist > >>+ of hostnames and sequences of > >>+ .Nm telnet > >>+ commands to use with that host. Commands should be one per line, > >>+ indented by whitespace; lines beginning without whitespace are > >>+-interpreted as hostnames. Upon connecting to a particular host, the > >>++interpreted as hostnames. Lines beginning with the special hostname > >>++.Ql DEFAULT > >>++will apply to all hosts. Hostnames including > >>++.Ql DEFAULT > >>++may be followed immediately by a colon and a port number or string. > >>++If a port is specified it must match exactly with what is specified > >>++on the command line. If no port was specified on the command line, > >>++then the value > >>++.Ql telnet > >>++is used. > >>++Upon connecting to a particular host, the > >>+ commands associated with that host are executed. > >>+ .It Ic quit > >>+ Close any open session and exit > >>+@@ -1184,9 +1203,7 @@ escape sequences are preceded by a '*' to aid in > >>locating them. > >>+ When the skiprc toggle is > >>+ .Dv TRUE , > >>+ .Tn telnet > >>+-does not read the > >>+-.Pa \&.telnetrc > >>+-file. The initial value for this toggle is > >>++does not read the telnetrc files. The initial value for this toggle is > >>+ .Dv FALSE. > >>+ .It Ic termdata > >>+ Toggles the display of all terminal data (in hexadecimal format). > >>+@@ -1239,7 +1256,9 @@ to the other side via the > >>+ .Dv TELNET ENVIRON > >>+ option. > >>+ .Sh FILES > >>+-.Bl -tag -width ~/.telnetrc -compact > >>++.Bl -tag -width /etc/telnetrc -compact > >>++.It Pa /etc/telnetrc > >>++global telnet startup values > >>+ .It Pa ~/.telnetrc > >>+ user customized telnet startup values > >>+ .El > >>+diff --git a/telnet/telnet.cc b/telnet/telnet.cc > >>+index 4fc3b1f..7eca811 100644 > >>+--- a/telnet/telnet.cc > >>++++ b/telnet/telnet.cc > >>+@@ -88,7 +88,8 @@ char do_dont_resp[256]; > >>+ char will_wont_resp[256]; > >>+ > >>+ int > >>+-eight = 0, > >>++ eight = 3, > >>++ binary = 0, > >>+ autologin = 0, /* Autologin anyone? */ > >>+ skiprc = 0, > >>+ connected, > >>+@@ -639,14 +640,14 @@ static const char *gettermname(void) { > >>+ if (resettermname) { > >>+ resettermname = 0; > >>+ tname = env_getvalue("TERM", 0); > >>+- if (!tname || my_setupterm(tname, 1, &err)) { > >>++ if (!tname /* || my_setupterm(tname, 1, &err) */) { > >>+ termbuf[0] = 0; > >>+ tname = "UNKNOWN"; > >>+ } > >>+ mklist(termbuf, tname, termtypes); > >>+ next = 0; > >>+ } > >>+- if (next==termtypes.num()) next = 0; > >>++ if (next==termtypes.num()-1) next = 0; > >>+ return termtypes[next++]; > >>+ } > >>+ /* > >>+@@ -681,7 +682,7 @@ static void suboption(void) { > >>+ } > >>+ #endif /* TN3270 */ > >>+ name = gettermname(); > >>+- netoring.printf("%c%c%c%c%s%c%c", IAC, SB, TELOPT_TTYPE, > >>++ netoring.xprintf("%c%c%c%c%s%c%c", IAC, SB, TELOPT_TTYPE, > >>+ TELQUAL_IS, name, IAC, SE); > >>+ } > >>+ break; > >>+@@ -693,7 +694,7 @@ static void suboption(void) { > >>+ if (SB_GET() == TELQUAL_SEND) { > >>+ long oospeed, iispeed; > >>+ TerminalSpeeds(&iispeed, &oospeed); > >>+- netoring.printf("%c%c%c%c%ld,%ld%c%c", IAC, SB, TELOPT_TSPEED, > >>++ netoring.xprintf("%c%c%c%c%ld,%ld%c%c", IAC, SB, TELOPT_TSPEED, > >>+ TELQUAL_IS, oospeed, iispeed, IAC, SE); > >>+ } > >>+ break; > >>+@@ -780,7 +781,7 @@ static void suboption(void) { > >>+ send_wont(TELOPT_XDISPLOC, 1); > >>+ break; > >>+ } > >>+- netoring.printf("%c%c%c%c%s%c%c", IAC, SB, TELOPT_XDISPLOC, > >>++ netoring.xprintf("%c%c%c%c%s%c%c", IAC, SB, TELOPT_XDISPLOC, > >>+ TELQUAL_IS, dp, IAC, SE); > >>+ } > >>+ break; > >>+@@ -798,7 +799,7 @@ void lm_will(unsigned char *cmd, int len) { > >>+ return; > >>+ } > >>+ > >>+- netoring.printf("%c%c%c%c%c%c%c", IAC, SB, TELOPT_LINEMODE, > >>++ netoring.xprintf("%c%c%c%c%c%c%c", IAC, SB, TELOPT_LINEMODE, > >>+ DONT, cmd[0], IAC, SE); > >>+ } > >>+ > >>+@@ -815,7 +816,7 @@ void lm_do(unsigned char *cmd, int len) { > >>+ /*@*/ printf("lm_do: no command!!!\n"); /* Should not happen... > >>*/ > >>+ return; > >>+ } > >>+- netoring.printf("%c%c%c%c%c%c%c", IAC, SB, TELOPT_LINEMODE, > >>++ netoring.xprintf("%c%c%c%c%c%c%c", IAC, SB, TELOPT_LINEMODE, > >>+ WONT, cmd[0], IAC, SE); > >>+ } > >>+ > >>+@@ -838,7 +839,7 @@ void lm_mode(unsigned char *cmd, int len, int init) { > >>+ k |= MODE_ACK; > >>+ } > >>+ > >>+- netoring.printf("%c%c%c%c%c%c%c", IAC, SB, TELOPT_LINEMODE, LM_MODE, > >>++ netoring.xprintf("%c%c%c%c%c%c%c", IAC, SB, TELOPT_LINEMODE, LM_MODE, > >>+ k, IAC, SE); > >>+ > >>+ setconnmode(0); /* set changed mode */ > >>+@@ -933,11 +934,11 @@ void slc_mode_import(int def) { > >>+ > >>+ void slc_import(int def) { > >>+ if (def) { > >>+- netoring.printf("%c%c%c%c%c%c%c%c%c", IAC, SB, TELOPT_LINEMODE, > >>++ netoring.xprintf("%c%c%c%c%c%c%c%c%c", IAC, SB, TELOPT_LINEMODE, > >>+ LM_SLC, 0, SLC_DEFAULT, 0, IAC, SE); > >>+ } > >>+ else { > >>+- netoring.printf("%c%c%c%c%c%c%c%c%c", IAC, SB, TELOPT_LINEMODE, > >>++ netoring.xprintf("%c%c%c%c%c%c%c%c%c", IAC, SB, TELOPT_LINEMODE, > >>+ LM_SLC, 0, SLC_VARIABLE, 0, IAC, SE); > >>+ } > >>+ } > >>+@@ -1050,6 +1051,7 @@ void slc_check(void) { > >>+ > >>+ > >>+ unsigned char slc_reply[128]; > >>++unsigned char const * const slc_reply_eom = &slc_reply[sizeof(slc_reply)]; > >>+ unsigned char *slc_replyp; > >>+ > >>+ void slc_start_reply(void) { > >>+@@ -1061,6 +1063,14 @@ void slc_start_reply(void) { > >>+ } > >>+ > >>+ void slc_add_reply(int func, int flags, int value) { > >>++ /* A sequence of up to 6 bytes my be written for this member of the SLC > >>++ * suboption list by this function. The end of negotiation command, > >>++ * which is written by slc_end_reply(), will require 2 additional > >>++ * bytes. Do not proceed unless there is sufficient space for these > >>++ * items. > >>++ */ > >>++ if (&slc_replyp[6+2] > slc_reply_eom) > >>++ return; > >>+ if ((*slc_replyp++ = func) == IAC) > >>+ *slc_replyp++ = IAC; > >>+ if ((*slc_replyp++ = flags) == IAC) > >>+@@ -1142,6 +1152,7 @@ void env_opt(unsigned char *buf, int len) { > >>+ } > >>+ } > >>+ > >>++/* OPT_REPLY_SIZE must be a multiple of 2. */ > >>+ #define OPT_REPLY_SIZE 256 > >>+ unsigned char *opt_reply; > >>+ unsigned char *opt_replyp; > >>+@@ -1173,6 +1184,7 @@ void env_opt_start_info(void) { > >>+ > >>+ void env_opt_add(const char *ep) { > >>+ const char *vp; > >>++ const unsigned char *tp; > >>+ unsigned char c; > >>+ > >>+ if (opt_reply == NULL) /*XXX*/ > >>+@@ -1185,11 +1197,12 @@ void env_opt_add(const char *ep) { > >>+ return; > >>+ } > >>+ vp = env_getvalue(ep, 1); > >>+- if (opt_replyp + (vp ? strlen(vp) : 0) + strlen(ep) + 6 > opt_replyend) > >>++ tp = opt_replyp + (vp ? strlen(vp) * 2 : 0) + strlen(ep) * 2 + 6; > >>++ if (tp > opt_replyend) > >>+ { > >>+ register int len; > >>+- opt_replyend += OPT_REPLY_SIZE; > >>+- len = opt_replyend - opt_reply; > >>++ len = ((tp - opt_reply) + OPT_REPLY_SIZE - 1) & ~(OPT_REPLY_SIZE - > >>1); > >>++ opt_replyend = opt_reply + len; > >>+ opt_reply = (unsigned char *)realloc(opt_reply, len); > >>+ if (opt_reply == NULL) { > >>+ /*@*/ printf("env_opt_add: realloc() failed!!!\n"); > >>+@@ -1740,8 +1753,8 @@ void telnet(const char * /*user*/) { > >>+ send_do(TELOPT_STATUS, 1); > >>+ if (env_getvalue("DISPLAY", 0)) > >>+ send_will(TELOPT_XDISPLOC, 1); > >>+- if (eight) > >>+- tel_enter_binary(eight); > >>++ if (binary) > >>++ tel_enter_binary(binary); > >>+ } > >>+ #endif /* !defined(TN3270) */ > >>+ > >>+diff --git a/telnet/terminal.cc b/telnet/terminal.cc > >>+index 9eb47ae..764f18f 100644 > >>+--- a/telnet/terminal.cc > >>++++ b/telnet/terminal.cc > >>+@@ -45,6 +45,8 @@ char terminal_rcsid[] = > >>+ #include <signal.h> > >>+ #include <errno.h> > >>+ #include <stdio.h> > >>++#include <string.h> > >>++#include <stdlib.h> > >>+ > >>+ #include "ring.h" > >>+ #include "defines.h" > >>+@@ -155,9 +157,11 @@ int getconnmode(void) { > >>+ if (localflow) > >>+ mode |= MODE_FLOW; > >>+ > >>+- if (my_want_state_is_will(TELOPT_BINARY)) > >>++ if ((eight & 1) || my_want_state_is_will(TELOPT_BINARY)) > >>+ mode |= MODE_INBIN; > >>+ > >>++ if (eight & 2) > >>++ mode |= MODE_OUT8; > >>+ if (his_want_state_is_will(TELOPT_BINARY)) > >>+ mode |= MODE_OUTBIN; > >>+ > >>+@@ -449,10 +453,13 @@ void TerminalNewMode(int f) > >>+ // breaks SunOS. > >>+ tmp_tc.c_iflag |= ISTRIP; > >>+ } > >>+- if (f & MODE_OUTBIN) { > >>++ if (f & (MODE_OUTBIN|MODE_OUT8)) { > >>+ tmp_tc.c_cflag &= ~(CSIZE|PARENB); > >>+ tmp_tc.c_cflag |= CS8; > >>+- tmp_tc.c_oflag &= ~OPOST; > >>++ if (f & MODE_OUTBIN) > >>++ tmp_tc.c_oflag &= ~OPOST; > >>++ else > >>++ tmp_tc.c_oflag |= OPOST; > >>+ } else { > >>+ tmp_tc.c_cflag &= ~(CSIZE|PARENB); > >>+ tmp_tc.c_cflag |= old_tc.c_cflag & (CSIZE|PARENB); > >>+@@ -468,7 +475,7 @@ void TerminalNewMode(int f) > >>+ > >>+ #ifdef SIGINFO > >>+ signal(SIGINFO, ayt); > >>+-#endif SIGINFO > >>++#endif /* SIGINFO */ > >>+ > >>+ #if defined(NOKERNINFO) > >>+ tmp_tc.c_lflag |= NOKERNINFO; > >>+@@ -504,7 +511,7 @@ void TerminalNewMode(int f) > >>+ > >>+ #ifdef SIGINFO > >>+ signal(SIGINFO, ayt_status); > >>+-#endif SIGINFO > >>++#endif /* SIGINFO */ > >>+ > >>+ #ifdef SIGTSTP > >>+ signal(SIGTSTP, SIG_DFL); > >>+diff --git a/telnet/utilities.cc b/telnet/utilities.cc > >>+index 0448f0a..66839ab 100644 > >>+--- a/telnet/utilities.cc > >>++++ b/telnet/utilities.cc > >>+@@ -47,6 +47,8 @@ char util_rcsid[] = > >>+ #include <sys/socket.h> > >>+ #include <unistd.h> > >>+ #include <ctype.h> > >>++#include <string.h> > >>++#include <stdlib.h> > >>+ > >>+ #include "ring.h" > >>+ #include "defines.h" > >>+-- > >>+1.8.4.2 > >>+ > >>diff --git > >>a/meta-networking/recipes-daemons/netkit-telnet/files/telnet-xinetd > >>b/meta-networking/recipes-daemons/netkit-telnet/files/telnet-xinetd > >>new file mode 100644 > >>index 0000000..959848b > >>--- /dev/null > >>+++ b/meta-networking/recipes-daemons/netkit-telnet/files/telnet-xinetd > >>@@ -0,0 +1,14 @@ > >>+# default: on > >>+# description: The telnet server serves telnet sessions; it uses \ > >>+# unencrypted username/password pairs for authentication. > >>+service telnet > >>+{ > >>+ flags = REUSE > >>+ socket_type = stream > >>+ wait = no > >>+ user = root > >>+ server = /usr/sbin/in.telnetd > >>+ log_on_failure += USERID > >>+ disable = yes > >>+} > >>+ > >>diff --git > >>a/meta-networking/recipes-daemons/netkit-telnet/files/telnetd-Makefile-modify-parameter.patch > >> > >>b/meta-networking/recipes-daemons/netkit-telnet/files/telnetd-Makefile-modify-parameter.patch > >>new file mode 100644 > >>index 0000000..165d373 > >>--- /dev/null > >>+++ > >>b/meta-networking/recipes-daemons/netkit-telnet/files/telnetd-Makefile-modify-parameter.patch > >>@@ -0,0 +1,36 @@ > >>+From b51dfb25ceb50ab512c95b17f9a6404bfeff7188 Mon Sep 17 00:00:00 2001 > >>+From: Li xin <[email protected]> > >>+Date: Wed, 19 Nov 2014 18:29:45 +0900 > >>+Subject: [PATCH] telnetd/Makefile : modify parameter > >>+ > >>+Signed-off-by: Li Xin <[email protected]> > >>+--- > >>+ telnetd/Makefile | 5 +++-- > >>+ 1 file changed, 3 insertions(+), 2 deletions(-) > >>+ > >>+diff --git a/telnetd/Makefile b/telnetd/Makefile > >>+index 72650b4..a4cf9fa 100644 > >>+--- a/telnetd/Makefile > >>++++ b/telnetd/Makefile > >>+@@ -9,7 +9,8 @@ include ../MRULES > >>+ # take out -DPARANOID_TTYS. > >>+ > >>+ CFLAGS += '-DISSUE_FILE="/etc/issue.net"' -DPARANOID_TTYS \ > >>+- -DNO_REVOKE -DKLUDGELINEMODE -DDIAGNOSTICS > >>++ -DNO_REVOKE -DKLUDGELINEMODE -DDIAGNOSTICS \ > >>++ -DLOGIN_WRAPPER=\"/usr/lib/telnetlogin\" > >>+ # LIBS += $(LIBTERMCAP) > >>+ > >>+ OBJS = telnetd.o state.o termstat.o slc.o sys_term.o utility.o \ > >>+@@ -27,7 +28,7 @@ $(OBJS): defs.h ext.h pathnames.h telnetd.h logwtmp.h > >>logout.h setproctitle.h > >>+ telnetd.o: ../version.h > >>+ > >>+ install: telnetd > >>+- install -s -m$(DAEMONMODE) telnetd $(INSTALLROOT)$(SBINDIR)/in.telnetd > >>++ install -m$(DAEMONMODE) telnetd $(INSTALLROOT)$(SBINDIR)/in.telnetd > >>+ install -m$(MANMODE) issue.net.5 $(INSTALLROOT)$(MANDIR)/man5/ > >>+ install -m$(MANMODE) telnetd.8 $(INSTALLROOT)$(MANDIR)/man8/in.telnetd.8 > >>+ ln -sf in.telnetd.8 $(INSTALLROOT)$(MANDIR)/man8/telnetd.8 > >>+-- > >>+1.8.4.2 > >>+ > >>diff --git > >>a/meta-networking/recipes-daemons/netkit-telnet/netkit-telnet_0.17.bb > >>b/meta-networking/recipes-daemons/netkit-telnet/netkit-telnet_0.17.bb > >>new file mode 100644 > >>index 0000000..ca2cad1 > >>--- /dev/null > >>+++ b/meta-networking/recipes-daemons/netkit-telnet/netkit-telnet_0.17.bb > >>@@ -0,0 +1,50 @@ > >>+DESCRIPTION = "netkit-telnet includes the telnet daemon and client." > >>+SECTION = "base" > >>+DEPENDS = "ncurses" > >>+LICENSE = "BSD" > >>+LIC_FILES_CHKSUM = > >>"file://telnet/telnet.cc;beginline=2;endline=3;md5=780868e7b566313e70cb701560ca95ef" > >>+PR = "r1" > >>+ > >>+SRC_URI = > >>"ftp://ftp.uk.linux.org/pub/linux/Networking/netkit/netkit-telnet-${PV}.tar.gz > >> \ > >>+ file://configure-modify-parameter.patch \ > >>+ file://telnet-modify-files.patch \ > >>+ file://telnetd-Makefile-modify-parameter.patch \ > >>+ file://telnet-xinetd \ > >>+" > >>+ > >>+EXTRA_OEMAKE = "INSTALLROOT=${D} SBINDIR=${sbindir} DAEMONMODE=755 \ > >>+ MANMODE=644 MANDIR=${mandir}" > >>+ > >>+do_configure () { > >>+ ./configure --prefix=${prefix} > >>+ echo "LDFLAGS=${LDFLAGS}" > MCONFIG > >>+} > >>+ > >>+do_compile () { > >>+ oe_runmake 'CC=${CC}' 'LD=${LD}' 'LDFLAGS=${LDFLAGS}' SUB=telnet > >>+ oe_runmake 'CC=${CC}' 'LD=${LD}' 'LDFLAGS=${LDFLAGS}' LIBS=-lutil > >>SUB=telnetd > >>+} > >>+ > >>+do_install () { > >>+ install -d ${D}${bindir} > >>+ install -m 0755 telnet/telnet ${D}${bindir}/telnet.${PN} > >>+ install -d ${D}${sbindir} > >>+ install -d ${D}${mandir}/man{1,5,8} > >>+ oe_runmake SUB=telnetd install > >>+ rm -rf ${D}${mandir}/man1 > >>+ install -d ${D}/etc/xinetd.d/ > >>+ install -p -m644 ${WORKDIR}/telnet-xinetd ${D}/etc/xinetd.d/telnet > >>+} > >>+ > >>+pkg_postinst_${PN} () { > >>+#!/bin/sh > >>+ update-alternatives --install ${bindir}/telnet telnet telnet.${PN} 100 > >>+} > >>+ > >>+pkg_prerm_${PN} () { > >>+#!/bin/sh > >>+ update-alternatives --remove telnet telnet.${PN} 100 > >>+} > >>+ > >>+SRC_URI[md5sum] = "d6beabaaf53fe6e382c42ce3faa05a36" > >>+SRC_URI[sha256sum] = > >>"9c80d5c7838361a328fb6b60016d503def9ce53ad3c589f3b08ff71a2bb88e00" > >>-- > >>1.8.4.2 > >> > >> > >> -- -Joe MacDonald. :wq
signature.asc
Description: Digital signature
-- _______________________________________________ Openembedded-devel mailing list [email protected] http://lists.openembedded.org/mailman/listinfo/openembedded-devel
