]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Added database support from v2.1.x branch
authorAlan T. DeKok <aland@freeradius.org>
Tue, 29 May 2012 08:42:10 +0000 (10:42 +0200)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 29 May 2012 08:45:59 +0000 (10:45 +0200)
src/modules/rlm_redis/rlm_redis.c
src/modules/rlm_redis/rlm_redis.h

index 958c125e96a138c357d819ff2d4cbd7ecfb76f7d..82a4bf4a6c5416b57002fcee6c23a2d3f780a0f4 100644 (file)
@@ -35,6 +35,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},
 
@@ -61,13 +63,13 @@ static void *redis_create_conn(void *ctx)
        REDIS_INST *inst = ctx;
        REDISSOCK *dissocket = NULL;
        redisContext *conn;
+       char buffer[1024];
 
        conn = redisConnect(inst->hostname, inst->port);
-       if (!dissocket->conn->err) goto do_alloc;
+       if (dissocket->conn->err) return NULL;
 
        if (inst->password) {
                redisReply *reply = NULL;
-               char buffer[1024];
 
                snprintf(buffer, sizeof(buffer), "AUTH %s", inst->password);
 
@@ -98,7 +100,36 @@ static void *redis_create_conn(void *ctx)
                }
        }
 
-do_alloc:
+       if (inst->database) {
+               redisReply *reply = NULL;
+
+               snprintf(buffer, sizeof(buffer), "SELECT %d", inst->database);
+
+               reply = redisCommand(dissocket->conn, buffer);
+               if (!reply) {
+                       radlog(L_ERR, "rlm_redis (%s): Failed to run SELECT",
+                              inst->xlat_name);
+                       goto do_close;
+               }
+
+
+               switch (reply->type) {
+               case REDIS_REPLY_STATUS:
+                       if (strcmp(reply->str, "OK") != 0) {
+                               radlog(L_ERR, "rlm_redis (%s): Failed SELECT %d: reply %s",
+                                      inst->xlat_name, inst->database,
+                                      dissocket->reply->str);
+                               goto do_close;
+                       }
+                       break;  /* else it's OK */
+
+               default:
+                       radlog(L_ERR, "rlm_redis (%s): Unexpected reply to SELECT",
+                              inst->xlat_name);
+                       goto do_close;
+               }
+       }
+
        dissocket = rad_malloc(sizeof(*dissocket));
        memset(dissocket, 0, sizeof(*dissocket));
        dissocket->conn = conn;
index 6f073059f369cb1fc1e2fd8b138ed48df151d166..9214e143cd01fa62ff69fd10d78a70b48d4ceefb 100644 (file)
@@ -46,6 +46,7 @@ typedef struct rlm_redis_t {
 
         char            *hostname;
         int             port;
+       int             database;
        char            *password;
        fr_connection_pool_t *pool;