Change kdb plugin code to use the new plugin support instead of
authorKen Raeburn <raeburn@mit.edu>
Tue, 25 Apr 2006 07:21:19 +0000 (07:21 +0000)
committerKen Raeburn <raeburn@mit.edu>
Tue, 25 Apr 2006 07:21:19 +0000 (07:21 +0000)
directly calling dlopen and friends.  Change the test config files to
refer to "db2.so" instead of "db2".

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@17961 dc483132-0cff-0310-8789-dd5450dbe970

src/kadmin/testing/proto/krb5.conf.proto
src/lib/kdb/kdb5.c
src/lib/kdb/kdb5.h
src/tests/dejagnu/config/default.exp

index 9fe7ec1245ba96a55a1542620c3a2f40c4b10728..981a58c15b5ca9561331fcdc1456b31475c37fcb 100644 (file)
@@ -25,6 +25,6 @@
 [dbmodules]
        db_module_dir = __MODDIR__
        foobar_db2_module_blah = {
-               db_library = db2
+               db_library = db2.so
                database_name = __K5ROOT__/kdb5
        }
index e80259f9fa924be916e46f9a0e890b1d3c67e3d3..66de71a9644f58d8a0d80c88452814433d46c1b2 100644 (file)
  * or implied warranty.
  */
 
-/*This code was based on code donated to MIT by Novell for distribution under the MIT license.*/
+/*
+ * This code was based on code donated to MIT by Novell for
+ * distribution under the MIT license.
+ */
 
 /* 
  * Include files
@@ -30,7 +33,6 @@
 
 #include <stdio.h>
 #include <string.h>
-#include <dlfcn.h>
 #include <k5-int.h>
 #include <osconf.h>
 #include "kdb5.h"
@@ -352,13 +354,15 @@ kdb_load_library(krb5_context kcontext, char *lib_name, db_library * lib)
     status = 0;
 
     for (ndx = 0; path[ndx]; ndx++) {
-       sprintf(dl_name, "%s/%s.so", path[ndx], lib_name);
-       (*lib)->dl_handle = dlopen(dl_name, RTLD_NOW);
-       if ((*lib)->dl_handle) {
+       sprintf(dl_name, "%s/%s", path[ndx], lib_name);
+       status = krb5int_open_plugin (dl_name, &(*lib)->dl_handle,
+                                     &kcontext->err);
+       if (status == 0) {
            /* found the module */
-           dlerror();
-           vftabl_addr = dlsym((*lib)->dl_handle, "kdb_function_table");
-           if (vftabl_addr) {
+           status = krb5int_get_plugin_data((*lib)->dl_handle,
+                                            "kdb_function_table",
+                                            &vftabl_addr, &kcontext->err);
+           if (status == 0) {
                memcpy(&(*lib)->vftabl, vftabl_addr, sizeof(kdb_vftabl));
 
                kdb_setup_opt_functions(*lib);
@@ -366,28 +370,29 @@ kdb_load_library(krb5_context kcontext, char *lib_name, db_library * lib)
                if ((status = (*lib)->vftabl.init_library())) {
                    /* ERROR. library not initialized cleanly */
                    goto clean_n_exit;
-
                }
            } else {
-               err_str = dlerror();
-               if(err_str == NULL)
-                   err_str = "";
+               const char *emsg = krb5_get_error_message (kcontext, status);
                status = KRB5_KDB_DBTYPE_INIT;
-               krb5_set_error_message (kcontext, status, "%s", err_str);
+               krb5_set_error_message (kcontext, status,
+                                       "plugin symbol 'kdb_function_table' lookup failed: %s",
+                                       dl_name, emsg);
+               krb5_free_error_message (kcontext, emsg);
                goto clean_n_exit;
            }
            break;
        } else {
-           /* set the error. Later if we find everything fine.. we will reset this */
-           err_str = dlerror();
-/*         fprintf(stderr, "Error loading library %s\n", t); */
+           err_str = krb5_get_error_message(kcontext, status);
        }
     }
 
     if (!(*lib)->dl_handle) {
        /* library not found in the given list. Error str is already set */
        status = KRB5_KDB_DBTYPE_NOTFOUND;
-       krb5_set_error_message (kcontext, status, "%s", err_str);
+       krb5_set_error_message (kcontext, status,
+                               _("Unable to find requested database type: %s"),
+                               err_str);
+       krb5_free_error_message (kcontext, err_str);
        goto clean_n_exit;
     }
 
@@ -399,7 +404,7 @@ kdb_load_library(krb5_context kcontext, char *lib_name, db_library * lib)
        if (*lib) {
            kdb_destroy_lib_lock(*lib);
            if ((*lib)->dl_handle) {
-               dlclose((*lib)->dl_handle);
+               krb5int_close_plugin((*lib)->dl_handle);
            }
            free(*lib);
            *lib = NULL;
@@ -480,7 +485,7 @@ kdb_free_library(db_library lib)
 
        /* close the library */
        if (lib->dl_handle) {
-           dlclose(lib->dl_handle);
+           krb5int_close_plugin(lib->dl_handle);
        }
 
        kdb_destroy_lib_lock(lib);
index 112875c3032bd75f6200d758d8cb608d8fc5da25..a522ac686d1ad9f09e5af7691bd48e5bd50d2cb5 100644 (file)
@@ -181,7 +181,7 @@ typedef struct _kdb_vftabl{
 typedef struct _db_library {
     char name[KDB_MAX_DB_NAME];
     int reference_cnt;
-    void *dl_handle;
+    struct plugin_file_handle *dl_handle;
     kdb_vftabl vftabl;
     struct _db_library *next, *prev;
 } *db_library;
index 7f964a3415295713beae5eedcaee443cf0d09da0..603673830a2c565c46431f063a8c3461063529d6 100644 (file)
@@ -941,7 +941,7 @@ proc setup_krb5_conf { {type client} } {
        puts $conffile "\[dbmodules\]"
        puts $conffile "        db_module_dir = $tmppwd/../../../util/fakedest$KRB5_DB_MODULE_DIR"
        puts $conffile "        foo_db2 = {"
-       puts $conffile "                db_library = db2"
+       puts $conffile "                db_library = db2.so"
        puts $conffile "                database_name = $tmppwd/db"
        puts $conffile "        }"
        close $conffile