#include <stdio.h>
#include <stdlib.h>
+#include <limits.h>
#include <ctype.h>
#include "putty.h"
/* the above field _must_ be first in the structure */
Socket s;
+ int closed_on_socket_error;
int bufsize;
int firstbyte;
int cansize;
const char *error_msg, int error_code)
{
Rlogin rlogin = (Rlogin) plug;
- char addrbuf[256], *msg;
-
- sk_getaddr(addr, addrbuf, lenof(addrbuf));
-
- if (type == 0)
- msg = dupprintf("Connecting to %s port %d", addrbuf, port);
- else
- msg = dupprintf("Failed to connect to %s: %s", addrbuf, error_msg);
-
- logevent(rlogin->frontend, msg);
+ backend_socket_log(rlogin->frontend, type, addr, port,
+ error_msg, error_code,
+ rlogin->conf, !rlogin->firstbyte);
}
static int rlogin_closing(Plug plug, const char *error_msg, int error_code,
int calling_back)
{
Rlogin rlogin = (Rlogin) plug;
+
+ /*
+ * We don't implement independent EOF in each direction for Telnet
+ * connections; as soon as we get word that the remote side has
+ * sent us EOF, we wind up the whole connection.
+ */
+
if (rlogin->s) {
sk_close(rlogin->s);
rlogin->s = NULL;
+ if (error_msg)
+ rlogin->closed_on_socket_error = TRUE;
notify_remote_exit(rlogin->frontend);
}
if (error_msg) {
*/
static const char *rlogin_init(void *frontend_handle, void **backend_handle,
Conf *conf,
- char *host, int port, char **realhost,
+ const char *host, int port, char **realhost,
int nodelay, int keepalive)
{
static const struct plug_function_table fn_table = {
rlogin = snew(struct rlogin_tag);
rlogin->fn = &fn_table;
rlogin->s = NULL;
+ rlogin->closed_on_socket_error = FALSE;
rlogin->frontend = frontend_handle;
rlogin->term_width = conf_get_int(conf, CONF_width);
rlogin->term_height = conf_get_int(conf, CONF_height);
/*
* Try to find host.
*/
- {
- char *buf;
- buf = dupprintf("Looking up host \"%s\"%s", host,
- (addressfamily == ADDRTYPE_IPV4 ? " (IPv4)" :
- (addressfamily == ADDRTYPE_IPV6 ? " (IPv6)" :
- "")));
- logevent(rlogin->frontend, buf);
- sfree(buf);
- }
- addr = name_lookup(host, port, realhost, conf, addressfamily);
+ addr = name_lookup(host, port, realhost, conf, addressfamily,
+ rlogin->frontend, "rlogin connection");
if ((err = sk_addr_error(addr)) != NULL) {
sk_addr_free(addr);
return err;
sfree(*realhost);
*realhost = dupstr(loghost);
- colon = strrchr(*realhost, ':');
- if (colon) {
- /*
- * FIXME: if we ever update this aspect of ssh.c for
- * IPv6 literal management, this should change in line
- * with it.
- */
+
+ colon = host_strrchr(*realhost, ':');
+ if (colon)
*colon++ = '\0';
- }
}
/*
* in which case we prompt for it and may end up deferring doing
* anything else until the local prompt mechanism returns.
*/
- if ((ruser = get_remote_username(conf)) == NULL) {
+ if ((ruser = get_remote_username(conf)) != NULL) {
rlogin_startup(rlogin, ruser);
sfree(ruser);
} else {
rlogin->prompt = new_prompts(rlogin->frontend);
rlogin->prompt->to_server = TRUE;
rlogin->prompt->name = dupstr("Rlogin login name");
- /* 512 is an arbitrary limit :-( */
- add_prompt(rlogin->prompt, dupstr("rlogin username: "), TRUE, 512);
+ add_prompt(rlogin->prompt, dupstr("rlogin username: "), TRUE);
ret = get_userpass_input(rlogin->prompt, NULL, 0);
if (ret >= 0) {
rlogin_startup(rlogin, rlogin->prompt->prompts[0]->result);
/*
* Called to send data down the rlogin connection.
*/
-static int rlogin_send(void *handle, char *buf, int len)
+static int rlogin_send(void *handle, const char *buf, int len)
{
Rlogin rlogin = (Rlogin) handle;
Rlogin rlogin = (Rlogin) handle;
if (rlogin->s != NULL)
return -1; /* still connected */
+ else if (rlogin->closed_on_socket_error)
+ return INT_MAX; /* a socket error counts as an unclean exit */
else
/* If we ever implement RSH, we'll probably need to do this properly */
return 0;
rlogin_provide_logctx,
rlogin_unthrottle,
rlogin_cfg_info,
+ NULL /* test_for_upstream */,
"rlogin",
PROT_RLOGIN,
513