load xauth module via dlopen()
authorAndreas Steffen <andreas.steffen@strongswan.org>
Fri, 5 Jan 2007 11:03:09 +0000 (11:03 -0000)
committerAndreas Steffen <andreas.steffen@strongswan.org>
Fri, 5 Jan 2007 11:03:09 +0000 (11:03 -0000)
src/pluto/keys.c
src/pluto/plutomain.c
src/pluto/xauth.c
src/pluto/xauth.h

index 7aea81f..eed8123 100644 (file)
@@ -683,14 +683,14 @@ xauth_defaults(void)
     if (xauth_module.get_secret == NULL)
     {
        DBG(DBG_CONTROL,
     if (xauth_module.get_secret == NULL)
     {
        DBG(DBG_CONTROL,
-           DBG_log("xauth_module: using default get_secret() function")
+           DBG_log("xauth module: using default get_secret() function")
        )
        xauth_module.get_secret = xauth_get_secret;
     }
     if (xauth_module.verify_secret == NULL)
     {
        DBG(DBG_CONTROL,
        )
        xauth_module.get_secret = xauth_get_secret;
     }
     if (xauth_module.verify_secret == NULL)
     {
        DBG(DBG_CONTROL,
-           DBG_log("xauth_module: using default verify_secret() function")
+           DBG_log("xauth module: using default verify_secret() function")
        )
        xauth_module.verify_secret = xauth_verify_secret;
     }
        )
        xauth_module.verify_secret = xauth_verify_secret;
     }
index 4a4f30a..f8cc75c 100644 (file)
@@ -599,7 +599,7 @@ main(int argc, char **argv)
     init_nat_traversal(nat_traversal, keep_alive, force_keepalive, nat_t_spf);
     init_virtual_ip(virtual_private);
     scx_init(pkcs11_module_path);   /* load and initialize PKCS #11 module */
     init_nat_traversal(nat_traversal, keep_alive, force_keepalive, nat_t_spf);
     init_virtual_ip(virtual_private);
     scx_init(pkcs11_module_path);   /* load and initialize PKCS #11 module */
-    xauth_init();                  /* load and initialize XAUTH module */
+    xauth_init();                  /* load and initialize XAUTH module */
     init_rnd_pool();
     init_secret();
     init_states();
     init_rnd_pool();
     init_secret();
     init_states();
index e44ac4e..1947609 100644 (file)
  * RCSID $Id: xauth.c,v 1.1 2005/01/06 22:10:15 as Exp $
  */
 
  * RCSID $Id: xauth.c,v 1.1 2005/01/06 22:10:15 as Exp $
  */
 
+#include <dlfcn.h>
+
 #include <freeswan.h>
 
 #include "constants.h"
 #include "defs.h"
 #include "xauth.h"
 #include "keys.h"
 #include <freeswan.h>
 
 #include "constants.h"
 #include "defs.h"
 #include "xauth.h"
 #include "keys.h"
+#include "log.h"
 
 void 
 xauth_init(void)
 {
 
 void 
 xauth_init(void)
 {
-    /* TODO: locate and load dynamic XAUTH module */
+#ifdef XAUTH_DEFAULT_LIB
+    xauth_module.handle = dlopen(XAUTH_DEFAULT_LIB, RTLD_NOW);
+
+    if (xauth_module.handle != NULL)
+    {
+       DBG(DBG_CONTROL,
+           DBG_log("xauth module '%s' loading'", XAUTH_DEFAULT_LIB)
+       )
+       xauth_module.get_secret = (bool (*) (const xauth_t*))
+                       dlsym(xauth_module.handle, "get_secret");
+       DBG(DBG_CONTROL,
+           if (xauth_module.get_secret != NULL)
+           {
+               DBG_log("xauth module: found get_secret() function");
+           }
+       )
+       xauth_module.verify_secret = (bool (*) (const xauth_t*))
+                       dlsym(xauth_module.handle, "verify_secret");
+       DBG(DBG_CONTROL,
+           if (xauth_module.verify_secret != NULL)
+           {
+               DBG_log("xauth module: found verify_secret() function");
+           }
+       )
+    }
+#endif
+    /* any null function pointers will be filled in by default functions */
     xauth_defaults();
 }
 
 void
 xauth_finalize(void)
 {
     xauth_defaults();
 }
 
 void
 xauth_finalize(void)
 {
-    /* TODO: unload dynamic XAUTH module */
+    if (xauth_module.handle != NULL)
+    {
+       if (dlclose(xauth_module.handle))
+       {
+           plog("failed to unload xauth module");
+       }
+       else
+       {
+           DBG(DBG_CONTROL,
+               DBG_log("xauth module unloaded")
+           )
+       }
+    }
 }
 }
index f60d1d0..f86cbb1 100644 (file)
@@ -28,6 +28,7 @@ typedef struct {
 } xauth_t;
 
 typedef struct {
 } xauth_t;
 
 typedef struct {
+    void *handle;
     bool (*get_secret) (const xauth_t *xauth_secret);
     bool (*verify_secret) (const xauth_t *xauth_secret);
 } xauth_module_t;
     bool (*get_secret) (const xauth_t *xauth_secret);
     bool (*verify_secret) (const xauth_t *xauth_secret);
 } xauth_module_t;