Get at least SOCKS4A working

This commit is contained in:
Přemysl Eric Janouch 2015-07-21 00:31:19 +02:00
parent 318b7400d1
commit 22d9e20b4a

View File

@ -390,6 +390,7 @@ struct socks_connector
struct poller_timer timeout; ///< Timeout timer
bool done; ///< We're connected
uint8_t bound_address_len; ///< Length of domain name
struct socks_addr bound_address; ///< Bound address at the server
uint16_t bound_port; ///< Bound port at the server
@ -435,16 +436,6 @@ struct socks_connector
return false; \
BLOCK_END
// FIXME: we need to cancel all events
#define SOCKS_DONE() \
BLOCK_START \
int fd = self->socket_fd; \
set_blocking (fd, true); \
self->socket_fd = -1; \
self->on_connected (self->user_data, fd); \
return true; \
BLOCK_END
#define SOCKS_NEED_DATA(n) \
if (!socks_try_fill_read_buffer (self, (n))) \
return false; \
@ -521,7 +512,8 @@ socks_4a_finish (struct socks_connector *self)
switch (status)
{
case 90:
SOCKS_DONE ();
self->done = true;
return false;
case 91:
SOCKS_FAIL ("request rejected or failed");
case 92:
@ -593,7 +585,8 @@ socks_5_request_port (struct socks_connector *self)
hard_assert (msg_unpacker_u16 (&unpacker, &self->bound_port));
str_remove_slice (&self->read_buffer, 0, unpacker.offset);
SOCKS_DONE ();
self->done = true;
return false;
}
static bool
@ -890,11 +883,20 @@ socks_connector_start (struct socks_connector *self)
connector_step (connector);
poller_timer_set (&self->timeout, 60 * 1000);
self->done = false;
}
static void
socks_connector_step (struct socks_connector *self)
{
// Close the socket if needed
if (self->socket_fd != -1)
{
poller_fd_reset (&self->socket_event);
xclose (self->socket_fd);
self->socket_fd = -1;
}
// Destroy current connector if needed
if (self->connector)
{
@ -931,18 +933,22 @@ socks_connector_on_ready
{
(void) pfd;
if (!self->on_data (self) || !socks_try_flush_write_buffer (self))
{
// We've failed this target, let's try to move on
// FIXME: we need to cancel all events
socks_connector_step (self);
}
// If we successfully establish the connection, then the FD is reset to -1
else if (self->socket_fd != -1)
if (self->on_data (self) && socks_try_flush_write_buffer (self))
{
poller_fd_set (&self->socket_event,
self->write_buffer.len ? (POLLIN | POLLOUT) : POLLIN);
}
else if (self->done)
{
int fd = self->socket_fd;
poller_fd_reset (&self->socket_event);
self->socket_fd = -1;
set_blocking (fd, true);
self->on_connected (self->user_data, fd);
}
else
// We've failed this target, let's try to move on
socks_connector_step (self);
}
static void