OK - rather than using -rdynamic, which as you rightly point out means
that we clobber some other parts of the namespace, here's a slightly
different approach, this time we look up the struct in the library and
then assign it's parts to that of the real config object at the point of
library load.
diff -rU4 onak-0.3.3/keydb_dynamic.c onak-dev/keydb_dynamic.c
--- onak-0.3.3/keydb_dynamic.c	2007-03-04 23:11:31.000000000 +0000
+++ onak-dev/keydb_dynamic.c	2007-08-14 08:43:55.518194786 +0100
@@ -33,8 +33,9 @@
 {
 	char *soname = NULL;
 	void *handle;
 	struct dynamic_backend *backend = get_backend();
+	struct onak_config *backend_config;
 
 	if (backend->loaded) {
 		close_backend();
 	}
@@ -97,11 +98,34 @@
 
 	backend->handle = handle;
 	backend->loaded = true;
 
+	backend_config = (struct onak_config *)dlsym(handle, "config");
+	if (backend_config != NULL) {
+		configure_backend(backend_config);
+	}
+
 	return true;
 }
 
+void configure_backend(struct onak_config *backend_config) {
+	/* Because we can't use -rdynamic and therefore use global symbols, we need
+	 * to use the symbol for the backends config variable and then assign the
+	 * real config values to it
+	 */
+	backend_config.maxkeys = config.maxkeys;
+	backend_config.thissite = config.thissite;
+	backend_config.adminemail = config.adminemail;
+	backend_config.mta = config.mta;
+	backend_config.syncsites = config.syncsites;
+	backend_config.logfile = config.logfile;
+	backend_config.db_dir = config.db_dir;
+	backend_config.pg_dbhost = config.pg_dbhost;
+	backend_config.pg_dbname = config.pg_dbname;
+	backend_config.pg_dbuser = config.pg_dbuser;
+	backend_config.pg_dbpass = config.pg_dbpass;
+}
+
 bool close_backend(void)
 {
 	struct dynamic_backend *backend;
 	backend = get_backend();
diff -rU4 onak-0.3.3/keydb_dynamic.h onak-dev/keydb_dynamic.h
--- onak-0.3.3/keydb_dynamic.h	2007-03-04 23:11:29.000000000 +0000
+++ onak-dev/keydb_dynamic.h	2007-08-14 08:16:23.920075573 +0100
@@ -88,8 +88,9 @@
 	0	/* loaded */
 };
 
 bool load_backend(void);
+void configure_backend(struct onak_config *);
 bool close_backend(void);
 bool backend_loaded(void);
 struct dynamic_backend *get_backend(void);
 

Attachment: signature.asc
Description: Digital signature

Reply via email to