diff --git a/list.h b/list.h index 33802f6..0a992df 100644 --- a/list.h +++ b/list.h @@ -4,6 +4,7 @@ * I don't know what copyright to place here but that's GPLv2 code so * I assume I'm free to reuse it. */ +#include "utils.h" // container_of /* diff --git a/redsocks.c b/redsocks.c index 7be7ba4..8217a45 100644 --- a/redsocks.c +++ b/redsocks.c @@ -585,6 +585,33 @@ fail: close(client_fd); } +static const char *redsocks_evshut_str(unsigned short evshut) +{ + return + evshut == EV_READ ? "SHUT_RD" : + evshut == EV_WRITE ? "SHUT_WR" : + evshut == (EV_READ|EV_WRITE) ? "SHUT_RDWR" : + evshut == 0 ? "" : + "???"; +} + +static void redsocks_debug_dump(int sig, short what, void *_arg) +{ + redsocks_instance *self = _arg; + redsocks_client *client = NULL; + + log_error(LOG_DEBUG, "Dumping client list:"); + list_for_each_entry(client, &self->clients, list) { + const char *s_client_evshut = redsocks_evshut_str(client->client_evshut); + const char *s_relay_evshut = redsocks_evshut_str(client->relay_evshut); + + redsocks_log_error(client, LOG_DEBUG, "client: %i%s%s, relay: %i%s%s", + EVENT_FD(&client->client->ev_write), s_client_evshut[0] ? " " : "", s_client_evshut, + EVENT_FD(&client->relay->ev_write), s_relay_evshut[0] ? " " : "", s_relay_evshut); + } + log_error(LOG_DEBUG, "End of client list."); +} + static int redsocks_init() { int error; @@ -629,6 +656,13 @@ static int redsocks_init() goto fail; } + signal_set(&instance.debug_dumper, SIGUSR1, redsocks_debug_dump, &instance); + error = signal_add(&instance.debug_dumper, NULL); + if (error) { + log_errno(LOG_ERR, "signal_add"); + goto fail; + } + event_set(&instance.listener, fd, EV_READ | EV_PERSIST, redsocks_accept_client, &instance); error = event_add(&instance.listener, NULL); if (error) { @@ -638,6 +672,11 @@ static int redsocks_init() return 0; fail: + if (signal_initialized(&instance.debug_dumper)) { + signal_del(&instance.debug_dumper); + memset(&instance.debug_dumper, 0, sizeof(instance.debug_dumper)); + } + if (event_initialized(&instance.listener)) { event_del(&instance.listener); memset(&instance.listener, 0, sizeof(instance.listener)); diff --git a/redsocks.h b/redsocks.h index 2025159..873db5c 100644 --- a/redsocks.h +++ b/redsocks.h @@ -39,6 +39,7 @@ typedef struct redsocks_config_t { typedef struct redsocks_instance_t { redsocks_config config; struct event listener; + struct event debug_dumper; list_head clients; relay_subsys *relay_ss; } redsocks_instance; diff --git a/utils.h b/utils.h index 698ca83..b91b8ba 100644 --- a/utils.h +++ b/utils.h @@ -1,10 +1,26 @@ #ifndef UTILS_H_SAT_FEB__2_02_24_05_2008 #define UTILS_H_SAT_FEB__2_02_24_05_2008 +#include + + #define SIZEOF_ARRAY(arr) (sizeof(arr) / sizeof(arr[0])) #define FOREACH(ptr, array) for (ptr = array; ptr < array + SIZEOF_ARRAY(array); ptr++) #define FOREACH_REV(ptr, array) for (ptr = array + SIZEOF_ARRAY(array) - 1; ptr >= array; ptr--) + +/** + * container_of - cast a member of a structure out to the containing structure + * @ptr: the pointer to the member. + * @type: the type of the container struct this is embedded in. + * @member: the name of the member within the struct. + * + */ +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + + /* vim:set tabstop=4 softtabstop=4 shiftwidth=4: */ /* vim:set foldmethod=marker foldlevel=32 foldmarker={,}: */ #endif /* UTILS_H_SAT_FEB__2_02_24_05_2008 */