X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/b6c680d45c9045b6e5f2350f3dd172e569f7c65d..f3ab576e6a5f34dfedde93fe236d1eac577628d0:/rlogin.c diff --git a/rlogin.c b/rlogin.c index eb6a6c2d..80108527 100644 --- a/rlogin.c +++ b/rlogin.c @@ -16,55 +16,55 @@ static Socket s = NULL; static void rlogin_size(void); -static int sb_opt, sb_len; -static char *sb_buf = NULL; -static int sb_size = 0; -#define SB_DELTA 1024 - -static void c_write (char *buf, int len) { +static void c_write(char *buf, int len) +{ from_backend(0, buf, len); } -static int rlogin_receive (Socket skt, int urgent, char *data, int len) { - if (urgent==3) { - /* A socket error has occurred. */ +static int rlogin_closing(Plug plug, char *error_msg, int error_code, + int calling_back) +{ + if (s) { sk_close(s); s = NULL; - connection_fatal(data); - return 0; - } else if (!len) { - /* Connection has closed. */ - sk_close(s); - s = NULL; - return 0; } + if (error_msg) { + /* A socket error has occurred. */ + connection_fatal(error_msg); + } /* Otherwise, the remote side closed the connection normally. */ + return 0; +} + +static int rlogin_receive(Plug plug, int urgent, char *data, int len) +{ if (urgent == 2) { - char c; - - c = *data++; len--; - if (c == '\x80') - rlogin_size(); - /* - * We should flush everything (aka Telnet SYNCH) if we see - * 0x02, and we should turn off and on _local_ flow control - * on 0x10 and 0x20 respectively. I'm not convinced it's - * worth it... - */ + char c; + + c = *data++; + len--; + if (c == '\x80') + rlogin_size(); + /* + * We should flush everything (aka Telnet SYNCH) if we see + * 0x02, and we should turn off and on _local_ flow control + * on 0x10 and 0x20 respectively. I'm not convinced it's + * worth it... + */ } else { - /* - * Main rlogin protocol. This is really simple: the first - * byte is expected to be NULL and is ignored, and the rest - * is printed. - */ - static int firstbyte = 1; - if (firstbyte) { - if (data[0] == '\0') { - data++; - len--; - } - firstbyte = 0; - } - c_write(data, len); + /* + * Main rlogin protocol. This is really simple: the first + * byte is expected to be NULL and is ignored, and the rest + * is printed. + */ + static int firstbyte = 1; + if (firstbyte) { + if (data[0] == '\0') { + data++; + len--; + } + firstbyte = 0; + } + c_write(data, len); } return 1; } @@ -74,9 +74,16 @@ static int rlogin_receive (Socket skt, int urgent, char *data, int len) { * * Returns an error message, or NULL on success. * - * Also places the canonical host name into `realhost'. + * Also places the canonical host name into `realhost'. It must be + * freed by the caller. */ -static char *rlogin_init (char *host, int port, char **realhost) { +static char *rlogin_init(char *host, int port, char **realhost) +{ + static struct plug_function_table fn_table = { + rlogin_closing, + rlogin_receive + }, *fn_table_ptr = &fn_table; + SockAddr addr; char *err; @@ -84,7 +91,7 @@ static char *rlogin_init (char *host, int port, char **realhost) { * Try to find host. */ addr = sk_namelookup(host, realhost); - if ( (err = sk_addr_error(addr)) ) + if ((err = sk_addr_error(addr))) return err; if (port < 0) @@ -93,8 +100,8 @@ static char *rlogin_init (char *host, int port, char **realhost) { /* * Open socket. */ - s = sk_new(addr, port, 1, 0, rlogin_receive); - if ( (err = sk_socket_error(s)) ) + s = sk_new(addr, port, 1, 0, &fn_table_ptr); + if ((err = sk_socket_error(s))) return err; sk_addr_free(addr); @@ -104,18 +111,18 @@ static char *rlogin_init (char *host, int port, char **realhost) { */ { - char z = 0; - char *p; - sk_write(s, &z, 1); - sk_write(s, cfg.localusername, strlen(cfg.localusername)); - sk_write(s, &z, 1); - sk_write(s, cfg.username, strlen(cfg.username)); - sk_write(s, &z, 1); - sk_write(s, cfg.termtype, strlen(cfg.termtype)); - sk_write(s, "/", 1); - for(p = cfg.termspeed; isdigit(*p); p++); - sk_write(s, cfg.termspeed, p - cfg.termspeed); - sk_write(s, &z, 1); + char z = 0; + char *p; + sk_write(s, &z, 1); + sk_write(s, cfg.localusername, strlen(cfg.localusername)); + sk_write(s, &z, 1); + sk_write(s, cfg.username, strlen(cfg.username)); + sk_write(s, &z, 1); + sk_write(s, cfg.termtype, strlen(cfg.termtype)); + sk_write(s, "/", 1); + for (p = cfg.termspeed; isdigit(*p); p++); + sk_write(s, cfg.termspeed, p - cfg.termspeed); + sk_write(s, &z, 1); } return NULL; @@ -124,7 +131,8 @@ static char *rlogin_init (char *host, int port, char **realhost) { /* * Called to send data down the rlogin connection. */ -static void rlogin_send (char *buf, int len) { +static void rlogin_send(char *buf, int len) +{ if (s == NULL) return; @@ -135,11 +143,14 @@ static void rlogin_send (char *buf, int len) { /* * Called to set the size of the window */ -static void rlogin_size(void) { +static void rlogin_size(void) +{ char b[12] = { '\xFF', '\xFF', 0x73, 0x73, 0, 0, 0, 0, 0, 0, 0, 0 }; - b[6] = cols >> 8; b[7] = cols & 0xFF; - b[4] = rows >> 8; b[5] = rows & 0xFF; + b[6] = cols >> 8; + b[7] = cols & 0xFF; + b[4] = rows >> 8; + b[5] = rows & 0xFF; sk_write(s, b, 12); return; } @@ -147,16 +158,24 @@ static void rlogin_size(void) { /* * Send rlogin special codes. */ -static void rlogin_special (Telnet_Special code) { +static void rlogin_special(Telnet_Special code) +{ /* Do nothing! */ return; } -static Socket rlogin_socket(void) { return s; } +static Socket rlogin_socket(void) +{ + return s; +} -static int rlogin_sendok(void) { return 1; } +static int rlogin_sendok(void) +{ + return 1; +} -static int rlogin_ldisc(int option) { +static int rlogin_ldisc(int option) +{ return 0; }