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;
}
/*
* 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",
char *password;
fr_connection_pool_t *pool;
- int (*redis_query)(REDISSOCK **dissocket_p, REDIS_INST *inst, char *query);
+ int (*redis_query)(REDISSOCK **dissocket_p, REDIS_INST *inst, const char *query, REQUEST *request);
int (*redis_finish_query)(REDISSOCK *dissocket);
size_t (*redis_escape_func)(REQUEST *request, char *out, size_t outlen, const char *in, void *);
} rlm_redis_t;
#define MAX_QUERY_LEN 4096
+#define MAX_REDIS_ARGS 16
-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);
int rlm_redis_finish_query(REDISSOCK *dissocket);
#endif /* RLM_REDIS_H */
rlm_rediswho_t *inst, REQUEST *request)
{
REDISSOCK *dissocket;
- char query[MAX_STRING_LEN * 4];
int result = 0;
if (!fmt) {
return 0;
}
- /*
- * Do an xlat on the provided string
- */
- if (request) {
- if (!radius_xlat(query, sizeof (query), fmt, request,
- inst->redis_inst->redis_escape_func,
- inst->redis_inst)) {
- radlog(L_ERR, "rediswho_command: xlat failed on: '%s'", query);
- return 0;
- }
-
- } else {
- strcpy(query, fmt);
- }
-
- if (inst->redis_inst->redis_query(dissocket_p, inst->redis_inst, query) < 0) {
+ if (inst->redis_inst->redis_query(dissocket_p, inst->redis_inst,
+ fmt, request) < 0) {
- radlog(L_ERR, "rediswho_command: database query error in: '%s'", query);
+ radlog(L_ERR, "rediswho_command: database query error in: '%s'", fmt);
return -1;
}