Patch from Jim McQuillan to pass the terminal type to the remote host.

This commit is contained in:
Eric Andersen 2001-05-07 17:57:45 +00:00
parent 238bc4090d
commit 7e1273edf7
3 changed files with 109 additions and 2 deletions

View File

@ -362,6 +362,9 @@
// Enable a if you system have setuped locale // Enable a if you system have setuped locale
//#define BB_LOCALE_SUPPORT //#define BB_LOCALE_SUPPORT
// //
// Support for TELNET to pass TERM type to remote host. Adds 384 bytes.
#define BB_FEATURE_TELNET_TTYPE
//
// End of Features List // End of Features List
// //
// //

View File

@ -27,6 +27,8 @@
* initial revision * initial revision
* Modified 2000/06/13 for inclusion into BusyBox by Erik Andersen * Modified 2000/06/13 for inclusion into BusyBox by Erik Andersen
* <andersen@lineo.com> * <andersen@lineo.com>
* Modified 2001/05/07 to add ability to pass TTYPE to remote host by Jim McQuillan
* <jam@ltsp.org>
* *
*/ */
@ -136,6 +138,10 @@ static int local_bind(int port);
/* Some globals */ /* Some globals */
static int one = 1; static int one = 1;
#ifdef BB_FEATURE_TELNET_TTYPE
static char *ttype;
#endif
static void doexit(int ev) static void doexit(int ev)
{ {
cookmode(); cookmode();
@ -321,6 +327,27 @@ static void putiac1(byte c)
} }
#endif #endif
#ifdef BB_FEATURE_TELNET_TTYPE
static void putiac_subopt(byte c, char *str)
{
int len = strlen(str) + 6; // ( 2 + 1 + 1 + strlen + 2 )
if (G.iaclen + len > IACBUFSIZE)
iacflush();
putiac(IAC);
putiac(SB);
putiac(c);
putiac(0);
while(*str)
putiac(*str++);
putiac(IAC);
putiac(SE);
}
#endif
/* void putiacstring (subneg strings) */ /* void putiacstring (subneg strings) */
/* ******************************* */ /* ******************************* */
@ -427,12 +454,29 @@ static inline void to_sga()
return; return;
} }
#ifdef BB_FEATURE_TELNET_TTYPE
static inline void to_ttype()
{
/* Tell server we will (or won't) do TTYPE */
if(ttype)
putiac2(WILL, TELOPT_TTYPE);
else
putiac2(WONT, TELOPT_TTYPE);
return;
}
#endif
static void telopt(byte c) static void telopt(byte c)
{ {
switch (c) switch (c)
{ {
case TELOPT_ECHO: to_echo(c); break; case TELOPT_ECHO: to_echo(c); break;
case TELOPT_SGA: to_sga(c); break; case TELOPT_SGA: to_sga(c); break;
#ifdef BB_FEATURE_TELNET_TTYPE
case TELOPT_TTYPE: to_ttype(c); break;
#endif
default: to_notsup(c); break; default: to_notsup(c); break;
} }
} }
@ -440,7 +484,7 @@ static void telopt(byte c)
/* ******************************* */ /* ******************************* */
/* subnegotiation -- ignore all */ /* subnegotiation -- ignore all (except TTYPE) */
static int subneg(byte c) static int subneg(byte c)
{ {
@ -449,6 +493,11 @@ static int subneg(byte c)
case TS_SUB1: case TS_SUB1:
if (c == IAC) if (c == IAC)
G.telstate = TS_SUB2; G.telstate = TS_SUB2;
#ifdef BB_FEATURE_TELNET_TTYPE
else
if (c == TELOPT_TTYPE)
putiac_subopt(TELOPT_TTYPE,ttype);
#endif
break; break;
case TS_SUB2: case TS_SUB2:
if (c == SE) if (c == SE)
@ -488,6 +537,9 @@ extern int telnet_main(int argc, char** argv)
int maxfd; int maxfd;
#endif #endif
#ifdef BB_FEATURE_TELNET_TTYPE
ttype = getenv("TERM");
#endif
memset(&G, 0, sizeof G); memset(&G, 0, sizeof G);

View File

@ -27,6 +27,8 @@
* initial revision * initial revision
* Modified 2000/06/13 for inclusion into BusyBox by Erik Andersen * Modified 2000/06/13 for inclusion into BusyBox by Erik Andersen
* <andersen@lineo.com> * <andersen@lineo.com>
* Modified 2001/05/07 to add ability to pass TTYPE to remote host by Jim McQuillan
* <jam@ltsp.org>
* *
*/ */
@ -136,6 +138,10 @@ static int local_bind(int port);
/* Some globals */ /* Some globals */
static int one = 1; static int one = 1;
#ifdef BB_FEATURE_TELNET_TTYPE
static char *ttype;
#endif
static void doexit(int ev) static void doexit(int ev)
{ {
cookmode(); cookmode();
@ -321,6 +327,27 @@ static void putiac1(byte c)
} }
#endif #endif
#ifdef BB_FEATURE_TELNET_TTYPE
static void putiac_subopt(byte c, char *str)
{
int len = strlen(str) + 6; // ( 2 + 1 + 1 + strlen + 2 )
if (G.iaclen + len > IACBUFSIZE)
iacflush();
putiac(IAC);
putiac(SB);
putiac(c);
putiac(0);
while(*str)
putiac(*str++);
putiac(IAC);
putiac(SE);
}
#endif
/* void putiacstring (subneg strings) */ /* void putiacstring (subneg strings) */
/* ******************************* */ /* ******************************* */
@ -427,12 +454,29 @@ static inline void to_sga()
return; return;
} }
#ifdef BB_FEATURE_TELNET_TTYPE
static inline void to_ttype()
{
/* Tell server we will (or won't) do TTYPE */
if(ttype)
putiac2(WILL, TELOPT_TTYPE);
else
putiac2(WONT, TELOPT_TTYPE);
return;
}
#endif
static void telopt(byte c) static void telopt(byte c)
{ {
switch (c) switch (c)
{ {
case TELOPT_ECHO: to_echo(c); break; case TELOPT_ECHO: to_echo(c); break;
case TELOPT_SGA: to_sga(c); break; case TELOPT_SGA: to_sga(c); break;
#ifdef BB_FEATURE_TELNET_TTYPE
case TELOPT_TTYPE: to_ttype(c); break;
#endif
default: to_notsup(c); break; default: to_notsup(c); break;
} }
} }
@ -440,7 +484,7 @@ static void telopt(byte c)
/* ******************************* */ /* ******************************* */
/* subnegotiation -- ignore all */ /* subnegotiation -- ignore all (except TTYPE) */
static int subneg(byte c) static int subneg(byte c)
{ {
@ -449,6 +493,11 @@ static int subneg(byte c)
case TS_SUB1: case TS_SUB1:
if (c == IAC) if (c == IAC)
G.telstate = TS_SUB2; G.telstate = TS_SUB2;
#ifdef BB_FEATURE_TELNET_TTYPE
else
if (c == TELOPT_TTYPE)
putiac_subopt(TELOPT_TTYPE,ttype);
#endif
break; break;
case TS_SUB2: case TS_SUB2:
if (c == SE) if (c == SE)
@ -488,6 +537,9 @@ extern int telnet_main(int argc, char** argv)
int maxfd; int maxfd;
#endif #endif
#ifdef BB_FEATURE_TELNET_TTYPE
ttype = getenv("TERM");
#endif
memset(&G, 0, sizeof G); memset(&G, 0, sizeof G);