Cleanup in content_mapblock (#5746)
[oweals/minetest.git] / src / database-redis.cpp
index 3bcedad9bfdaddc71b50e753570164b2ab66d5b4..93e6717fa7e5ee4f67dca84bb7e7663936d8307e 100644 (file)
@@ -44,7 +44,8 @@ Database_Redis::Database_Redis(Settings &conf)
        }
        const char *addr = tmp.c_str();
        int port = conf.exists("redis_port") ? conf.getU16("redis_port") : 6379;
-       ctx = redisConnect(addr, port);
+       // if redis_address contains '/' assume unix socket, else hostname/ip
+       ctx = tmp.find('/') != std::string::npos ? redisConnectUnix(addr) : redisConnect(addr, port);
        if (!ctx) {
                throw DatabaseException("Cannot allocate redis context");
        } else if (ctx->err) {
@@ -52,6 +53,18 @@ Database_Redis::Database_Redis(Settings &conf)
                redisFree(ctx);
                throw DatabaseException(err);
        }
+       if (conf.exists("redis_password")) {
+               tmp = conf.get("redis_password");
+               redisReply *reply = static_cast<redisReply *>(redisCommand(ctx, "AUTH %s", tmp.c_str()));
+               if (!reply)
+                       throw DatabaseException("Redis authentication failed");
+               if (reply->type == REDIS_REPLY_ERROR) {
+                       std::string err = "Redis authentication failed: " + std::string(reply->str, reply->len);
+                       freeReplyObject(reply);
+                       throw DatabaseException(err);
+               }
+               freeReplyObject(reply);
+       }
 }
 
 Database_Redis::~Database_Redis()