projects
/
u
/
mdw
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Oops. Forgot to check in terminal.h from yesterday's work. There's
[u/mdw/putty]
/
telnet.c
diff --git
a/telnet.c
b/telnet.c
index
06717f1
..
9aba9ea
100644
(file)
--- a/
telnet.c
+++ b/
telnet.c
@@
-3,6
+3,7
@@
#include <stdlib.h>
#include "putty.h"
#include <stdlib.h>
#include "putty.h"
+#include "terminal.h"
#ifndef FALSE
#define FALSE 0
#ifndef FALSE
#define FALSE 0
@@
-13,6
+14,8
@@
static Socket s = NULL;
static Socket s = NULL;
+static void *frontend;
+
#define IAC 255 /* interpret as command: */
#define DONT 254 /* you are not to use option */
#define DO 253 /* please, you use option */
#define IAC 255 /* interpret as command: */
#define DONT 254 /* you are not to use option */
#define DO 253 /* please, you use option */
@@
-189,7
+192,7
@@
static void c_write1(int c)
{
int backlog;
char cc = (char) c;
{
int backlog;
char cc = (char) c;
- backlog = from_backend(0, &cc, 1);
+ backlog = from_backend(
frontend,
0, &cc, 1);
sk_set_frozen(s, backlog > TELNET_MAX_BACKLOG);
}
sk_set_frozen(s, backlog > TELNET_MAX_BACKLOG);
}
@@
-451,9
+454,9
@@
static void process_subneg(void)
}
static enum {
}
static enum {
- TOPLEVEL, SEENIAC, SEENWILL, SEENWONT, SEENDO, SEENDONT,
+ TOP
_
LEVEL, SEENIAC, SEENWILL, SEENWONT, SEENDO, SEENDONT,
SEENSB, SUBNEGOT, SUBNEG_IAC, SEENCR
SEENSB, SUBNEGOT, SUBNEG_IAC, SEENCR
-} telnet_state = TOPLEVEL;
+} telnet_state = TOP
_
LEVEL;
static void do_telnet_read(char *buf, int len)
{
static void do_telnet_read(char *buf, int len)
{
@@
-462,10
+465,10
@@
static void do_telnet_read(char *buf, int len)
int c = (unsigned char) *buf++;
switch (telnet_state) {
int c = (unsigned char) *buf++;
switch (telnet_state) {
- case TOPLEVEL:
+ case TOP
_
LEVEL:
case SEENCR:
if (c == NUL && telnet_state == SEENCR)
case SEENCR:
if (c == NUL && telnet_state == SEENCR)
- telnet_state = TOPLEVEL;
+ telnet_state = TOP
_
LEVEL;
else if (c == IAC)
telnet_state = SEENIAC;
else {
else if (c == IAC)
telnet_state = SEENIAC;
else {
@@
-487,7
+490,7
@@
static void do_telnet_read(char *buf, int len)
if (c == CR)
telnet_state = SEENCR;
else
if (c == CR)
telnet_state = SEENCR;
else
- telnet_state = TOPLEVEL;
+ telnet_state = TOP
_
LEVEL;
}
break;
case SEENIAC:
}
break;
case SEENIAC:
@@
-503,30
+506,30
@@
static void do_telnet_read(char *buf, int len)
telnet_state = SEENSB;
else if (c == DM) {
in_synch = 0;
telnet_state = SEENSB;
else if (c == DM) {
in_synch = 0;
- telnet_state = TOPLEVEL;
+ telnet_state = TOP
_
LEVEL;
} else {
/* ignore everything else; print it if it's IAC */
if (c == IAC) {
c_write1(c);
}
} else {
/* ignore everything else; print it if it's IAC */
if (c == IAC) {
c_write1(c);
}
- telnet_state = TOPLEVEL;
+ telnet_state = TOP
_
LEVEL;
}
break;
case SEENWILL:
proc_rec_opt(WILL, c);
}
break;
case SEENWILL:
proc_rec_opt(WILL, c);
- telnet_state = TOPLEVEL;
+ telnet_state = TOP
_
LEVEL;
break;
case SEENWONT:
proc_rec_opt(WONT, c);
break;
case SEENWONT:
proc_rec_opt(WONT, c);
- telnet_state = TOPLEVEL;
+ telnet_state = TOP
_
LEVEL;
break;
case SEENDO:
proc_rec_opt(DO, c);
break;
case SEENDO:
proc_rec_opt(DO, c);
- telnet_state = TOPLEVEL;
+ telnet_state = TOP
_
LEVEL;
break;
case SEENDONT:
proc_rec_opt(DONT, c);
break;
case SEENDONT:
proc_rec_opt(DONT, c);
- telnet_state = TOPLEVEL;
+ telnet_state = TOP
_
LEVEL;
break;
case SEENSB:
sb_opt = c;
break;
case SEENSB:
sb_opt = c;
@@
-559,7
+562,7
@@
static void do_telnet_read(char *buf, int len)
goto subneg_addchar; /* yes, it's a hack, I know, but... */
else {
process_subneg();
goto subneg_addchar; /* yes, it's a hack, I know, but... */
else {
process_subneg();
- telnet_state = TOPLEVEL;
+ telnet_state = TOP
_
LEVEL;
}
break;
}
}
break;
}
@@
-575,7
+578,8
@@
static int telnet_closing(Plug plug, char *error_msg, int error_code,
}
if (error_msg) {
/* A socket error has occurred. */
}
if (error_msg) {
/* A socket error has occurred. */
- connection_fatal(error_msg);
+ logevent(error_msg);
+ connection_fatal("%s", error_msg);
} /* Otherwise, the remote side closed the connection normally. */
return 0;
}
} /* Otherwise, the remote side closed the connection normally. */
return 0;
}
@@
-601,7
+605,8
@@
static void telnet_sent(Plug plug, int bufsize)
* Also places the canonical host name into `realhost'. It must be
* freed by the caller.
*/
* Also places the canonical host name into `realhost'. It must be
* freed by the caller.
*/
-static char *telnet_init(char *host, int port, char **realhost)
+static char *telnet_init(void *frontend_handle,
+ char *host, int port, char **realhost, int nodelay)
{
static struct plug_function_table fn_table = {
telnet_closing,
{
static struct plug_function_table fn_table = {
telnet_closing,
@@
-612,6
+617,8
@@
static char *telnet_init(char *host, int port, char **realhost)
SockAddr addr;
char *err;
SockAddr addr;
char *err;
+ frontend = frontend_handle;
+
/*
* Try to find host.
*/
/*
* Try to find host.
*/
@@
-636,7
+643,7
@@
static char *telnet_init(char *host, int port, char **realhost)
sprintf(buf, "Connecting to %.100s port %d", addrbuf, port);
logevent(buf);
}
sprintf(buf, "Connecting to %.100s port %d", addrbuf, port);
logevent(buf);
}
- s =
sk_new(addr, port, 0, 1
, &fn_table_ptr);
+ s =
new_connection(addr, *realhost, port, 0, 1, nodelay
, &fn_table_ptr);
if ((err = sk_socket_error(s)))
return err;
if ((err = sk_socket_error(s)))
return err;
@@
-717,15
+724,15
@@
static void telnet_size(void)
unsigned char b[16];
char logbuf[50];
unsigned char b[16];
char logbuf[50];
- if (s == NULL || o_naws.state != ACTIVE)
+ if (s == NULL ||
term == NULL ||
o_naws.state != ACTIVE)
return;
b[0] = IAC;
b[1] = SB;
b[2] = TELOPT_NAWS;
return;
b[0] = IAC;
b[1] = SB;
b[2] = TELOPT_NAWS;
- b[3] = cols >> 8;
- b[4] = cols & 0xFF;
- b[5] = rows >> 8;
- b[6] = rows & 0xFF;
+ b[3] =
term->
cols >> 8;
+ b[4] =
term->
cols & 0xFF;
+ b[5] =
term->
rows >> 8;
+ b[6] =
term->
rows & 0xFF;
b[7] = IAC;
b[8] = SE;
telnet_bufsize = sk_write(s, b, 9);
b[7] = IAC;
b[8] = SE;
telnet_bufsize = sk_write(s, b, 9);
@@
-848,6
+855,12
@@
static int telnet_ldisc(int option)
return FALSE;
}
return FALSE;
}
+static int telnet_exitcode(void)
+{
+ /* Telnet doesn't transmit exit codes back to the client */
+ return 0;
+}
+
Backend telnet_backend = {
telnet_init,
telnet_send,
Backend telnet_backend = {
telnet_init,
telnet_send,
@@
-855,6
+868,7
@@
Backend telnet_backend = {
telnet_size,
telnet_special,
telnet_socket,
telnet_size,
telnet_special,
telnet_socket,
+ telnet_exitcode,
telnet_sendok,
telnet_ldisc,
telnet_unthrottle,
telnet_sendok,
telnet_ldisc,
telnet_unthrottle,