From: Arran Cudbard-Bell Date: Tue, 17 Jul 2012 10:23:43 +0000 (+0100) Subject: Allow query functions to modify the sqlsocket pointer of the calling function (needed... X-Git-Tag: release_3_0_0_beta0~127^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9d55f7d8616c91aea4b601a12154bc202a6b5f9d;p=thirdparty%2Ffreeradius-server.git Allow query functions to modify the sqlsocket pointer of the calling function (needed for reconnecting) --- diff --git a/src/modules/rlm_sql/rlm_sql.c b/src/modules/rlm_sql/rlm_sql.c index 36a67bfdd42..7605969c9ca 100644 --- a/src/modules/rlm_sql/rlm_sql.c +++ b/src/modules/rlm_sql/rlm_sql.c @@ -183,7 +183,7 @@ static int sql_xlat(void *instance, REQUEST *request, int numaffected; char buffer[21]; /* 64bit max is 20 decimal chars + null byte */ - if (rlm_sql_query(sqlsocket,inst,querystr)) { + if (rlm_sql_query(&sqlsocket,inst,querystr)) { radlog(L_ERR, "rlm_sql (%s): database query error, %s: %s", inst->config->xlat_name, querystr, (inst->module->sql_error)(sqlsocket, @@ -225,7 +225,7 @@ static int sql_xlat(void *instance, REQUEST *request, return ret; } /* else it's a SELECT statement */ - if (rlm_sql_select_query(sqlsocket,inst,querystr)){ + if (rlm_sql_select_query(&sqlsocket,inst,querystr)){ radlog(L_ERR, "rlm_sql (%s): database query error, %s: %s", inst->config->xlat_name,querystr, (inst->module->sql_error)(sqlsocket, inst->config)); @@ -233,7 +233,7 @@ static int sql_xlat(void *instance, REQUEST *request, return 0; } - ret = rlm_sql_fetch_row(sqlsocket, inst); + ret = rlm_sql_fetch_row(&sqlsocket, inst); if (ret) { RDEBUG("SQL query did not succeed"); @@ -294,7 +294,7 @@ static int generate_sql_clients(SQL_INST *inst) sqlsocket = sql_get_socket(inst); if (sqlsocket == NULL) return -1; - if (rlm_sql_select_query(sqlsocket,inst,querystr)){ + if (rlm_sql_select_query(&sqlsocket,inst,querystr)){ radlog(L_ERR, "rlm_sql (%s): database query error, %s: %s", inst->config->xlat_name,querystr, (inst->module->sql_error)(sqlsocket, inst->config)); @@ -302,7 +302,7 @@ static int generate_sql_clients(SQL_INST *inst) return -1; } - while(rlm_sql_fetch_row(sqlsocket, inst) == 0) { + while(rlm_sql_fetch_row(&sqlsocket, inst) == 0) { i++; row = sqlsocket->row; if (row == NULL) @@ -543,14 +543,14 @@ static int sql_get_grouplist (SQL_INST *inst, SQLSOCK *sqlsocket, REQUEST *reque return -1; } - if (rlm_sql_select_query(sqlsocket, inst, querystr) < 0) { + if (rlm_sql_select_query(&sqlsocket, inst, querystr) < 0) { radlog_request(L_ERR, 0, request, "database query error, %s: %s", querystr, (inst->module->sql_error)(sqlsocket,inst->config)); return -1; } - while (rlm_sql_fetch_row(sqlsocket, inst) == 0) { + while (rlm_sql_fetch_row(&sqlsocket, inst) == 0) { row = sqlsocket->row; if (row == NULL) break; @@ -700,7 +700,7 @@ static int rlm_sql_process_groups(SQL_INST *inst, REQUEST *request, SQLSOCK *sql sql_grouplist_free(&group_list); return -1; } - rows = sql_getvpdata(inst, sqlsocket, &check_tmp, querystr); + rows = sql_getvpdata(inst, &sqlsocket, &check_tmp, querystr); if (rows < 0) { radlog_request(L_ERR, 0, request, "Error retrieving check pairs for group %s", group_list_tmp->groupname); @@ -728,7 +728,7 @@ static int rlm_sql_process_groups(SQL_INST *inst, REQUEST *request, SQLSOCK *sql sql_grouplist_free(&group_list); return -1; } - if (sql_getvpdata(inst, sqlsocket, &reply_tmp, querystr) < 0) { + if (sql_getvpdata(inst, &sqlsocket, &reply_tmp, querystr) < 0) { radlog_request(L_ERR, 0, request, "Error retrieving reply pairs for group %s", group_list_tmp->groupname); /* Remove the grouup we added above */ @@ -763,7 +763,7 @@ static int rlm_sql_process_groups(SQL_INST *inst, REQUEST *request, SQLSOCK *sql sql_grouplist_free(&group_list); return -1; } - if (sql_getvpdata(inst, sqlsocket, &reply_tmp, querystr) < 0) { + if (sql_getvpdata(inst, &sqlsocket, &reply_tmp, querystr) < 0) { radlog_request(L_ERR, 0, request, "Error retrieving reply pairs for group %s", group_list_tmp->groupname); /* Remove the grouup we added above */ @@ -1035,7 +1035,7 @@ static int rlm_sql_authorize(void *instance, REQUEST * request) pairdelete(&request->packet->vps, PW_SQL_USER_NAME, 0); return RLM_MODULE_FAIL; } - rows = sql_getvpdata(inst, sqlsocket, &check_tmp, querystr); + rows = sql_getvpdata(inst, &sqlsocket, &check_tmp, querystr); if (rows < 0) { radlog_request(L_ERR, 0, request, "SQL query error; rejecting user"); sql_release_socket(inst, sqlsocket); @@ -1065,7 +1065,7 @@ static int rlm_sql_authorize(void *instance, REQUEST * request) pairfree(&check_tmp); return RLM_MODULE_FAIL; } - if (sql_getvpdata(inst, sqlsocket, &reply_tmp, querystr) < 0) { + if (sql_getvpdata(inst, &sqlsocket, &reply_tmp, querystr) < 0) { radlog_request(L_ERR, 0, request, "SQL query error; rejecting user"); sql_release_socket(inst, sqlsocket); /* Remove the username we (maybe) added above */ @@ -1210,7 +1210,7 @@ static int rlm_sql_accounting(void *instance, REQUEST * request) { if (sqlsocket == NULL) return(RLM_MODULE_FAIL); if (*querystr) { /* non-empty query */ - if (rlm_sql_query(sqlsocket, inst, querystr)) { + if (rlm_sql_query(&sqlsocket, inst, querystr)) { radlog_request(L_ERR, 0, request, "Couldn't update SQL accounting for Acct On/Off packet - %s", (inst->module->sql_error)(sqlsocket, inst->config)); ret = RLM_MODULE_FAIL; @@ -1241,7 +1241,7 @@ static int rlm_sql_accounting(void *instance, REQUEST * request) { if (sqlsocket == NULL) return(RLM_MODULE_FAIL); if (*querystr) { /* non-empty query */ - if (rlm_sql_query(sqlsocket, inst, querystr)) { + if (rlm_sql_query(&sqlsocket, inst, querystr)) { radlog_request(L_ERR, 0, request, "Couldn't update SQL accounting ALIVE record - %s", (inst->module->sql_error)(sqlsocket, inst->config)); ret = RLM_MODULE_FAIL; @@ -1259,7 +1259,7 @@ static int rlm_sql_accounting(void *instance, REQUEST * request) { radius_xlat(querystr, sizeof(querystr), inst->config->accounting_update_query_alt, request, sql_escape_func); query_log(request, inst, querystr); if (*querystr) { /* non-empty query */ - if (rlm_sql_query(sqlsocket, inst, querystr)) { + if (rlm_sql_query(&sqlsocket, inst, querystr)) { radlog_request(L_ERR, 0, request, "Couldn't insert SQL accounting ALIVE record - %s", (inst->module->sql_error)(sqlsocket, inst->config)); ret = RLM_MODULE_FAIL; @@ -1293,7 +1293,7 @@ static int rlm_sql_accounting(void *instance, REQUEST * request) { if (sqlsocket == NULL) return(RLM_MODULE_FAIL); if (*querystr) { /* non-empty query */ - if (rlm_sql_query(sqlsocket, inst, querystr)) { + if (rlm_sql_query(&sqlsocket, inst, querystr)) { radlog_request(L_ERR, 0, request, "Couldn't insert SQL accounting START record - %s", (inst->module->sql_error)(sqlsocket, inst->config)); @@ -1306,7 +1306,7 @@ static int rlm_sql_accounting(void *instance, REQUEST * request) { query_log(request, inst, querystr); if (*querystr) { /* non-empty query */ - if (rlm_sql_query(sqlsocket, inst, querystr)) { + if (rlm_sql_query(&sqlsocket, inst, querystr)) { radlog_request(L_ERR, 0, request, "Couldn't update SQL accounting START record - %s", (inst->module->sql_error)(sqlsocket, inst->config)); ret = RLM_MODULE_FAIL; @@ -1339,7 +1339,7 @@ static int rlm_sql_accounting(void *instance, REQUEST * request) { if (sqlsocket == NULL) return(RLM_MODULE_FAIL); if (*querystr) { /* non-empty query */ - if (rlm_sql_query(sqlsocket, inst, querystr)) { + if (rlm_sql_query(&sqlsocket, inst, querystr)) { radlog_request(L_ERR, 0, request, "Couldn't update SQL accounting STOP record - %s", (inst->module->sql_error)(sqlsocket, inst->config)); ret = RLM_MODULE_FAIL; @@ -1375,7 +1375,7 @@ static int rlm_sql_accounting(void *instance, REQUEST * request) { query_log(request, inst, querystr); if (*querystr) { /* non-empty query */ - if (rlm_sql_query(sqlsocket, inst, querystr)) { + if (rlm_sql_query(&sqlsocket, inst, querystr)) { radlog_request(L_ERR, 0, request, "Couldn't insert SQL accounting STOP record - %s", (inst->module->sql_error)(sqlsocket, inst->config)); @@ -1457,13 +1457,13 @@ static int rlm_sql_checksimul(void *instance, REQUEST * request) { if(sqlsocket == NULL) return RLM_MODULE_FAIL; - if(rlm_sql_select_query(sqlsocket, inst, querystr)) { + if(rlm_sql_select_query(&sqlsocket, inst, querystr)) { radlog(L_ERR, "rlm_sql (%s) sql_checksimul: Database query failed", inst->config->xlat_name); sql_release_socket(inst, sqlsocket); return RLM_MODULE_FAIL; } - ret = rlm_sql_fetch_row(sqlsocket, inst); + ret = rlm_sql_fetch_row(&sqlsocket, inst); if (ret != 0) { (inst->module->sql_finish_select_query)(sqlsocket, inst->config); @@ -1497,7 +1497,7 @@ static int rlm_sql_checksimul(void *instance, REQUEST * request) { } radius_xlat(querystr, sizeof(querystr), inst->config->simul_verify_query, request, sql_escape_func); - if(rlm_sql_select_query(sqlsocket, inst, querystr)) { + if(rlm_sql_select_query(&sqlsocket, inst, querystr)) { radlog_request(L_ERR, 0, request, "Database query error"); sql_release_socket(inst, sqlsocket); return RLM_MODULE_FAIL; @@ -1514,7 +1514,7 @@ static int rlm_sql_checksimul(void *instance, REQUEST * request) { call_num = vp->vp_strvalue; - while (rlm_sql_fetch_row(sqlsocket, inst) == 0) { + while (rlm_sql_fetch_row(&sqlsocket, inst) == 0) { row = sqlsocket->row; if (row == NULL) break; @@ -1631,7 +1631,7 @@ static int rlm_sql_postauth(void *instance, REQUEST *request) { return RLM_MODULE_FAIL; /* Process the query */ - if (rlm_sql_query(sqlsocket, inst, querystr)) { + if (rlm_sql_query(&sqlsocket, inst, querystr)) { radlog(L_ERR, "rlm_sql (%s) in sql_postauth: Database query error - %s", inst->config->xlat_name, (inst->module->sql_error)(sqlsocket, inst->config)); diff --git a/src/modules/rlm_sql/rlm_sql.h b/src/modules/rlm_sql/rlm_sql.h index 251fd2ad36e..db375a07c5c 100644 --- a/src/modules/rlm_sql/rlm_sql.h +++ b/src/modules/rlm_sql/rlm_sql.h @@ -61,9 +61,9 @@ struct sql_inst { SQLSOCK *(*sql_get_socket)(SQL_INST * inst); int (*sql_release_socket)(SQL_INST * inst, SQLSOCK * sqlsocket); size_t (*sql_escape_func)(char *out, size_t outlen, const char *in); - int (*sql_query)(SQLSOCK *sqlsocket, SQL_INST *inst, char *query); - int (*sql_select_query)(SQLSOCK *sqlsocket, SQL_INST *inst, char *query); - int (*sql_fetch_row)(SQLSOCK *sqlsocket, SQL_INST *inst); + int (*sql_query)(SQLSOCK **sqlsocket, SQL_INST *inst, char *query); + int (*sql_select_query)(SQLSOCK **sqlsocket, SQL_INST *inst, char *query); + int (*sql_fetch_row)(SQLSOCK **sqlsocket, SQL_INST *inst); }; typedef struct sql_grouplist { @@ -79,13 +79,13 @@ SQLSOCK *sql_get_socket(SQL_INST * inst); int sql_release_socket(SQL_INST * inst, SQLSOCK * sqlsocket); int sql_userparse(VALUE_PAIR ** first_pair, SQL_ROW row); int sql_read_realms(SQLSOCK * sqlsocket); -int sql_getvpdata(SQL_INST * inst, SQLSOCK * sqlsocket, VALUE_PAIR **pair, char *query); +int sql_getvpdata(SQL_INST * inst, SQLSOCK ** sqlsocket, VALUE_PAIR **pair, char *query); int sql_read_naslist(SQLSOCK * sqlsocket); int sql_read_clients(SQLSOCK * sqlsocket); int sql_dict_init(SQLSOCK * sqlsocket); void query_log(REQUEST *request, SQL_INST * inst, char *querystr); -int rlm_sql_select_query(SQLSOCK *sqlsocket, SQL_INST *inst, char *query); -int rlm_sql_query(SQLSOCK *sqlsocket, SQL_INST *inst, char *query); -int rlm_sql_fetch_row(SQLSOCK *sqlsocket, SQL_INST *inst); +int rlm_sql_select_query(SQLSOCK **sqlsocket, SQL_INST *inst, char *query); +int rlm_sql_query(SQLSOCK **sqlsocket, SQL_INST *inst, char *query); +int rlm_sql_fetch_row(SQLSOCK **sqlsocket, SQL_INST *inst); int sql_set_user(SQL_INST *inst, REQUEST *request, char *sqlusername, const char *username); #endif diff --git a/src/modules/rlm_sql/sql.c b/src/modules/rlm_sql/sql.c index e7d3d3f3812..b323e9603dc 100644 --- a/src/modules/rlm_sql/sql.c +++ b/src/modules/rlm_sql/sql.c @@ -249,22 +249,22 @@ int sql_userparse(VALUE_PAIR ** first_pair, SQL_ROW row) * Purpose: call the module's sql_fetch_row and implement re-connect * *************************************************************************/ -int rlm_sql_fetch_row(SQLSOCK *sqlsocket, SQL_INST *inst) +int rlm_sql_fetch_row(SQLSOCK **sqlsocket, SQL_INST *inst) { int ret; - if (sqlsocket->conn) { - ret = (inst->module->sql_fetch_row)(sqlsocket, inst->config); + if ((*sqlsocket)->conn) { + ret = (inst->module->sql_fetch_row)(*sqlsocket, inst->config); } else { ret = SQL_DOWN; } if (ret == SQL_DOWN) { - sqlsocket = fr_connection_reconnect(inst->pool, sqlsocket); - if (!sqlsocket) return -1; + *sqlsocket = fr_connection_reconnect(inst->pool, *sqlsocket); + if (!*sqlsocket) return -1; /* retry the query on the newly connected socket */ - ret = (inst->module->sql_fetch_row)(sqlsocket, inst->config); + ret = (inst->module->sql_fetch_row)(*sqlsocket, inst->config); if (ret) { radlog(L_ERR, "rlm_sql (%s): failed after re-connect", @@ -283,7 +283,7 @@ int rlm_sql_fetch_row(SQLSOCK *sqlsocket, SQL_INST *inst) * Purpose: call the module's sql_query and implement re-connect * *************************************************************************/ -int rlm_sql_query(SQLSOCK *sqlsocket, SQL_INST *inst, char *query) +int rlm_sql_query(SQLSOCK **sqlsocket, SQL_INST *inst, char *query) { int ret; @@ -294,18 +294,18 @@ int rlm_sql_query(SQLSOCK *sqlsocket, SQL_INST *inst, char *query) return -1; } - if (sqlsocket->conn) { - ret = (inst->module->sql_query)(sqlsocket, inst->config, query); + if ((*sqlsocket)->conn) { + ret = (inst->module->sql_query)(*sqlsocket, inst->config, query); } else { ret = SQL_DOWN; } if (ret == SQL_DOWN) { - sqlsocket = fr_connection_reconnect(inst->pool, sqlsocket); - if (!sqlsocket) return -1; + *sqlsocket = fr_connection_reconnect(inst->pool, *sqlsocket); + if (!*sqlsocket) return -1; /* retry the query on the newly connected socket */ - ret = (inst->module->sql_query)(sqlsocket, inst->config, query); + ret = (inst->module->sql_query)(*sqlsocket, inst->config, query); if (ret) { radlog(L_ERR, "rlm_sql (%s): failed after re-connect", @@ -324,7 +324,7 @@ int rlm_sql_query(SQLSOCK *sqlsocket, SQL_INST *inst, char *query) * Purpose: call the module's sql_select_query and implement re-connect * *************************************************************************/ -int rlm_sql_select_query(SQLSOCK *sqlsocket, SQL_INST *inst, char *query) +int rlm_sql_select_query(SQLSOCK **sqlsocket, SQL_INST *inst, char *query) { int ret; @@ -335,19 +335,19 @@ int rlm_sql_select_query(SQLSOCK *sqlsocket, SQL_INST *inst, char *query) return -1; } - if (sqlsocket->conn) { - ret = (inst->module->sql_select_query)(sqlsocket, inst->config, + if ((*sqlsocket)->conn) { + ret = (inst->module->sql_select_query)(*sqlsocket, inst->config, query); } else { ret = SQL_DOWN; } if (ret == SQL_DOWN) { - sqlsocket = fr_connection_reconnect(inst->pool, sqlsocket); - if (!sqlsocket) return -1; + *sqlsocket = fr_connection_reconnect(inst->pool, *sqlsocket); + if (!*sqlsocket) return -1; /* retry the query on the newly connected socket */ - ret = (inst->module->sql_select_query)(sqlsocket, inst->config, query); + ret = (inst->module->sql_select_query)(*sqlsocket, inst->config, query); if (ret) { radlog(L_ERR, "rlm_sql (%s): failed after re-connect", @@ -367,7 +367,7 @@ int rlm_sql_select_query(SQLSOCK *sqlsocket, SQL_INST *inst, char *query) * Purpose: Get any group check or reply pairs * *************************************************************************/ -int sql_getvpdata(SQL_INST * inst, SQLSOCK * sqlsocket, VALUE_PAIR **pair, char *query) +int sql_getvpdata(SQL_INST * inst, SQLSOCK **sqlsocket, VALUE_PAIR **pair, char *query) { SQL_ROW row; int rows = 0; @@ -376,18 +376,18 @@ int sql_getvpdata(SQL_INST * inst, SQLSOCK * sqlsocket, VALUE_PAIR **pair, char radlog(L_ERR, "rlm_sql_getvpdata: database query error"); return -1; } - while (rlm_sql_fetch_row(sqlsocket, inst)==0) { - row = sqlsocket->row; + while (rlm_sql_fetch_row(sqlsocket, inst) == 0) { + row = (*sqlsocket)->row; if (!row) break; if (sql_userparse(pair, row) != 0) { radlog(L_ERR | L_CONS, "rlm_sql (%s): Error getting data from database", inst->config->xlat_name); - (inst->module->sql_finish_select_query)(sqlsocket, inst->config); + (inst->module->sql_finish_select_query)(*sqlsocket, inst->config); return -1; } rows++; } - (inst->module->sql_finish_select_query)(sqlsocket, inst->config); + (inst->module->sql_finish_select_query)(*sqlsocket, inst->config); return rows; }