From: Arran Cudbard-Bell Date: Wed, 6 Mar 2013 04:39:27 +0000 (-0500) Subject: Add instantiate method for rlm_sql drivers X-Git-Tag: release_3_0_0_beta1~830 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5f8994c31602b519ad5b86b8ea858434a2f2ac01;p=thirdparty%2Ffreeradius-server.git Add instantiate method for rlm_sql drivers --- diff --git a/src/modules/rlm_sql/drivers/rlm_sql_db2/rlm_sql_db2.c b/src/modules/rlm_sql/drivers/rlm_sql_db2/rlm_sql_db2.c index ecc7428a464..21fe7bd7a6a 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_db2/rlm_sql_db2.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_db2/rlm_sql_db2.c @@ -340,6 +340,7 @@ not_implemented(UNUSED rlm_sql_handle_t * handle, UNUSED rlm_sql_config_t *confi /* Exported to rlm_sql */ rlm_sql_module_t rlm_sql_db2 = { "rlm_sql_db2", + NULL, sql_init_socket, sql_destroy_socket, /* sql_destroy_socket*/ sql_query, diff --git a/src/modules/rlm_sql/drivers/rlm_sql_firebird/rlm_sql_firebird.c b/src/modules/rlm_sql/drivers/rlm_sql_firebird/rlm_sql_firebird.c index 80275f970b9..06fdcf66ad4 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_firebird/rlm_sql_firebird.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_firebird/rlm_sql_firebird.c @@ -276,6 +276,7 @@ static int sql_affected_rows(rlm_sql_handle_t *handle, rlm_sql_config_t *config) /* Exported to rlm_sql */ rlm_sql_module_t rlm_sql_firebird = { "rlm_sql_firebird", + NULL, sql_init_socket, sql_destroy_socket, sql_query, diff --git a/src/modules/rlm_sql/drivers/rlm_sql_freetds/rlm_sql_freetds.c b/src/modules/rlm_sql/drivers/rlm_sql_freetds/rlm_sql_freetds.c index 3ee233b7e1b..7ae4163fee9 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_freetds/rlm_sql_freetds.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_freetds/rlm_sql_freetds.c @@ -343,6 +343,7 @@ static int sql_affected_rows(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t * /* Exported to rlm_sql */ rlm_sql_module_t rlm_sql_freetds = { "rlm_sql_freetds", + NULL, sql_init_socket, sql_destroy_socket, sql_query, diff --git a/src/modules/rlm_sql/drivers/rlm_sql_iodbc/rlm_sql_iodbc.c b/src/modules/rlm_sql/drivers/rlm_sql_iodbc/rlm_sql_iodbc.c index 04b86de9479..a73167105a3 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_iodbc/rlm_sql_iodbc.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_iodbc/rlm_sql_iodbc.c @@ -395,6 +395,7 @@ static int sql_affected_rows(rlm_sql_handle_t *handle, UNUSED rlm_sql_config_t * /* Exported to rlm_sql */ rlm_sql_module_t rlm_sql_iodbc = { "rlm_sql_iodbc", + NULL, sql_init_socket, sql_destroy_socket, sql_query, diff --git a/src/modules/rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c b/src/modules/rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c index 8e4e27513c0..98bc069a1f8 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c @@ -517,6 +517,7 @@ static int sql_affected_rows(rlm_sql_handle_t * handle, UNUSED rlm_sql_config_t /* Exported to rlm_sql */ rlm_sql_module_t rlm_sql_mysql = { "rlm_sql_mysql", + NULL, sql_init_socket, sql_destroy_socket, sql_query, diff --git a/src/modules/rlm_sql/drivers/rlm_sql_null/rlm_sql_null.c b/src/modules/rlm_sql/drivers/rlm_sql_null/rlm_sql_null.c index dc792ce58d4..cc0cb35d341 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_null/rlm_sql_null.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_null/rlm_sql_null.c @@ -235,6 +235,7 @@ static int sql_affected_rows(UNUSED rlm_sql_handle_t * handle, UNUSED rlm_sql_co /* Exported to rlm_sql */ rlm_sql_module_t rlm_sql_null = { "rlm_sql_null", + NULL, sql_init_socket, sql_destroy_socket, sql_query, diff --git a/src/modules/rlm_sql/drivers/rlm_sql_oracle/rlm_sql_oracle.c b/src/modules/rlm_sql/drivers/rlm_sql_oracle/rlm_sql_oracle.c index 96933328a7e..5001cef447a 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_oracle/rlm_sql_oracle.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_oracle/rlm_sql_oracle.c @@ -623,6 +623,7 @@ static int sql_affected_rows(rlm_sql_handle_t *handle, rlm_sql_config_t *config) /* Exported to rlm_sql */ rlm_sql_module_t rlm_sql_oracle = { "rlm_sql_oracle", + NULL, sql_init_socket, sql_destroy_socket, sql_query, diff --git a/src/modules/rlm_sql/drivers/rlm_sql_postgresql/rlm_sql_postgresql.c b/src/modules/rlm_sql/drivers/rlm_sql_postgresql/rlm_sql_postgresql.c index 9c4b8187c3b..72df9096d0e 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_postgresql/rlm_sql_postgresql.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_postgresql/rlm_sql_postgresql.c @@ -526,6 +526,7 @@ not_implemented(UNUSED rlm_sql_handle_t * handle, UNUSED rlm_sql_config_t *confi /* Exported to rlm_sql */ rlm_sql_module_t rlm_sql_postgresql = { "rlm_sql_postgresql", + NULL, sql_init_socket, sql_destroy_socket, sql_query, diff --git a/src/modules/rlm_sql/drivers/rlm_sql_sqlite/rlm_sql_sqlite.c b/src/modules/rlm_sql/drivers/rlm_sql_sqlite/rlm_sql_sqlite.c index e493fdc5aa2..55f40e0c437 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_sqlite/rlm_sql_sqlite.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_sqlite/rlm_sql_sqlite.c @@ -37,6 +37,16 @@ typedef struct rlm_sql_conn { int col_count; } rlm_sql_conn_t; +typedef struct rlm_sql_sqlite_config { + const char *filename; +} rlm_sql_sqlite_config_t; + +static const CONF_PARSER driver_config[] = { + {"filename", PW_TYPE_STRING_PTR, + offsetof(rlm_sql_sqlite_config_t, filename), NULL, NULL}, + + {NULL, -1, 0, NULL, NULL} +}; static int sql_check_error(sqlite3 *db) { @@ -70,12 +80,31 @@ static int sql_check_error(sqlite3 *db) */ default: radlog(L_ERR, "rlm_sql_sqlite: Handle is unusable, SQLite " - "error (%d): %s", error, sqlite3_errmsg(db)); + "error (%d): %s", error, sqlite3_errmsg(db)); return SQL_DOWN; break; } } +static int sql_instantiate(CONF_SECTION *conf, rlm_sql_config_t *config) +{ + rlm_sql_sqlite_config_t *driver; + + MEM(driver = config->driver = talloc_zero(config, rlm_sql_sqlite_config_t)); + + if (cf_section_parse(conf, driver, driver_config) < 0) { + return -1; + } + + if (!driver->filename) { + MEM(driver->filename = talloc_asprintf(driver, "%s/%s", + radius_dir, + config->sql_db)); + } + + return 0; +} + /************************************************************************* * * Function: sql_create_socket @@ -86,26 +115,19 @@ static int sql_check_error(sqlite3 *db) static int sql_init_socket(rlm_sql_handle_t *handle, rlm_sql_config_t *config) { rlm_sql_conn_t *conn; + rlm_sql_sqlite_config_t *driver = config->driver; + int status; - const char *filename; - char buffer[2048]; if (!conn) { - MEM(handle->conn = talloc_zero(NULL, rlm_sql_conn)); + MEM(handle->conn = talloc_zero(NULL, rlm_sql_conn_t)); } conn = handle->conn; + + DEBUG("rlm_sql_sqlite: Opening SQLite database %s", driver->filename); - filename = config->sql_file; - if (!filename) { - snprintf(buffer, sizeof(buffer), "%s/sqlite_radius_client_database", - radius_dir); - filename = buffer; - } - - DEBUG("rlm_sql_sqlite: Opening SQLite database %s", filename); - - status = sqlite3_open(filename, &(conn->db)); + status = sqlite3_open(driver->filename, &(conn->db)); if (status != SQLITE_OK) { return sql_check_error(conn->db); } diff --git a/src/modules/rlm_sql/drivers/rlm_sql_sybase/rlm_sql_sybase.c b/src/modules/rlm_sql/drivers/rlm_sql_sybase/rlm_sql_sybase.c index cb03bccae39..282cf151479 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_sybase/rlm_sql_sybase.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_sybase/rlm_sql_sybase.c @@ -904,6 +904,7 @@ static int sql_affected_rows(rlm_sql_handle_t *handle, rlm_sql_config_t *config) /* Exported to rlm_sql */ rlm_sql_module_t rlm_sql_sybase = { "rlm_sql_sybase", + NULL, sql_init_socket, sql_destroy_socket, sql_query, diff --git a/src/modules/rlm_sql/drivers/rlm_sql_unixodbc/rlm_sql_unixodbc.c b/src/modules/rlm_sql/drivers/rlm_sql_unixodbc/rlm_sql_unixodbc.c index 1c2ba8c1f63..93c47b69fcc 100644 --- a/src/modules/rlm_sql/drivers/rlm_sql_unixodbc/rlm_sql_unixodbc.c +++ b/src/modules/rlm_sql/drivers/rlm_sql_unixodbc/rlm_sql_unixodbc.c @@ -452,6 +452,7 @@ static int sql_affected_rows(rlm_sql_handle_t *handle, rlm_sql_config_t *config) /* Exported to rlm_sql */ rlm_sql_module_t rlm_sql_unixodbc = { "rlm_sql_unixodbc", + NULL, sql_init_socket, sql_destroy_socket, sql_query, diff --git a/src/modules/rlm_sql/rlm_sql.c b/src/modules/rlm_sql/rlm_sql.c index 6dd6c196d58..bd7239cfbf1 100644 --- a/src/modules/rlm_sql/rlm_sql.c +++ b/src/modules/rlm_sql/rlm_sql.c @@ -48,7 +48,7 @@ static const CONF_PARSER acct_section_config[] = { static const CONF_PARSER module_config[] = { {"driver", PW_TYPE_STRING_PTR, - offsetof(rlm_sql_config_t,sql_driver), NULL, "mysql"}, + offsetof(rlm_sql_config_t,sql_driver_name), NULL, "mysql"}, {"server", PW_TYPE_STRING_PTR, offsetof(rlm_sql_config_t,sql_server), NULL, "localhost"}, {"port", PW_TYPE_STRING_PTR, @@ -59,8 +59,6 @@ static const CONF_PARSER module_config[] = { offsetof(rlm_sql_config_t,sql_password), NULL, ""}, {"radius_db", PW_TYPE_STRING_PTR, offsetof(rlm_sql_config_t,sql_db), NULL, "radius"}, - {"filename", PW_TYPE_FILENAME, /* for sqlite */ - offsetof(rlm_sql_config_t,sql_file), NULL, NULL}, {"read_groups", PW_TYPE_BOOLEAN, offsetof(rlm_sql_config_t,read_groups), NULL, "yes"}, {"readclients", PW_TYPE_BOOLEAN, @@ -824,8 +822,10 @@ static int rlm_sql_instantiate(CONF_SECTION *conf, void **instance) * more efficient about creating SQL-User-Name attributes. */ inst->sql_user = dict_attrbyname("SQL-User-Name"); - if (!inst->sql_user) return -1; - + if (!inst->sql_user) { + return -1; + } + /* * Export these methods, too. This avoids RTDL_GLOBAL. */ @@ -905,19 +905,19 @@ static int rlm_sql_instantiate(CONF_SECTION *conf, void **instance) /* * Sanity check for crazy people. */ - if (strncmp(inst->config->sql_driver, "rlm_sql_", 8) != 0) { + if (strncmp(inst->config->sql_driver_name, "rlm_sql_", 8) != 0) { radlog(L_ERR, "rlm_sql (%s): \"%s\" is NOT an SQL driver!", - inst->config->xlat_name, inst->config->sql_driver); + inst->config->xlat_name, inst->config->sql_driver_name); return -1; } /* * Load the appropriate driver for our database */ - inst->handle = lt_dlopenext(inst->config->sql_driver); + inst->handle = lt_dlopenext(inst->config->sql_driver_name); if (inst->handle == NULL) { radlog(L_ERR, "Could not link driver %s: %s", - inst->config->sql_driver, + inst->config->sql_driver_name, lt_dlerror()); radlog(L_ERR, "Make sure it (and all its dependent libraries!)" "are in the search path of your system's ld."); @@ -925,16 +925,25 @@ static int rlm_sql_instantiate(CONF_SECTION *conf, void **instance) } inst->module = (rlm_sql_module_t *) lt_dlsym(inst->handle, - inst->config->sql_driver); + inst->config->sql_driver_name); if (!inst->module) { radlog(L_ERR, "Could not link symbol %s: %s", - inst->config->sql_driver, + inst->config->sql_driver_name, lt_dlerror()); return -1; } + + if (inst->module->sql_instantiate) { + /* + * It's up to the driver to register a destructor + */ + if (inst->module->sql_instantiate(cf_section_sub_find(conf, inst->config->sql_driver_name), inst->config) < 0) { + return -1; + } + } radlog(L_INFO, "rlm_sql (%s): Driver %s (module %s) loaded and linked", - inst->config->xlat_name, inst->config->sql_driver, + inst->config->xlat_name, inst->config->sql_driver_name, inst->module->name); /* diff --git a/src/modules/rlm_sql/rlm_sql.h b/src/modules/rlm_sql/rlm_sql.h index 7fb39c54936..479d18aaf70 100644 --- a/src/modules/rlm_sql/rlm_sql.h +++ b/src/modules/rlm_sql/rlm_sql.h @@ -36,7 +36,7 @@ typedef struct sql_acct_section { typedef struct sql_config { const char *xlat_name; - const char *sql_driver; + const char *sql_driver_name; const char *sql_server; const char *sql_port; const char *sql_login; @@ -64,14 +64,18 @@ typedef struct sql_config { int const deletestalesessions; const char *allowed_chars; int const query_timeout; - void *localcfg; /*individual driver config */ + + void *driver; //!< Where drivers should write a + //!< pointer to their configurations. /* - *TODO: The rest of the queries should also be moved into their own - *sections. + * @todo The rest of the queries should also be moved into + * their own sections. */ - /*Section configurations */ + /* + * Section configurations + */ sql_acct_section_t *postauth; sql_acct_section_t *accounting; } rlm_sql_config_t; @@ -86,7 +90,8 @@ typedef struct rlm_sql_handle { typedef struct rlm_sql_module_t { const char *name; - + + int (*sql_instantiate)(CONF_SECTION *conf, rlm_sql_config_t *config); int (*sql_init_socket)(rlm_sql_handle_t *handle, rlm_sql_config_t *config); int (*sql_destroy_socket)(rlm_sql_handle_t *handle, rlm_sql_config_t *config); int (*sql_query)(rlm_sql_handle_t *handle, rlm_sql_config_t *config, char *query);