#include #include #include #include #include "redis.h" #include "aux.h" #include "log.h" struct redis *redis_new(u_int32_t ip, u_int16_t port, char *key) { struct redis *r; struct timeval tv; redisReply *rp; char *s; r = malloc(sizeof(*r)); ZERO(*r); sprintf(r->host, IPF, IPP(ip)); r->port = port; r->key = key; tv.tv_sec = 1; tv.tv_usec = 0; r->ctx = redisConnectWithTimeout(r->host, r->port, tv); if (!r->ctx) goto err; if (r->ctx->err) goto err; rp = redisCommand(r->ctx, "PING"); if (!rp) goto err; freeReplyObject(rp); rp = redisCommand(r->ctx, "INFO"); if (!rp) goto err; s = strstr(rp->str, "role:"); if (!s) { freeReplyObject(rp); goto err; } if (!memcmp(s, "role:master", 9)) r->active = 1; else if (!memcmp(s, "role:slave", 8)) ; /* it's already 0 */ else { mylog(LOG_ERR, "Unable to determine Redis master/slave state\n"); freeReplyObject(rp); goto err; } freeReplyObject(rp); return r; err: if (r->ctx && r->ctx->err && r->ctx->errstr) mylog(LOG_CRIT, "Redis error: %s\n", r->ctx->errstr); if (r->ctx) redisFree(r->ctx); free(r); return NULL; }