SOCKS: various fixes to API and code
This commit is contained in:
parent
c34bb483ca
commit
4a89572089
47
common.c
47
common.c
|
@ -399,11 +399,11 @@ struct socks_connector
|
||||||
|
|
||||||
// Configuration:
|
// Configuration:
|
||||||
|
|
||||||
const char *hostname; ///< SOCKS server hostname
|
char *hostname; ///< SOCKS server hostname
|
||||||
const char *service; ///< SOCKS server service name or port
|
char *service; ///< SOCKS server service name or port
|
||||||
|
|
||||||
const char *username; ///< Username for authentication
|
char *username; ///< Username for authentication
|
||||||
const char *password; ///< Password for authentication
|
char *password; ///< Password for authentication
|
||||||
|
|
||||||
struct socks_target *targets; ///< Targets
|
struct socks_target *targets; ///< Targets
|
||||||
struct socks_target *targets_tail; ///< Tail of targets
|
struct socks_target *targets_tail; ///< Tail of targets
|
||||||
|
@ -835,12 +835,15 @@ socks_connector_on_error (void *user_data, const char *error)
|
||||||
{
|
{
|
||||||
struct socks_connector *self = user_data;
|
struct socks_connector *self = user_data;
|
||||||
// TODO: skip protocol on protocol failure
|
// TODO: skip protocol on protocol failure
|
||||||
self->on_error (self->user_data, error);
|
if (self->on_error)
|
||||||
|
self->on_error (self->user_data, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
socks_connector_start (struct socks_connector *self)
|
socks_connector_start (struct socks_connector *self)
|
||||||
{
|
{
|
||||||
|
hard_assert (!self->connector);
|
||||||
|
|
||||||
struct connector *connector =
|
struct connector *connector =
|
||||||
self->connector = xcalloc (1, sizeof *connector);
|
self->connector = xcalloc (1, sizeof *connector);
|
||||||
connector_init (connector, self->socket_event.poller);
|
connector_init (connector, self->socket_event.poller);
|
||||||
|
@ -851,9 +854,17 @@ socks_connector_start (struct socks_connector *self)
|
||||||
connector->on_error = socks_connector_on_error;
|
connector->on_error = socks_connector_on_error;
|
||||||
connector->on_failure = socks_connector_on_failure;
|
connector->on_failure = socks_connector_on_failure;
|
||||||
|
|
||||||
// TODO: let's rather call on_error and on_failure instead on error
|
struct error *e = NULL;
|
||||||
hard_assert (connector_add_target (connector,
|
if (!connector_add_target (connector, self->hostname, self->service, &e))
|
||||||
self->hostname, self->service, NULL));
|
{
|
||||||
|
if (self->on_error)
|
||||||
|
self->on_error (self->user_data, e->message);
|
||||||
|
error_free (e);
|
||||||
|
|
||||||
|
socks_connector_destroy_connector (self);
|
||||||
|
socks_connector_fail (self);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
poller_timer_set (&self->timeout, 60 * 1000);
|
poller_timer_set (&self->timeout, 60 * 1000);
|
||||||
connector_step (connector);
|
connector_step (connector);
|
||||||
|
@ -926,7 +937,6 @@ socks_try_flush_write_buffer (struct socks_connector *self)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SOCKS_FAIL ("%s: %s", "send", strerror (errno));
|
SOCKS_FAIL ("%s: %s", "send", strerror (errno));
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -987,6 +997,11 @@ socks_connector_free (struct socks_connector *self)
|
||||||
str_free (&self->read_buffer);
|
str_free (&self->read_buffer);
|
||||||
str_free (&self->write_buffer);
|
str_free (&self->write_buffer);
|
||||||
|
|
||||||
|
free (self->hostname);
|
||||||
|
free (self->service);
|
||||||
|
free (self->username);
|
||||||
|
free (self->password);
|
||||||
|
|
||||||
LIST_FOR_EACH (struct socks_target, iter, self->targets)
|
LIST_FOR_EACH (struct socks_target, iter, self->targets)
|
||||||
{
|
{
|
||||||
socks_addr_free (&iter->address);
|
socks_addr_free (&iter->address);
|
||||||
|
@ -1027,14 +1042,22 @@ socks_connector_add_target (struct socks_connector *self,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
socks_connector_run (struct socks_connector *self)
|
socks_connector_run (struct socks_connector *self,
|
||||||
|
const char *host, const char *service,
|
||||||
|
const char *username, const char *password)
|
||||||
{
|
{
|
||||||
// XXX: do we need some better error checking in here?
|
|
||||||
hard_assert (self->hostname);
|
|
||||||
hard_assert (self->targets);
|
hard_assert (self->targets);
|
||||||
|
hard_assert (host && service);
|
||||||
|
|
||||||
|
self->hostname = xstrdup (host);
|
||||||
|
self->service = xstrdup (service);
|
||||||
|
|
||||||
|
if (username) self->username = xstrdup (username);
|
||||||
|
if (password) self->password = xstrdup (password);
|
||||||
|
|
||||||
self->targets_iter = self->targets;
|
self->targets_iter = self->targets;
|
||||||
self->protocol_iter = 0;
|
self->protocol_iter = 0;
|
||||||
|
// XXX: this can fail immediately from an error creating the connector
|
||||||
socks_connector_start (self);
|
socks_connector_start (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
13
degesch.c
13
degesch.c
|
@ -4472,13 +4472,6 @@ irc_setup_connector_socks (struct server *s,
|
||||||
socks_connector_init (connector, &s->ctx->poller);
|
socks_connector_init (connector, &s->ctx->poller);
|
||||||
s->socks_conn = connector;
|
s->socks_conn = connector;
|
||||||
|
|
||||||
// FIXME: the SOCKS connector may outlive these values
|
|
||||||
connector->hostname = socks_host;
|
|
||||||
// FIXME: memory leak
|
|
||||||
connector->service = xstrdup_printf ("%" PRIi64, socks_port_int);
|
|
||||||
connector->username = get_config_string (s->config, "socks_username");
|
|
||||||
connector->password = get_config_string (s->config, "socks_password");
|
|
||||||
|
|
||||||
connector->user_data = s;
|
connector->user_data = s;
|
||||||
connector->on_connecting = irc_on_socks_connecting;
|
connector->on_connecting = irc_on_socks_connecting;
|
||||||
connector->on_error = irc_on_connector_error;
|
connector->on_error = irc_on_connector_error;
|
||||||
|
@ -4494,7 +4487,11 @@ irc_setup_connector_socks (struct server *s,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
socks_connector_run (connector);
|
char *service = xstrdup_printf ("%" PRIi64, socks_port_int);
|
||||||
|
socks_connector_run (connector, socks_host, service,
|
||||||
|
get_config_string (s->config, "socks_username"),
|
||||||
|
get_config_string (s->config, "socks_password"));
|
||||||
|
free (service);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1708,11 +1708,6 @@ irc_establish_connection_socks (struct bot_context *ctx,
|
||||||
socks_connector_init (connector, poller);
|
socks_connector_init (connector, poller);
|
||||||
data.succeeded = false;
|
data.succeeded = false;
|
||||||
|
|
||||||
connector->hostname = socks_host;
|
|
||||||
connector->service = socks_port;
|
|
||||||
connector->username = str_map_find (&ctx->config, "socks_username");
|
|
||||||
connector->password = str_map_find (&ctx->config, "socks_password");
|
|
||||||
|
|
||||||
connector->on_connected = irc_on_socks_connected;
|
connector->on_connected = irc_on_socks_connected;
|
||||||
connector->on_connecting = irc_on_socks_connecting;
|
connector->on_connecting = irc_on_socks_connecting;
|
||||||
connector->on_error = irc_on_socks_error;
|
connector->on_error = irc_on_socks_error;
|
||||||
|
@ -1721,7 +1716,9 @@ irc_establish_connection_socks (struct bot_context *ctx,
|
||||||
|
|
||||||
if (socks_connector_add_target (connector, host, service, e))
|
if (socks_connector_add_target (connector, host, service, e))
|
||||||
{
|
{
|
||||||
socks_connector_run (connector);
|
socks_connector_run (connector, socks_host, socks_port,
|
||||||
|
str_map_find (&ctx->config, "socks_username"),
|
||||||
|
str_map_find (&ctx->config, "socks_password"));
|
||||||
while (data.polling)
|
while (data.polling)
|
||||||
poller_run (poller);
|
poller_run (poller);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue