char buffer[1024];
conn = redisConnect(inst->hostname, inst->port);
- if (dissocket->conn->err) return NULL;
+ if (conn->err) return NULL;
if (inst->password) {
redisReply *reply = NULL;
snprintf(buffer, sizeof(buffer), "AUTH %s", inst->password);
- reply = redisCommand(dissocket->conn, buffer);
+ reply = redisCommand(conn, buffer);
if (!reply) {
radlog(L_ERR, "rlm_redis (%s): Failed to run AUTH",
inst->xlat_name);
case REDIS_REPLY_STATUS:
if (strcmp(reply->str, "OK") != 0) {
radlog(L_ERR, "rlm_redis (%s): Failed authentication: reply %s",
- inst->xlat_name, dissocket->reply->str);
+ inst->xlat_name, reply->str);
goto do_close;
}
break; /* else it's OK */
snprintf(buffer, sizeof(buffer), "SELECT %d", inst->database);
- reply = redisCommand(dissocket->conn, buffer);
+ reply = redisCommand(conn, buffer);
if (!reply) {
radlog(L_ERR, "rlm_redis (%s): Failed to run SELECT",
inst->xlat_name);
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);
+ reply->str);
goto do_close;
}
break; /* else it's OK */
size_t ret = 0;
char *buffer_ptr;
char buffer[21];
- char querystr[MAX_QUERY_LEN];
-
- if (!radius_xlat(querystr, sizeof(querystr), fmt, request,
- redis_escape_func, inst)) {
- radlog(L_ERR, "rlm_redis (%s): xlat failed.",
- inst->xlat_name);
-
- return 0;
- }
dissocket = fr_connection_get(inst->pool);
if (!dissocket) {
}
/* Query failed for some reason, release socket and return */
- if (rlm_redis_query(&dissocket, inst, querystr) < 0) {
+ if (rlm_redis_query(&dissocket, inst, fmt, request) < 0) {
goto release;
}
if (inst->xlat_name) {
xlat_unregister(inst->xlat_name, redis_xlat, instance);
- free(inst->xlat_name);
}
- free(inst->xlat_name);
- free(inst);
return 0;
}
/*
* Query the redis database
*/
-int rlm_redis_query(REDISSOCK **dissocket_p, REDIS_INST *inst, char *query)
+int rlm_redis_query(REDISSOCK **dissocket_p, REDIS_INST *inst,
+ const char *query, REQUEST *request)
{
REDISSOCK *dissocket;
+ int argc;
+ const char *argv[MAX_REDIS_ARGS];
+ char argv_buf[MAX_QUERY_LEN];
if (!query || !*query || !inst || !dissocket_p) {
return -1;
}
+ argc = rad_expand_xlat(request, query, MAX_REDIS_ARGS, argv, 0,
+ sizeof(argv_buf), argv_buf);
+ if (argc <= 0)
+ return -1;
+
dissocket = *dissocket_p;
- DEBUG2("executing query %s", query);
- dissocket->reply = redisCommand(dissocket->conn, query);
+ DEBUG2("executing %s ...", argv[0]);
+ dissocket->reply = redisCommandArgv(dissocket->conn, argc, argv, NULL);
if (!dissocket->reply) {
radlog(L_ERR, "rlm_redis: (%s) REDIS error: %s",
/*
* Set up a storage area for instance data
*/
- inst = rad_malloc(sizeof (REDIS_INST));
- if (!inst) {
- return -1;
- }
- memset(inst, 0, sizeof (*inst));
+ *instance = inst = talloc_zero(conf, REDIS_INST);
+ if (!inst) return -1;
/*
* If the configuration parameters can't be parsed, then
* fail.
*/
if (cf_section_parse(conf, inst, module_config) < 0) {
- free(inst);
return -1;
}
if (!xlat_name)
xlat_name = cf_section_name1(conf);
- inst->xlat_name = strdup(xlat_name);
xlat_register(inst->xlat_name, redis_xlat, inst);
inst->pool = fr_connection_pool_init(conf, inst,
redis_create_conn, NULL,
redis_delete_conn);
if (!inst->pool) {
- redis_detach(inst);
return -1;
}
inst->redis_finish_query = rlm_redis_finish_query;
inst->redis_escape_func = redis_escape_func;
- *instance = inst;
-
return 0;
}