* We have no way to communicate down the forwarded connection,
* so if an error occurred on the socket, we just ignore it
* and treat it like a proper close.
+ *
+ * FIXME: except we could initiate a full close here instead of
+ * just an outgoing EOF? ssh.c currently has no API for that, but
+ * it could.
*/
if (pr->c)
- sshfwd_close(pr->c);
- pfd_close(pr->s);
+ sshfwd_write_eof(pr->c);
+
return 1;
}
*/
connect:
+ /*
+ * Freeze the socket until the SSH server confirms the
+ * connection.
+ */
+ sk_set_frozen(pr->s, 1);
+
pr->c = new_sock_channel(pr->backhandle, pr->s);
if (pr->c == NULL) {
pfd_close(pr->s);
pr->dynamic = 0;
/*
- * Now freeze the socket until the SSH server confirms the
- * connection.
- */
- sk_set_frozen(pr->s, 1);
- /*
* If there's any data remaining in our current buffer,
* save it to be sent on pfd_confirm().
*/
* Called when receiving a PORT OPEN from the server
*/
const char *pfd_newconnect(Socket *s, char *hostname, int port,
- void *c, const Config *cfg, int addressfamily)
+ void *c, Conf *conf, int addressfamily)
{
static const struct plug_function_table fn_table = {
pfd_log,
/*
* Try to find host.
*/
- addr = name_lookup(hostname, port, &dummy_realhost, cfg, addressfamily);
+ addr = name_lookup(hostname, port, &dummy_realhost, conf, addressfamily);
if ((err = sk_addr_error(addr)) != NULL) {
sk_addr_free(addr);
return err;
pr->dynamic = 0;
pr->s = *s = new_connection(addr, dummy_realhost, port,
- 0, 1, 0, 0, (Plug) pr, cfg);
+ 0, 1, 0, 0, (Plug) pr, conf);
if ((err = sk_socket_error(*s)) != NULL) {
sfree(pr);
return err;
sets up a listener on the local machine on (srcaddr:)port
*/
const char *pfd_addforward(char *desthost, int destport, char *srcaddr,
- int port, void *backhandle, const Config *cfg,
+ int port, void *backhandle, Conf *conf,
void **sockdata, int address_family)
{
static const struct plug_function_table fn_table = {
pr->backhandle = backhandle;
pr->s = s = new_listener(srcaddr, port, (Plug) pr,
- !cfg->lport_acceptall, cfg, address_family);
+ !conf_get_int(conf, CONF_lport_acceptall),
+ conf, address_family);
if ((err = sk_socket_error(s)) != NULL) {
sfree(pr);
return err;
return sk_write(s, data, len);
}
+void pfd_send_eof(Socket s)
+{
+ sk_write_eof(s);
+}
void pfd_confirm(Socket s)
{