]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Added database selection capability to rlm_redis
authorAlan T. DeKok <aland@freeradius.org>
Tue, 29 May 2012 08:28:17 +0000 (10:28 +0200)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 29 May 2012 08:35:02 +0000 (10:35 +0200)
src/modules/rlm_redis/rlm_redis.c
src/modules/rlm_redis/rlm_redis.h

index d7f5c5546d1c18fc987d9fa388a4ddf74dd3dedb..2eb778d5e09e2942ef26b055e00a5a113dd8ac7f 100644 (file)
@@ -37,6 +37,8 @@ static const CONF_PARSER module_config[] = {
          offsetof(REDIS_INST, hostname), NULL, "127.0.0.1"},
        { "port", PW_TYPE_INTEGER,
          offsetof(REDIS_INST, port), NULL, "6379"},
+       { "database", PW_TYPE_INTEGER,
+         offsetof(REDIS_INST, database), NULL, "0"},
        { "password", PW_TYPE_STRING_PTR,
          offsetof(REDIS_INST, password), NULL, NULL},
        {"connect_failure_retry_delay", PW_TYPE_INTEGER,
@@ -116,6 +118,38 @@ static int connect_single_socket(REDIS_INST *inst, REDISSOCK *dissocket)
                }
        }
 
+       if (inst->database) {
+               snprintf(buffer, sizeof(buffer), "SELECT %d", inst->database);
+
+               dissocket->reply = redisCommand(dissocket->conn, buffer);
+               if (!dissocket->reply) {
+                       radlog(L_ERR, "rlm_redis (%s): Failed select database",
+                              inst->xlat_name);
+                       redis_close_socket(inst, dissocket);
+                       return -1;
+               }
+
+               switch (dissocket->reply->type) {
+               case REDIS_REPLY_STATUS:
+                       if (strcmp(dissocket->reply->str, "OK") != 0) {
+                               radlog(L_ERR, "rlm_redis (%s): Failed SELECT %u : reply %s",
+                                      inst->xlat_name, inst->database,
+                                      dissocket->reply->str);
+                               redis_close_socket(inst, dissocket);
+                               return -1;
+                       }
+                       break;  /* else it's OK */
+
+               default:
+                       radlog(L_ERR, "rlm_redis (%s): Unexpected reply to SELECT",
+                              inst->xlat_name);
+                       redis_close_socket(inst, dissocket);
+                       return -1;
+               }
+       }
+
+
+
        radlog(L_INFO, "rlm_redis (%s): Connected new DB handle, #%d",
               inst->xlat_name, dissocket->id);
 
index 1bde5186d39bcd4be8231c2824f382daa2596001..a55d4db4403a1e43c971f6a9a95480476316b70c 100644 (file)
@@ -66,6 +66,8 @@ typedef struct rlm_redis_t {
 
         char            *hostname;
         int             port;
+       int             database;
+       int             database;
        char            *password;
 
        REDISSOCK *(*redis_get_socket)(REDIS_INST * inst);