}
}
-static int telnet_closing(Plug plug, char *error_msg, int error_code,
+static int telnet_closing(Plug plug, const char *error_msg, int error_code,
int calling_back)
{
Telnet telnet = (Telnet) plug;
if (error_msg) {
/* A socket error has occurred. */
logevent(telnet->frontend, error_msg);
- connection_fatal("%s", error_msg);
+ connection_fatal(telnet->frontend, "%s", error_msg);
} /* Otherwise, the remote side closed the connection normally. */
return 0;
}
* Also places the canonical host name into `realhost'. It must be
* freed by the caller.
*/
-static char *telnet_init(void *frontend_handle, void **backend_handle,
- Config *cfg,
- char *host, int port, char **realhost, int nodelay)
+static const char *telnet_init(void *frontend_handle, void **backend_handle,
+ Config *cfg,
+ char *host, int port, char **realhost,
+ int nodelay)
{
static const struct plug_function_table fn_table = {
telnet_closing,
telnet_sent
};
SockAddr addr;
- char *err;
+ const char *err;
Telnet telnet;
telnet = snew(struct telnet_tag);
sfree(buf);
}
addr = name_lookup(host, port, realhost, &telnet->cfg);
- if ((err = sk_addr_error(addr)) != NULL)
+ if ((err = sk_addr_error(addr)) != NULL) {
+ sk_addr_free(addr);
return err;
+ }
if (port < 0)
port = 23; /* default telnet port */
if ((err = sk_socket_error(telnet->s)) != NULL)
return err;
- sk_addr_free(addr);
-
/*
* Initialise option states.
*/
}
}
+static const struct telnet_special *telnet_get_specials(void *handle)
+{
+ static const struct telnet_special specials[] = {
+ {"Are You There", TS_AYT},
+ {"Break", TS_BRK},
+ {"Synch", TS_SYNCH},
+ {"Erase Character", TS_EC},
+ {"Erase Line", TS_EL},
+ {"Go Ahead", TS_GA},
+ {"No Operation", TS_NOP},
+ {"", 0},
+ {"Abort Process", TS_ABORT},
+ {"Abort Output", TS_AO},
+ {"Interrupt Process", TS_IP},
+ {"Suspend Process", TS_SUSP},
+ {"", 0},
+ {"End Of Record", TS_EOR},
+ {"End Of File", TS_EOF},
+ {NULL, 0}
+ };
+ return specials;
+}
+
static Socket telnet_socket(void *handle)
{
Telnet telnet = (Telnet) handle;
static int telnet_exitcode(void *handle)
{
- /* Telnet telnet = (Telnet) handle; */
- /* Telnet doesn't transmit exit codes back to the client */
- return 0;
+ Telnet telnet = (Telnet) handle;
+ if (telnet->s != NULL)
+ return -1; /* still connected */
+ else
+ /* Telnet doesn't transmit exit codes back to the client */
+ return 0;
}
Backend telnet_backend = {
telnet_sendbuffer,
telnet_size,
telnet_special,
+ telnet_get_specials,
telnet_socket,
telnet_exitcode,
telnet_sendok,