0
0
mirror of https://github.com/darkk/redsocks.git synced 2025-08-25 11:15:30 +00:00

debug util: dumping list of connections on SIGUSR1.

This commit is contained in:
Leonid Evdokimov 2008-07-13 04:22:52 +07:00
parent c4c35981fd
commit 23a62f69c8
4 changed files with 57 additions and 0 deletions

1
list.h
View File

@ -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
/*

View File

@ -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));

View File

@ -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;

16
utils.h
View File

@ -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 <stddef.h>
#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 */