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;
 }

Attachment: pgpm1R8UowsZy.pgp
Description: PGP signature

Reply via email to