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)) {
- radlog(L_ERR, "rlm_redis (%s): xlat failed.",
- inst->xlat_name);
-
- return 0;
- }
if ((dissocket = redis_get_socket(inst)) == NULL) {
radlog(L_ERR, "rlm_redis (%s): redis_get_socket() failed",
}
/* 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) {
rlm_redis_finish_query(dissocket);
redis_release_socket(inst,dissocket);
}
/*
- * Free the redis database
+ * Peform a redis query. Split into args and pass each one through xlat.
*/
-int rlm_redis_query(REDISSOCK *dissocket, REDIS_INST *inst, char *query)
+int rlm_redis_query(REDISSOCK *dissocket, REDIS_INST *inst, const char *query,
+ REQUEST *request)
{
+ int argc;
+ const char *argv[MAX_REDIS_ARGS];
+ char argv_buf[MAX_QUERY_LEN];
+
if (!query || !*query) {
return -1;
}
- DEBUG2("executing query %s", query);
- dissocket->reply = redisCommand(dissocket->conn, query);
+ argc = rad_expand_xlat(request, query, MAX_REDIS_ARGS, argv, 0,
+ sizeof(argv_buf), argv_buf);
+ if (argc <= 0)
+ return -1;
+
+ DEBUG2("executing %s ...", argv[0]);
+ dissocket->reply = redisCommandArgv(dissocket->conn, argc, argv, NULL);
if (dissocket->reply == NULL) {
radlog(L_ERR, "rlm_redis: (%s) REDIS error: %s",
REDISSOCK *(*redis_get_socket)(REDIS_INST * inst);
int (*redis_release_socket)(REDIS_INST * inst, REDISSOCK *dissocket);
- int (*redis_query)(REDISSOCK *dissocket, REDIS_INST *inst, char *query);
+ int (*redis_query)(REDISSOCK *dissocket, REDIS_INST *inst,
+ const char *query, REQUEST *request);
int (*redis_finish_query)(REDISSOCK *dissocket);
size_t (*redis_escape_func)(char *out, size_t outlen, const char *in);
} rlm_redis_t;
#define MAX_QUERY_LEN 4096
+#define MAX_REDIS_ARGS 16
-int rlm_redis_query(REDISSOCK *dissocket, REDIS_INST *inst, char *query);
+int rlm_redis_query(REDISSOCK *dissocket, REDIS_INST *inst, const char *query,
+ REQUEST *request);
int rlm_redis_finish_query(REDISSOCK *dissocket);
REDISSOCK * redis_get_socket(REDIS_INST * inst);
static int rediswho_command(const char *fmt, REDISSOCK *dissocket,
rlm_rediswho_t *data, REQUEST *request)
{
- char query[MAX_STRING_LEN * 4];
int result = 0;
- /*
- * Do an xlat on the provided string
- */
- if (request) {
- if (!radius_xlat(query, sizeof (query), fmt, request,
- data->redis_inst->redis_escape_func)) {
- radlog(L_ERR, "rediswho_command: xlat failed on: '%s'", query);
- return -1;
- }
-
- } else {
- strcpy(query, fmt);
- }
-
- if (data->redis_inst->redis_query(dissocket, data->redis_inst, query) < 0) {
+ if (data->redis_inst->redis_query(dissocket, data->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;
}