int redisc_init(void) { char addr[256], pass[256], unix_sock_path[256]; unsigned int port, db, sock = 0, haspass = 0; redisc_server_t *rsrv=NULL; param_t *pit = NULL; struct timeval tv_conn; struct timeval tv_cmd; tv_conn.tv_sec = (int) redis_connect_timeout_param / 1000; tv_conn.tv_usec = (int) (redis_connect_timeout_param % 1000) * 1000; tv_cmd.tv_sec = (int) redis_cmd_timeout_param / 1000; tv_cmd.tv_usec = (int) (redis_cmd_timeout_param % 1000) * 1000; if(_redisc_srv_list==NULL) { LM_ERR("no redis servers defined\n"); return -1; } for(rsrv=_redisc_srv_list; rsrv; rsrv=rsrv->next) { port = 6379; db = 0; haspass = 0; sock = 0; memset(addr, 0, sizeof(addr)); memset(pass, 0, sizeof(pass)); memset(unix_sock_path, 0, sizeof(unix_sock_path)); for (pit = rsrv->attrs; pit; pit=pit->next) { if(pit->name.len==4 && strncmp(pit->name.s, "unix", 4)==0) { snprintf(unix_sock_path, sizeof(unix_sock_path)-1, "%.*s", pit->body.len, pit->body.s); sock = 1; } else if(pit->name.len==4 && strncmp(pit->name.s, "addr", 4)==0) { snprintf(addr, sizeof(addr)-1, "%.*s", pit->body.len, pit->body.s); } else if(pit->name.len==4 && strncmp(pit->name.s, "port", 4)==0) { if(str2int(&pit->body, &port) < 0) port = 6379; } else if(pit->name.len==2 && strncmp(pit->name.s, "db", 2)==0) { if(str2int(&pit->body, &db) < 0) db = 0; } else if(pit->name.len==4 && strncmp(pit->name.s, "pass", 4)==0) { snprintf(pass, sizeof(pass)-1, "%.*s", pit->body.len, pit->body.s); haspass = 1; } } if(sock != 0) { LM_DBG("Connecting to unix socket: %s\n", unix_sock_path); rsrv->ctxRedis = redisConnectUnixWithTimeout(unix_sock_path, tv_conn); } else { LM_DBG("Connecting to %s:%d\n", addr, port); rsrv->ctxRedis = redisConnectWithTimeout(addr, port, tv_conn); } LM_DBG("rsrv->ctxRedis = %p\n", rsrv->ctxRedis); if(!rsrv->ctxRedis) { LM_ERR("Failed to create REDIS-Context.\n"); goto err; } if (rsrv->ctxRedis->err) { LM_ERR("Failed to create REDIS returned an error: %s\n", rsrv->ctxRedis->errstr); goto err2; } if ((haspass != 0) && redisc_check_auth(rsrv, pass)) { LM_ERR("Authentication failed.\n"); goto err2; } if (redisSetTimeout(rsrv->ctxRedis, tv_cmd)) { LM_ERR("Failed to set timeout.\n"); goto err2; } if (redisCommandNR(rsrv->ctxRedis, "PING")) { LM_ERR("Failed to send PING (REDIS returned %s).\n", rsrv->ctxRedis->errstr); goto err2; } if ((redis_cluster_param == 0) && redisCommandNR(rsrv->ctxRedis, "SELECT %i", db)) { LM_ERR("Failed to send \"SELECT %i\" (REDIS returned \"%s\", and not in cluster mode).\n", db, rsrv->ctxRedis->errstr); goto err2; } } return 0; err2: if (sock != 0) { LM_ERR("error communicating with redis server [%.*s]" " (unix:%s db:%d): %s\n", rsrv->sname->len, rsrv->sname->s, unix_sock_path, db, rsrv->ctxRedis->errstr); } else { LM_ERR("error communicating with redis server [%.*s] (%s:%d/%d): %s\n", rsrv->sname->len, rsrv->sname->s, addr, port, db, rsrv->ctxRedis->errstr); } if (init_without_redis==1) { LM_WARN("failed to initialize redis connections, but initializing" " module anyway.\n"); return 0; } return -1; err: if (sock != 0) { LM_ERR("failed to connect to redis server [%.*s] (unix:%s db:%d)\n", rsrv->sname->len, rsrv->sname->s, unix_sock_path, db); } else { LM_ERR("failed to connect to redis server [%.*s] (%s:%d/%d)\n", rsrv->sname->len, rsrv->sname->s, addr, port, db); } if (init_without_redis==1) { LM_WARN("failed to initialize redis connections, but initializing" " module anyway.\n"); return 0; } return -1; }
int redisc_init(void) { char *addr, *unix_sock_path = NULL; unsigned int port, db; redisc_server_t *rsrv=NULL; param_t *pit = NULL; struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; if(_redisc_srv_list==NULL) { LM_ERR("no redis servers defined\n"); return -1; } for(rsrv=_redisc_srv_list; rsrv; rsrv=rsrv->next) { addr = "127.0.0.1"; port = 6379; db = 0; for (pit = rsrv->attrs; pit; pit=pit->next) { if(pit->name.len==4 && strncmp(pit->name.s, "unix", 4)==0) { unix_sock_path = pit->body.s; unix_sock_path[pit->body.len] = '\0'; } else if(pit->name.len==4 && strncmp(pit->name.s, "addr", 4)==0) { addr = pit->body.s; addr[pit->body.len] = '\0'; } else if(pit->name.len==4 && strncmp(pit->name.s, "port", 4)==0) { if(str2int(&pit->body, &port) < 0) port = 6379; } else if(pit->name.len==2 && strncmp(pit->name.s, "db", 2)==0) { if(str2int(&pit->body, &db) < 0) db = 0; } } if(unix_sock_path != NULL) { LM_DBG("Connecting to unix socket: %s\n", unix_sock_path); rsrv->ctxRedis = redisConnectUnixWithTimeout(unix_sock_path, tv); } else { rsrv->ctxRedis = redisConnectWithTimeout(addr, port, tv); } if(!rsrv->ctxRedis) goto err; if (rsrv->ctxRedis->err) goto err2; if (redisCommandNR(rsrv->ctxRedis, "PING")) goto err2; if (redisCommandNR(rsrv->ctxRedis, "SELECT %i", db)) goto err2; } return 0; err2: if (unix_sock_path != NULL) { LM_ERR("error communicating with redis server [%.*s] (unix:%s db:%d): %s\n", rsrv->sname->len, rsrv->sname->s, unix_sock_path, db, rsrv->ctxRedis->errstr); } else { LM_ERR("error communicating with redis server [%.*s] (%s:%d/%d): %s\n", rsrv->sname->len, rsrv->sname->s, addr, port, db, rsrv->ctxRedis->errstr); } return -1; err: if (unix_sock_path != NULL) { LM_ERR("failed to connect to redis server [%.*s] (unix:%s db:%d)\n", rsrv->sname->len, rsrv->sname->s, unix_sock_path, db); } else { LM_ERR("failed to connect to redis server [%.*s] (%s:%d/%d)\n", rsrv->sname->len, rsrv->sname->s, addr, port, db); } return -1; }
int redisc_reconnect_server(redisc_server_t *rsrv) { char addr[256], pass[256], unix_sock_path[256]; unsigned int port, db, sock = 0, haspass = 0; param_t *pit = NULL; struct timeval tv_conn; struct timeval tv_cmd; tv_conn.tv_sec = (int) redis_connect_timeout_param / 1000; tv_conn.tv_usec = (int) (redis_connect_timeout_param % 1000) * 1000; tv_cmd.tv_sec = (int) redis_cmd_timeout_param / 1000; tv_cmd.tv_usec = (int) (redis_cmd_timeout_param % 1000) * 1000; memset(addr, 0, sizeof(addr)); port = 6379; db = 0; memset(pass, 0, sizeof(pass)); memset(unix_sock_path, 0, sizeof(unix_sock_path)); for (pit = rsrv->attrs; pit; pit=pit->next) { if(pit->name.len==4 && strncmp(pit->name.s, "unix", 4)==0) { snprintf(unix_sock_path, sizeof(unix_sock_path)-1, "%.*s", pit->body.len, pit->body.s); sock = 1; } else if(pit->name.len==4 && strncmp(pit->name.s, "addr", 4)==0) { snprintf(addr, sizeof(addr)-1, "%.*s", pit->body.len, pit->body.s); } else if(pit->name.len==4 && strncmp(pit->name.s, "port", 4)==0) { if(str2int(&pit->body, &port) < 0) port = 6379; } else if(pit->name.len==2 && strncmp(pit->name.s, "db", 2)==0) { if(str2int(&pit->body, &db) < 0) db = 0; } else if(pit->name.len==4 && strncmp(pit->name.s, "pass", 4)==0) { snprintf(pass, sizeof(pass)-1, "%.*s", pit->body.len, pit->body.s); haspass = 1; } } LM_DBG("rsrv->ctxRedis = %p\n", rsrv->ctxRedis); if(rsrv->ctxRedis!=NULL) { redisFree(rsrv->ctxRedis); rsrv->ctxRedis = NULL; } if(sock != 0) { rsrv->ctxRedis = redisConnectUnixWithTimeout(unix_sock_path, tv_conn); } else { rsrv->ctxRedis = redisConnectWithTimeout(addr, port, tv_conn); } LM_DBG("rsrv->ctxRedis = %p\n", rsrv->ctxRedis); if(!rsrv->ctxRedis) goto err; if (rsrv->ctxRedis->err) goto err2; if ((haspass) && redisc_check_auth(rsrv, pass)) goto err2; if (redisSetTimeout(rsrv->ctxRedis, tv_cmd)) goto err2; if (redisCommandNR(rsrv->ctxRedis, "PING")) goto err2; if ((redis_cluster_param == 0) && redisCommandNR(rsrv->ctxRedis, "SELECT %i", db)) goto err2; if (redis_flush_on_reconnect_param) if (redisCommandNR(rsrv->ctxRedis, "FLUSHALL")) goto err2; return 0; err2: if (sock != 0) { LM_ERR("error communicating with redis server [%.*s]" " (unix:%s db:%d): %s\n", rsrv->sname->len, rsrv->sname->s, unix_sock_path, db, rsrv->ctxRedis->errstr); } else { LM_ERR("error communicating with redis server [%.*s] (%s:%d/%d): %s\n", rsrv->sname->len, rsrv->sname->s, addr, port, db, rsrv->ctxRedis->errstr); } err: if (sock != 0) { LM_ERR("failed to connect to redis server [%.*s] (unix:%s db:%d)\n", rsrv->sname->len, rsrv->sname->s, unix_sock_path, db); } else { LM_ERR("failed to connect to redis server [%.*s] (%s:%d/%d)\n", rsrv->sname->len, rsrv->sname->s, addr, port, db); } return -1; }