On Fri, Nov 16, 2007 at 11:17:09AM +0000, Stephen Gran wrote: > On Fri, Nov 16, 2007 at 04:52:14PM +1100, Paul TBBle Hampson said: >> Stephen, >> >> Just a quick query, hows the progress coming on this bug? >> >> I've gotten caught behind it myself, and have a weekeend basically >> dedicated to trying to fix it, so to avoid any duplication of effort, >> is there already any work done towards this I should know about?
> Mark and I have come to the conclusion that this should be solvable by > making rlm_sqlipool.so explicitly link to rlm_sql.so and any other > libraries it needs, instead of relying on symbol visibilty to magically > relocate a symbol for it. That should be a fairly simple patch to the > build system, but it also raises the specter of going over all the > modules and making sure that the linkages are correct. I tried to do this simply by adding $(topdir)/src/modules/lib/rlm_sql.la to RLM_LIBS in rlm_sqlippool's Makefile.in, but when libtool sees something on its command line in link mode that looks like a library, it splits it into -L dir -llib, where lib is derived by removing .la from the end and lib from the front (and doesn't catch the situation where there _is_ no lib on the front), hence gcc ends up with -lrlm_sql which barfs looking for librlm_sql to link against. Instead, I just indirected all the non-instance methods of rlm_sql used by rlm_sqlippool via the configuration data structure. This seems to be working fine for me so far, but I've a fairly simple setup here (ie. only one rlm_sql instance and one rlm_sqlippool instance) Patch as inline attachment, I hope. -- Paul "TBBle" Hampson, [EMAIL PROTECTED] Shorter .sig for a more eco-friendly paperless office.
#! /bin/sh /usr/share/dpatch/dpatch-run
## 10-rejig-sqlippool-using-lt-dlsym.dpatch by Paul "TBBle" Hampson <[EMAIL
PROTECTED]>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: Make rlm_sqlippool access functions needed from rlm_sql via lt_dlsym'd
pointers
## DP: as rlm_sql's symbols are not globally visible to rlm_sqlippool.
## DP: Non-visibility seems to be Debian-specific, but patch should be safe to
use upstream.
@DPATCH@
diff -urNad freeradius-1.1.7~/src/modules/rlm_sqlippool/rlm_sqlippool.c
freeradius-1.1.7/src/modules/rlm_sqlippool/rlm_sqlippool.c
--- freeradius-1.1.7~/src/modules/rlm_sqlippool/rlm_sqlippool.c 2007-07-18
04:46:32.000000000 +1000
+++ freeradius-1.1.7/src/modules/rlm_sqlippool/rlm_sqlippool.c 2007-11-17
23:56:36.000000000 +1100
@@ -96,6 +96,14 @@
char *off_clear; /* SQL query to clear an entire NAS */
char *off_commit; /* SQL query to commit */
char *off_rollback; /* SQL query to rollback */
+
+ /* Function pointers from rlm_sql */
+ SQLSOCK *(*sql_get_socket)(SQL_INST * inst);
+ int (*sql_release_socket)(SQL_INST * inst, SQLSOCK * sqlsocket);
+ 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);
#ifdef HAVE_PTHREAD_H
pthread_mutex_t dlock;
@@ -287,7 +295,7 @@
if (request) {
char sqlusername[MAX_STRING_LEN];
- if(sql_set_user(data->sql_inst, request, sqlusername, NULL) <
0) {
+ if(data->sql_set_user(data->sql_inst, request, sqlusername,
NULL) < 0) {
return RLM_MODULE_FAIL;
}
@@ -303,7 +311,7 @@
#if 0
DEBUG2("sqlippool_command: '%s'", query);
#endif
- if (rlm_sql_query(sqlsocket, data->sql_inst, query)){
+ if (data->rlm_sql_query(sqlsocket, data->sql_inst, query)){
radlog(L_ERR, "sqlippool_command: database query error");
return 0;
}
@@ -331,7 +339,7 @@
if (request) {
char sqlusername[MAX_STRING_LEN];
- if(sql_set_user(data->sql_inst, request, sqlusername, NULL) <
0) {
+ if(data->sql_set_user(data->sql_inst, request, sqlusername,
NULL) < 0) {
return RLM_MODULE_FAIL;
}
@@ -348,13 +356,13 @@
#if 0
DEBUG2("sqlippool_query1: '%s'", query);
#endif
- if (rlm_sql_select_query(sqlsocket, data->sql_inst, query)){
+ if (data->rlm_sql_select_query(sqlsocket, data->sql_inst, query)){
radlog(L_ERR, "sqlippool_query1: database query error");
out[0] = '\0';
return 0;
}
- r = rlm_sql_fetch_row(sqlsocket, data->sql_inst);
+ r = data->rlm_sql_fetch_row(sqlsocket, data->sql_inst);
(data->sql_inst->module->sql_finish_select_query)(sqlsocket,
data->sql_inst->config);
if (r) {
@@ -396,7 +404,7 @@
SQLSOCK * sqlsocket;
- sqlsocket = sql_get_socket(data->sql_inst);
+ sqlsocket = data->sql_get_socket(data->sql_inst);
if (sqlsocket == NULL) {
DEBUG("rlm_sqlippool: cannot allocate sql connection for
initialization sequence");
return 0;
@@ -499,12 +507,56 @@
else
data->pool_name = strdup("ippool");
- if ( !(data->sql_inst = (SQL_INST *)
(find_module_instance(data->sql_instance_name))->insthandle) )
+ module_instance_t * our_sql_instance;
+ if ( !(our_sql_instance = find_module_instance(data->sql_instance_name)
) )
{
radlog(L_ERR, "sqlippool_instantiate: failed to find sql
instance named %s", data->sql_instance_name);
free(data);
exit(0);
}
+ data->sql_inst = (SQL_INST *) our_sql_instance->insthandle;
+
+ if( !(data->sql_get_socket = lt_dlsym( our_sql_instance->entry->handle,
"sql_get_socket" ) ) )
+ {
+ radlog(L_ERR, "sqlippool_instantiate: failed to find method
sql_get_socket in sql module");
+ free(data);
+ exit(0);
+ }
+
+ if( !(data->sql_release_socket = lt_dlsym(
our_sql_instance->entry->handle, "sql_release_socket" ) ) )
+ {
+ radlog(L_ERR, "sqlippool_instantiate: failed to find method
sql_release_socket in sql module");
+ free(data);
+ exit(0);
+ }
+
+ if( !(data->rlm_sql_select_query = lt_dlsym(
our_sql_instance->entry->handle, "rlm_sql_select_query" ) ) )
+ {
+ radlog(L_ERR, "sqlippool_instantiate: failed to find method
rlm_sql_select_query in sql module");
+ free(data);
+ exit(0);
+ }
+
+ if( !(data->rlm_sql_query = lt_dlsym( our_sql_instance->entry->handle,
"rlm_sql_query" ) ) )
+ {
+ radlog(L_ERR, "sqlippool_instantiate: failed to find method
rlm_sql_query in sql module");
+ free(data);
+ exit(0);
+ }
+
+ if( !(data->rlm_sql_fetch_row = lt_dlsym(
our_sql_instance->entry->handle, "rlm_sql_fetch_row" ) ) )
+ {
+ radlog(L_ERR, "sqlippool_instantiate: failed to find method
rlm_sql_fetch_row in sql module");
+ free(data);
+ exit(0);
+ }
+
+ if( !(data->sql_set_user = lt_dlsym( our_sql_instance->entry->handle,
"sql_set_user" ) ) )
+ {
+ radlog(L_ERR, "sqlippool_instantiate: failed to find method
sql_set_user in sql module");
+ free(data);
+ exit(0);
+ }
sqlippool_initialize_sql(data);
pthread_mutex_init(&data->dlock, NULL);
@@ -554,7 +606,7 @@
return RLM_MODULE_NOOP;
}
- sqlsocket = sql_get_socket(data->sql_inst);
+ sqlsocket = data->sql_get_socket(data->sql_inst);
if (sqlsocket == NULL) {
DEBUG("rlm_sqlippool: cannot allocate sql connection");
return RLM_MODULE_NOOP;
@@ -589,7 +641,7 @@
(char *) NULL, 0);
DEBUG("rlm_sqlippool: IP number could not be allocated.");
- sql_release_socket(data->sql_inst, sqlsocket);
+ data->sql_release_socket(data->sql_inst, sqlsocket);
return RLM_MODULE_NOTFOUND;
}
@@ -603,7 +655,7 @@
(char *) NULL, 0);
DEBUG("rlm_sqlippool: Invalid IP number [%s] returned from
database query.", allocation);
- sql_release_socket(data->sql_inst, sqlsocket);
+ data->sql_release_socket(data->sql_inst, sqlsocket);
return RLM_MODULE_NOOP;
}
@@ -617,7 +669,7 @@
if ((vp = paircreate(PW_FRAMED_IP_ADDRESS, PW_TYPE_IPADDR)) == NULL) {
radlog(L_ERR|L_CONS, "no memory");
- sql_release_socket(data->sql_inst, sqlsocket);
+ data->sql_release_socket(data->sql_inst, sqlsocket);
return RLM_MODULE_NOOP;
}
vp->lvalue = ip_allocation;
@@ -629,7 +681,7 @@
sqlippool_command(data->allocate_commit, sqlsocket, instance, request,
(char *) NULL, 0);
- sql_release_socket(data->sql_inst, sqlsocket);
+ data->sql_release_socket(data->sql_inst, sqlsocket);
return RLM_MODULE_OK;
}
@@ -648,7 +700,7 @@
return RLM_MODULE_NOOP;
}
- sqlsocket = sql_get_socket(data->sql_inst);
+ sqlsocket = data->sql_get_socket(data->sql_inst);
if (sqlsocket == NULL) {
DEBUG("rlm_sqlippool: cannot allocate sql connection");
return RLM_MODULE_NOOP;
@@ -672,7 +724,7 @@
sqlippool_command(data->start_commit, sqlsocket, instance, request,
(char *) NULL, 0);
- sql_release_socket(data->sql_inst, sqlsocket);
+ data->sql_release_socket(data->sql_inst, sqlsocket);
return RLM_MODULE_OK;
}
@@ -692,7 +744,7 @@
return RLM_MODULE_NOOP;
}
- sqlsocket = sql_get_socket(data->sql_inst);
+ sqlsocket = data->sql_get_socket(data->sql_inst);
if (sqlsocket == NULL) {
DEBUG("rlm_sqlippool: cannot allocate sql connection");
return RLM_MODULE_NOOP;
@@ -716,7 +768,7 @@
sqlippool_command(data->alive_commit, sqlsocket, instance, request,
(char *) NULL, 0);
- sql_release_socket(data->sql_inst, sqlsocket);
+ data->sql_release_socket(data->sql_inst, sqlsocket);
return RLM_MODULE_OK;
}
@@ -736,7 +788,7 @@
return RLM_MODULE_NOOP;
}
- sqlsocket = sql_get_socket(data->sql_inst);
+ sqlsocket = data->sql_get_socket(data->sql_inst);
if (sqlsocket == NULL) {
DEBUG("rlm_sqlippool: cannot allocate sql connection");
return RLM_MODULE_NOOP;
@@ -760,7 +812,7 @@
sqlippool_command(data->stop_commit, sqlsocket, instance, request,
(char *) NULL, 0);
- sql_release_socket(data->sql_inst, sqlsocket);
+ data->sql_release_socket(data->sql_inst, sqlsocket);
return RLM_MODULE_OK;
}
@@ -775,7 +827,7 @@
return RLM_MODULE_NOOP;
}
- sqlsocket = sql_get_socket(data->sql_inst);
+ sqlsocket = data->sql_get_socket(data->sql_inst);
if (sqlsocket == NULL) {
DEBUG("rlm_sqlippool: cannot allocate sql connection");
return RLM_MODULE_NOOP;
@@ -799,7 +851,7 @@
sqlippool_command(data->on_commit, sqlsocket, instance, request,
(char *) NULL, 0);
- sql_release_socket(data->sql_inst, sqlsocket);
+ data->sql_release_socket(data->sql_inst, sqlsocket);
return RLM_MODULE_OK;
}
@@ -814,7 +866,7 @@
return RLM_MODULE_NOOP;
}
- sqlsocket = sql_get_socket(data->sql_inst);
+ sqlsocket = data->sql_get_socket(data->sql_inst);
if (sqlsocket == NULL) {
DEBUG("rlm_sqlippool: cannot allocate sql connection");
return RLM_MODULE_NOOP;
@@ -838,7 +890,7 @@
sqlippool_command(data->off_commit, sqlsocket, instance, request,
(char *) NULL, 0);
- sql_release_socket(data->sql_inst, sqlsocket);
+ data->sql_release_socket(data->sql_inst, sqlsocket);
return RLM_MODULE_OK;
}
pgpm1R8UowsZy.pgp
Description: PGP signature

