Patch from Jim McQuillan to pass the terminal type to the remote host.
This commit is contained in:
parent
238bc4090d
commit
7e1273edf7
3
Config.h
3
Config.h
@ -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
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
54
telnet.c
54
telnet.c
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user