mirror of
https://github.com/darkk/redsocks.git
synced 2025-08-26 03:35:30 +00:00
Refactor: replace struct event
with tracked_event
to track EVLIST_INSERTED state.
This commit is contained in:
parent
8156e442c2
commit
6f8312b21f
37
redsocks.c
37
redsocks.c
@ -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)
|
||||
{
|
||||
// FIXME: find proper way to calulate instance_payload_len
|
||||
@ -715,8 +741,8 @@ static int redsocks_init_instance(redsocks_instance *instance)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
event_set(&instance->listener, fd, EV_READ | EV_PERSIST, redsocks_accept_client, instance);
|
||||
error = event_add(&instance->listener, NULL);
|
||||
tracked_event_set(&instance->listener, fd, EV_READ | EV_PERSIST, redsocks_accept_client, instance);
|
||||
error = tracked_event_add(&instance->listener, NULL);
|
||||
if (error) {
|
||||
log_errno(LOG_ERR, "event_add");
|
||||
goto fail;
|
||||
@ -751,10 +777,11 @@ static void redsocks_fini_instance(redsocks_instance *instance) {
|
||||
if (instance->relay_ss->instance_fini)
|
||||
instance->relay_ss->instance_fini(instance);
|
||||
|
||||
if (event_initialized(&instance->listener)) {
|
||||
if (event_del(&instance->listener) != 0)
|
||||
if (event_initialized(&instance->listener.ev)) {
|
||||
if (instance->listener.inserted)
|
||||
if (tracked_event_del(&instance->listener) != 0)
|
||||
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");
|
||||
memset(&instance->listener, 0, sizeof(instance->listener));
|
||||
}
|
||||
|
@ -32,10 +32,15 @@ typedef struct redsocks_config_t {
|
||||
uint16_t listenq;
|
||||
} redsocks_config;
|
||||
|
||||
struct tracked_event {
|
||||
struct event ev;
|
||||
int inserted;
|
||||
};
|
||||
|
||||
typedef struct redsocks_instance_t {
|
||||
list_head list;
|
||||
redsocks_config config;
|
||||
struct event listener;
|
||||
struct tracked_event listener;
|
||||
list_head clients;
|
||||
relay_subsys *relay_ss;
|
||||
} redsocks_instance;
|
||||
|
Loading…
Reference in New Issue
Block a user