From 48616f615fe84e29faea1e17c20df1b92e2ad7ec Mon Sep 17 00:00:00 2001 From: darkk Date: Sun, 3 Jun 2007 14:03:44 +0000 Subject: [PATCH] Added hook to call instead of redsocks_connect_relay --- redsocks.c | 89 ++++++++++++++++++++++++++++++------------------------ redsocks.h | 2 ++ 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/redsocks.c b/redsocks.c index 15c182e..07ac9ec 100644 --- a/redsocks.c +++ b/redsocks.c @@ -199,8 +199,10 @@ void redsocks_drop_client(redsocks_client *client) { close(EVENT_FD(&client->client->ev_write)); close(EVENT_FD(&client->relay->ev_write)); - bufferevent_free(client->client); - bufferevent_free(client->relay); + if (client->client) + bufferevent_free(client->client); + if (client->relay) + bufferevent_free(client->relay); list_del(&client->list); free(client); } @@ -340,30 +342,11 @@ fail: redsocks_relay_error(buffev, EVBUFFER_WRITE | EVBUFFER_ERROR, _arg); } -static void redsocks_accept_client(int fd, short what, void *_arg) +void redsocks_connect_relay(redsocks_client *client) { - redsocks_instance *self = _arg; - redsocks_client *client = NULL; - struct sockaddr_in clientaddr; - struct sockaddr_in destaddr; - socklen_t addrlen = sizeof(clientaddr); - int client_fd = -1; int relay_fd = -1; int error; - - // working with client_fd - client_fd = accept(fd, (struct sockaddr*)&clientaddr, &addrlen); - if (client_fd == -1) { - log_errno("accept"); - goto fail; - } - error = getdestaddr(client_fd, &clientaddr, &self->config.bindaddr, &destaddr); - if (error) { - goto fail; - } - - // working with relay_fd relay_fd = socket(AF_INET, SOCK_STREAM, 0); if (relay_fd == -1) { log_errno("socket"); @@ -376,12 +359,50 @@ static void redsocks_accept_client(int fd, short what, void *_arg) goto fail; } - error = connect(relay_fd, (struct sockaddr*)&self->config.relayaddr, sizeof(self->config.relayaddr)); + error = connect(relay_fd, (struct sockaddr*)&client->instance->config.relayaddr, sizeof(client->instance->config.relayaddr)); if (error && errno != EINPROGRESS) { log_errno("connect"); goto fail; } + client->relay = bufferevent_new(relay_fd, NULL, redsocks_relay_connected, redsocks_relay_error, client); + if (!client->relay) { + log_errno("bufferevent_new"); + goto fail; + } + + error = bufferevent_enable(client->relay, EV_WRITE); // we wait for connection... + if (error) { + log_errno("bufferevent_enable"); + goto fail; + } + +fail: + redsocks_drop_client(client); +} + +static void redsocks_accept_client(int fd, short what, void *_arg) +{ + redsocks_instance *self = _arg; + redsocks_client *client = NULL; + struct sockaddr_in clientaddr; + struct sockaddr_in destaddr; + socklen_t addrlen = sizeof(clientaddr); + int client_fd = -1; + int error; + + // working with client_fd + client_fd = accept(fd, (struct sockaddr*)&clientaddr, &addrlen); + if (client_fd == -1) { + log_errno("accept"); + goto fail; + } + + error = getdestaddr(client_fd, &clientaddr, &self->config.bindaddr, &destaddr); + if (error) { + goto fail; + } + // everything seems to be ok, let's allocate some memory client = calloc(1, sizeof(redsocks_client) + self->relay_ss->payload_len); if (!client) { @@ -400,31 +421,21 @@ static void redsocks_accept_client(int fd, short what, void *_arg) goto fail; } - client->relay = bufferevent_new(relay_fd, NULL, redsocks_relay_connected, redsocks_relay_error, client); - if (!client->client) { - log_errno("bufferevent_new"); - goto fail; - } - - error = bufferevent_enable(client->relay, EV_WRITE); // we wait for connection... - if (error) { - log_errno("bufferevent_enable"); - goto fail; - } - list_add(&client->list, &self->clients); + // now it's safe to redsocks_drop_client + + if (self->relay_ss->connect_relay) + self->relay_ss->connect_relay(client); + else + redsocks_connect_relay(client); return; fail: if (client) { if (client->client) bufferevent_free(client->client); - if (client->relay) - bufferevent_free(client->relay); free(client); } - if (relay_fd != -1) - close(relay_fd); if (client_fd != -1) close(client_fd); } diff --git a/redsocks.h b/redsocks.h index 67a5240..3756e91 100644 --- a/redsocks.h +++ b/redsocks.h @@ -23,6 +23,8 @@ typedef struct relay_subsys_t { evbuffercb readcb; evbuffercb writecb; void (*init)(struct redsocks_client_t *client); + // connect_relay (if any) is called instead of redsocks_connect_relay after client connection acceptance + void (*connect_relay)(struct redsocks_client_t *client); } relay_subsys; typedef struct redsocks_config_t {