]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Add instantiate method for rlm_sql drivers
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 6 Mar 2013 04:39:27 +0000 (23:39 -0500)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 6 Mar 2013 04:39:27 +0000 (23:39 -0500)
13 files changed:
src/modules/rlm_sql/drivers/rlm_sql_db2/rlm_sql_db2.c
src/modules/rlm_sql/drivers/rlm_sql_firebird/rlm_sql_firebird.c
src/modules/rlm_sql/drivers/rlm_sql_freetds/rlm_sql_freetds.c
src/modules/rlm_sql/drivers/rlm_sql_iodbc/rlm_sql_iodbc.c
src/modules/rlm_sql/drivers/rlm_sql_mysql/rlm_sql_mysql.c
src/modules/rlm_sql/drivers/rlm_sql_null/rlm_sql_null.c
src/modules/rlm_sql/drivers/rlm_sql_oracle/rlm_sql_oracle.c
src/modules/rlm_sql/drivers/rlm_sql_postgresql/rlm_sql_postgresql.c
src/modules/rlm_sql/drivers/rlm_sql_sqlite/rlm_sql_sqlite.c
src/modules/rlm_sql/drivers/rlm_sql_sybase/rlm_sql_sybase.c
src/modules/rlm_sql/drivers/rlm_sql_unixodbc/rlm_sql_unixodbc.c
src/modules/rlm_sql/rlm_sql.c
src/modules/rlm_sql/rlm_sql.h

index ecc7428a4641e0bfc2fc37cb7201c869bbf70c14..21fe7bd7a6af811de13c46673e15aea8c399b9a3 100644 (file)
@@ -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,
index 80275f970b905b0c255988b5b56e73af6f032394..06fdcf66ad47aa3815baf362513d394e7b18cf99 100644 (file)
@@ -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,
index 3ee233b7e1b3b738289575767b75722cd60133c6..7ae4163fee933e7512dd85d80b1556ea71128995 100644 (file)
@@ -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,
index 04b86de94794a439abe94cfaaa215bb13aa27312..a73167105a3563979c93fa46e7425f2deb81d93e 100644 (file)
@@ -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,
index 8e4e27513c0cc21a49dacabc762c4156fe3d9b87..98bc069a1f838bdf91aadd9287d951d0d68e830b 100644 (file)
@@ -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,
index dc792ce58d4c94b77f7f89124664d0e8d258d78f..cc0cb35d34106ceccdda0774c67609fdca2ec2ad 100644 (file)
@@ -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,
index 96933328a7e3ef669a8efdd2b7ceb684219b7610..5001cef447ac775fb1a248d22689d885899f7607 100644 (file)
@@ -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,
index 9c4b8187c3b9dc2e7ea9397a613427e84c79a02e..72df9096d0ec7897b45be9d2c1e387aec6cdbb67 100644 (file)
@@ -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,
index e493fdc5aa2b57cca3d043d9465b769f1c4bf7d0..55f40e0c43765217fc470b0e1e5d0f0e0285c410 100644 (file)
@@ -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);
        }
index cb03bccae3992a95ec61872466be701ce94ba440..282cf151479c4b732b9db2b3bdf46a1ae9bcfb2e 100644 (file)
@@ -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,
index 1c2ba8c1f633aef207b9c016a5eb4d60dd3275eb..93c47b69fcc8defa63b6accbae6e811cd0ec5a74 100644 (file)
@@ -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,
index 6dd6c196d583428b4daf82e876d9b4975cb438ee..bd7239cfbf1f994acca612bf4b3a63c8b5f5652e 100644 (file)
@@ -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);
 
        /*
index 7fb39c549362471ac4609d3eab90faef98d53464..479d18aaf705ed14516483cbe1aa82e9d39c1048 100644 (file)
@@ -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);