* HISTORY
* Revision 3.1 1994/04/17 11:31:54 too
* initial revision
- * Modified 2000/06/13 for inclusion into BusyBox by Erik Andersen
- * <andersen@lineo.com>
+ * Modified 2000/06/13 for inclusion into BusyBox by Erik Andersen <andersen@codepoet.org>
* Modified 2001/05/07 to add ability to pass TTYPE to remote host by Jim McQuillan
* <jam@ltsp.org>
*
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
-#include <netdb.h>
#include "busybox.h"
-#ifdef CONFIG_FEATURE_AUTOWIDTH
-# include <sys/ioctl.h>
-#endif
-
#if 0
static const int DOTRACE = 1;
#endif
#ifdef USE_GLOBALVAR_PTR
struct Globalvars * Gptr;
#define G (*Gptr)
-#else
-static struct Globalvars G;
#endif
static inline void iacflush(void)
}
/* Function prototypes */
-static int getport(char * p);
-static struct in_addr getserver(char * p);
-static void setup_sockaddr_in(struct sockaddr_in * addr, int port);
-static int remote_connect(struct in_addr addr, int port);
static void rawmode(void);
static void cookmode(void);
static void do_linemode(void);
static void will_charmode(void);
static void telopt(byte c);
static int subneg(byte c);
-#if 0
-static int local_bind(int port);
-#endif
/* Some globals */
static int one = 1;
{
switch (c)
{
- case TELOPT_ECHO: to_echo(c); break;
- case TELOPT_SGA: to_sga(c); break;
+ case TELOPT_ECHO: to_echo(); break;
+ case TELOPT_SGA: to_sga(); break;
#ifdef CONFIG_FEATURE_TELNET_TTYPE
- case TELOPT_TTYPE: to_ttype(c);break;
+ case TELOPT_TTYPE: to_ttype();break;
#endif
#ifdef CONFIG_FEATURE_AUTOWIDTH
- case TELOPT_NAWS: to_naws(c);
+ case TELOPT_NAWS: to_naws();
putiac_naws(c, win_width, win_height);
break;
#endif
extern int telnet_main(int argc, char** argv)
{
- struct in_addr host;
- int port;
int len;
+ struct sockaddr_in s_in;
#ifdef USE_POLL
struct pollfd ufds[2];
#else
#endif
#ifdef CONFIG_FEATURE_AUTOWIDTH
- struct winsize winp;
- if( ioctl(0, TIOCGWINSZ, &winp) == 0 ) {
- win_width = winp.ws_col;
- win_height = winp.ws_row;
- }
+ get_terminal_width_height(0, &win_width, &win_height);
#endif
#ifdef CONFIG_FEATURE_TELNET_TTYPE
G.termios_raw = G.termios_def;
cfmakeraw(&G.termios_raw);
- if (argc < 2) show_usage();
- port = (argc > 2)? getport(argv[2]): 23;
+ if (argc < 2)
+ bb_show_usage();
- host = getserver(argv[1]);
+ bb_lookup_host(&s_in, argv[1]);
+ s_in.sin_port = bb_lookup_port((argc == 3) ? argv[2] : "telnet", "tcp", 23);
+
+ G.netfd = xconnect(&s_in);
- G.netfd = remote_connect(host, port);
+ setsockopt(G.netfd, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof one);
signal(SIGINT, fgotsig);
}
}
-static int getport(char * p)
-{
- unsigned int port = atoi(p);
-
- if ((unsigned)(port - 1 ) > 65534)
- {
- error_msg_and_die("%s: bad port number", p);
- }
- return port;
-}
-
-static struct in_addr getserver(char * host)
-{
- struct in_addr addr;
-
- struct hostent * he;
- he = xgethostbyname(host);
- memcpy(&addr, he->h_addr, sizeof addr);
-
- TRACE(1, ("addr: %s\n", inet_ntoa(addr)));
-
- return addr;
-}
-
-static int create_socket(void)
-{
- return socket(AF_INET, SOCK_STREAM, 0);
-}
-
-static void setup_sockaddr_in(struct sockaddr_in * addr, int port)
-{
- memset(addr, 0, sizeof(struct sockaddr_in));
- addr->sin_family = AF_INET;
- addr->sin_port = htons(port);
-}
-
-#if 0
-static int local_bind(int port)
-{
- struct sockaddr_in s_addr;
- int s = create_socket();
-
- setup_sockaddr_in(&s_addr, port);
-
- setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one);
-
- if (bind(s, &s_addr, sizeof s_addr) < 0)
- {
- char * e = sys_errlist[errno];
- syserrorexit("bind");
- exit(1);
- }
- listen(s, 1);
-
- return s;
-}
-#endif
-
-static int remote_connect(struct in_addr addr, int port)
-{
- struct sockaddr_in s_addr;
- int s = create_socket();
-
- setup_sockaddr_in(&s_addr, port);
- s_addr.sin_addr = addr;
-
- setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof one);
-
- if (connect(s, (struct sockaddr *)&s_addr, sizeof s_addr) < 0)
- {
- perror_msg_and_die("Unable to connect to remote host");
- }
- return s;
-}
-
/*
Local Variables:
c-file-style: "linux"