From: Vsevolod Stakhov Date: Thu, 8 Sep 2016 14:25:12 +0000 (+0100) Subject: [Fix] Fix hiredis stupidity X-Git-Tag: 1.4.0~466 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b05b9bf904edce75c17e63982d5e0a82dd3e9064;p=thirdparty%2Frspamd.git [Fix] Fix hiredis stupidity --- diff --git a/contrib/hiredis/async.c b/contrib/hiredis/async.c index d955203f84..84c43585c4 100644 --- a/contrib/hiredis/async.c +++ b/contrib/hiredis/async.c @@ -129,6 +129,7 @@ static redisAsyncContext *redisAsyncInitialize(redisContext *c) { ac->onConnect = NULL; ac->onDisconnect = NULL; + ac->disconnectCbdata = NULL; ac->replies.head = NULL; ac->replies.tail = NULL; @@ -215,9 +216,10 @@ int redisAsyncSetConnectCallback(redisAsyncContext *ac, redisConnectCallback *fn return REDIS_ERR; } -int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn) { +int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn, void *cbdata) { if (ac->onDisconnect == NULL) { ac->onDisconnect = fn; + ac->disconnectCbdata = cbdata; return REDIS_OK; } return REDIS_ERR; @@ -306,9 +308,9 @@ static void __redisAsyncFree(redisAsyncContext *ac) { * this context, the status will always be REDIS_OK. */ if (ac->onDisconnect && (c->flags & REDIS_CONNECTED)) { if (c->flags & REDIS_FREEING) { - ac->onDisconnect(ac,REDIS_OK); + ac->onDisconnect(ac,REDIS_OK,ac->disconnectCbdata); } else { - ac->onDisconnect(ac,(ac->err == 0) ? REDIS_OK : REDIS_ERR); + ac->onDisconnect(ac,(ac->err == 0) ? REDIS_OK : REDIS_ERR,ac->disconnectCbdata); } } diff --git a/contrib/hiredis/async.h b/contrib/hiredis/async.h index 59cbf469b9..3d20241c6e 100644 --- a/contrib/hiredis/async.h +++ b/contrib/hiredis/async.h @@ -54,7 +54,7 @@ typedef struct redisCallbackList { } redisCallbackList; /* Connection callback prototypes */ -typedef void (redisDisconnectCallback)(const struct redisAsyncContext*, int status); +typedef void (redisDisconnectCallback)(const struct redisAsyncContext*, int status, void *cbdata); typedef void (redisConnectCallback)(const struct redisAsyncContext*, int status); /* Context for an async connection to Redis */ @@ -85,6 +85,8 @@ typedef struct redisAsyncContext { /* Called when either the connection is terminated due to an error or per * user request. The status is set accordingly (REDIS_OK, REDIS_ERR). */ redisDisconnectCallback *onDisconnect; + /* Hiredis is just brain-damaged here, need to fix it */ + void *disconnectCbdata; /* Called when the first write event was received. */ redisConnectCallback *onConnect; @@ -107,7 +109,7 @@ redisAsyncContext *redisAsyncConnectBindWithReuse(const char *ip, int port, const char *source_addr); redisAsyncContext *redisAsyncConnectUnix(const char *path); int redisAsyncSetConnectCallback(redisAsyncContext *ac, redisConnectCallback *fn); -int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn); +int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn, void *cbdata); void redisAsyncDisconnect(redisAsyncContext *ac); void redisAsyncFree(redisAsyncContext *ac);