0
0
mirror of https://github.com/darkk/redsocks.git synced 2025-08-28 04:35:30 +00:00

This cleanup commit introduces ex-plain function!

This commit is contained in:
Leonid Evdokimov 2010-11-29 00:09:48 +02:00
parent 9c8f21a986
commit 45cab3de31
2 changed files with 29 additions and 9 deletions

View File

@ -429,27 +429,40 @@ fail:
return retval; return retval;
} }
void redsocks_write_helper_ex( int redsocks_write_helper_ex(
struct bufferevent *buffev, redsocks_client *client, struct bufferevent *buffev, redsocks_client *client,
redsocks_message_maker mkmessage, int state, size_t wm_low, size_t wm_high) redsocks_message_maker mkmessage, int state, size_t wm_low, size_t wm_high)
{
assert(client);
return redsocks_write_helper_ex_plain(buffev, client, (redsocks_message_maker_plain)mkmessage,
client, state, wm_low, wm_high);
}
int redsocks_write_helper_ex_plain(
struct bufferevent *buffev, redsocks_client *client,
redsocks_message_maker_plain mkmessage, void *p, int state, size_t wm_low, size_t wm_high)
{ {
int len; int len;
struct evbuffer *buff = NULL; struct evbuffer *buff = NULL;
int drop = 1; int drop = 1;
if (mkmessage) { if (mkmessage) {
buff = mkmessage(client); buff = mkmessage(p);
if (!buff) if (!buff)
goto fail; goto fail;
len = bufferevent_write_buffer(client->relay, buff); len = bufferevent_write_buffer(client->relay, buff);
if (len < 0) { if (len < 0) {
redsocks_log_errno(client, LOG_ERR, "bufferevent_write_buffer"); if (client)
redsocks_log_errno(client, LOG_ERR, "bufferevent_write_buffer");
else
log_errno(LOG_ERR, "bufferevent_write_buffer");
goto fail; goto fail;
} }
} }
client->state = state; if (client)
client->state = state;
buffev->wm_read.low = wm_low; buffev->wm_read.low = wm_low;
buffev->wm_read.high = wm_high; buffev->wm_read.high = wm_high;
bufferevent_enable(buffev, EV_READ); bufferevent_enable(buffev, EV_READ);
@ -458,15 +471,17 @@ void redsocks_write_helper_ex(
fail: fail:
if (buff) if (buff)
evbuffer_free(buff); evbuffer_free(buff);
if (drop) if (drop && client)
redsocks_drop_client(client); redsocks_drop_client(client);
return drop ? -1 : 0;
} }
void redsocks_write_helper( int redsocks_write_helper(
struct bufferevent *buffev, redsocks_client *client, struct bufferevent *buffev, redsocks_client *client,
redsocks_message_maker mkmessage, int state, size_t wm_only) redsocks_message_maker mkmessage, int state, size_t wm_only)
{ {
redsocks_write_helper_ex(buffev, client, mkmessage, state, wm_only, wm_only); assert(client);
return redsocks_write_helper_ex(buffev, client, mkmessage, state, wm_only, wm_only);
} }
static void redsocks_relay_connected(struct bufferevent *buffev, void *_arg) static void redsocks_relay_connected(struct bufferevent *buffev, void *_arg)

View File

@ -70,11 +70,16 @@ int sizes_greater_equal(size_t a, size_t b);
int redsocks_read_expected(redsocks_client *client, struct evbuffer *input, void *data, size_comparator comparator, size_t expected); int redsocks_read_expected(redsocks_client *client, struct evbuffer *input, void *data, size_comparator comparator, size_t expected);
typedef struct evbuffer* (*redsocks_message_maker)(redsocks_client *client); typedef struct evbuffer* (*redsocks_message_maker)(redsocks_client *client);
typedef struct evbuffer* (*redsocks_message_maker_plain)(void *p);
struct evbuffer *mkevbuffer(void *data, size_t len); struct evbuffer *mkevbuffer(void *data, size_t len);
void redsocks_write_helper_ex( /* Yahoo! This code is ex-plain! :-D */
int redsocks_write_helper_ex_plain(
struct bufferevent *buffev, redsocks_client *client,
redsocks_message_maker_plain mkmessage, void *p, int state, size_t wm_low, size_t wm_high);
int redsocks_write_helper_ex(
struct bufferevent *buffev, redsocks_client *client, struct bufferevent *buffev, redsocks_client *client,
redsocks_message_maker mkmessage, int state, size_t wm_low, size_t wm_high); redsocks_message_maker mkmessage, int state, size_t wm_low, size_t wm_high);
void redsocks_write_helper( int redsocks_write_helper(
struct bufferevent *buffev, redsocks_client *client, struct bufferevent *buffev, redsocks_client *client,
redsocks_message_maker mkmessage, int state, size_t wm_only); redsocks_message_maker mkmessage, int state, size_t wm_only);