0
0
mirror of https://github.com/darkk/redsocks.git synced 2025-08-26 19:55:30 +00:00

Refactor: replace struct event with tracked_event to track EVLIST_INSERTED state.

This commit is contained in:
Leonid Evdokimov 2012-01-27 21:42:16 +04:00
parent 8156e442c2
commit 6f8312b21f
2 changed files with 39 additions and 7 deletions

View File

@ -68,6 +68,32 @@ static parser_entry redsocks_entries[] =
{ } { }
}; };
/* There is no way to get `EVLIST_INSERTED` event flag outside of libevent, so
* here are tracking functions. */
static void tracked_event_set(
struct tracked_event *tev, evutil_socket_t fd, short events,
void (*callback)(evutil_socket_t, short, void *), void *arg)
{
event_set(&tev->ev, fd, events, callback, arg);
tev->inserted = 0;
}
static int tracked_event_add(struct tracked_event *tev, const struct timeval *tv)
{
int ret = event_add(&tev->ev, tv);
if (ret == 0)
tev->inserted = 1;
return ret;
}
static int tracked_event_del(struct tracked_event *tev)
{
int ret = event_del(&tev->ev);
if (ret == 0)
tev->inserted = 0;
return ret;
}
static int redsocks_onenter(parser_section *section) static int redsocks_onenter(parser_section *section)
{ {
// FIXME: find proper way to calulate instance_payload_len // FIXME: find proper way to calulate instance_payload_len
@ -715,8 +741,8 @@ static int redsocks_init_instance(redsocks_instance *instance)
goto fail; goto fail;
} }
event_set(&instance->listener, fd, EV_READ | EV_PERSIST, redsocks_accept_client, instance); tracked_event_set(&instance->listener, fd, EV_READ | EV_PERSIST, redsocks_accept_client, instance);
error = event_add(&instance->listener, NULL); error = tracked_event_add(&instance->listener, NULL);
if (error) { if (error) {
log_errno(LOG_ERR, "event_add"); log_errno(LOG_ERR, "event_add");
goto fail; goto fail;
@ -751,10 +777,11 @@ static void redsocks_fini_instance(redsocks_instance *instance) {
if (instance->relay_ss->instance_fini) if (instance->relay_ss->instance_fini)
instance->relay_ss->instance_fini(instance); instance->relay_ss->instance_fini(instance);
if (event_initialized(&instance->listener)) { if (event_initialized(&instance->listener.ev)) {
if (event_del(&instance->listener) != 0) if (instance->listener.inserted)
if (tracked_event_del(&instance->listener) != 0)
log_errno(LOG_WARNING, "event_del"); log_errno(LOG_WARNING, "event_del");
if (close(EVENT_FD(&instance->listener)) != 0) if (close(EVENT_FD(&instance->listener.ev)) != 0)
log_errno(LOG_WARNING, "close"); log_errno(LOG_WARNING, "close");
memset(&instance->listener, 0, sizeof(instance->listener)); memset(&instance->listener, 0, sizeof(instance->listener));
} }

View File

@ -32,10 +32,15 @@ typedef struct redsocks_config_t {
uint16_t listenq; uint16_t listenq;
} redsocks_config; } redsocks_config;
struct tracked_event {
struct event ev;
int inserted;
};
typedef struct redsocks_instance_t { typedef struct redsocks_instance_t {
list_head list; list_head list;
redsocks_config config; redsocks_config config;
struct event listener; struct tracked_event listener;
list_head clients; list_head clients;
relay_subsys *relay_ss; relay_subsys *relay_ss;
} redsocks_instance; } redsocks_instance;