From a63a33861fd636c9e6f59d82d076fedfa98a12f6 Mon Sep 17 00:00:00 2001 From: Max Lv Date: Thu, 8 Dec 2016 14:48:40 +0800 Subject: [PATCH] Add container_of --- src/local.c | 4 ++-- src/redir.c | 5 +++-- src/server.c | 4 ++-- src/tunnel.c | 5 +++-- src/udprelay.c | 4 ++-- src/utils.h | 5 +++++ 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/local.c b/src/local.c index 7a048856..0a62612e 100644 --- a/src/local.c +++ b/src/local.c @@ -744,8 +744,8 @@ stat_update_cb() static void remote_timeout_cb(EV_P_ ev_timer *watcher, int revents) { - remote_ctx_t *remote_ctx = (remote_ctx_t *)(((char *)watcher) - - sizeof(ev_io)); + remote_ctx_t *remote_ctx + = (remote_ctx_t *)container_of(watcher, remote_ctx_t, watcher); remote_t *remote = remote_ctx->remote; server_t *server = remote->server; diff --git a/src/redir.c b/src/redir.c index f321428f..a9cbc0f8 100644 --- a/src/redir.c +++ b/src/redir.c @@ -328,8 +328,9 @@ server_send_cb(EV_P_ ev_io *w, int revents) static void remote_timeout_cb(EV_P_ ev_timer *watcher, int revents) { - remote_ctx_t *remote_ctx = (remote_ctx_t *)(((char *)watcher) - - sizeof(ev_io)); + remote_ctx_t *remote_ctx + = (remote_ctx_t *)container_of(watcher, remote_ctx_t, watcher); + remote_t *remote = remote_ctx->remote; server_t *server = remote->server; diff --git a/src/server.c b/src/server.c index 53bbf71c..593c51c9 100644 --- a/src/server.c +++ b/src/server.c @@ -1049,8 +1049,8 @@ block_list_clear_cb(EV_P_ ev_timer *watcher, int revents) static void server_timeout_cb(EV_P_ ev_timer *watcher, int revents) { - server_ctx_t *server_ctx = (server_ctx_t *)(((char *)watcher) - - sizeof(ev_io)); + server_ctx_t *server_ctx + = (server_ctx_t *)container_of(watcher, server_ctx_t, watcher); server_t *server = server_ctx->server; remote_t *remote = server->remote; diff --git a/src/tunnel.c b/src/tunnel.c index dbd44298..a403f576 100644 --- a/src/tunnel.c +++ b/src/tunnel.c @@ -284,8 +284,9 @@ server_send_cb(EV_P_ ev_io *w, int revents) static void remote_timeout_cb(EV_P_ ev_timer *watcher, int revents) { - remote_ctx_t *remote_ctx = (remote_ctx_t *)(((char *)watcher) - - sizeof(ev_io)); + remote_ctx_t *remote_ctx + = (remote_ctx_t *)container_of(watcher, remote_ctx_t, watcher); + remote_t *remote = remote_ctx->remote; server_t *server = remote->server; diff --git a/src/udprelay.c b/src/udprelay.c index f3dd6f9a..3be0414b 100644 --- a/src/udprelay.c +++ b/src/udprelay.c @@ -549,8 +549,8 @@ close_and_free_remote(EV_P_ remote_ctx_t *ctx) static void remote_timeout_cb(EV_P_ ev_timer *watcher, int revents) { - remote_ctx_t *remote_ctx = (remote_ctx_t *)(((char *)watcher) - - sizeof(ev_io)); + remote_ctx_t *remote_ctx + = (remote_ctx_t *)container_of(watcher, remote_ctx_t, watcher); if (verbose) { LOGI("[udp] connection timeout"); diff --git a/src/utils.h b/src/utils.h index 8574a19c..f94ab1f4 100644 --- a/src/utils.h +++ b/src/utils.h @@ -228,4 +228,9 @@ void *ss_realloc(void *ptr, size_t new_size); ptr = NULL; \ } while (0) +#ifndef container_of +#define container_of(ptr, type, member) \ + ((type *) ((char *)(ptr) - offsetof(type, member))) +#endif + #endif // _UTILS_H