diff options
-rw-r--r-- | src/include/k5-plugin.h | 30 | ||||
-rw-r--r-- | src/lib/krb5/os/locate_kdc.c | 9 | ||||
-rw-r--r-- | src/util/support/plugins.c | 70 |
3 files changed, 63 insertions, 46 deletions
diff --git a/src/include/k5-plugin.h b/src/include/k5-plugin.h index 0e3daa4f52..c7fb1776ca 100644 --- a/src/include/k5-plugin.h +++ b/src/include/k5-plugin.h @@ -60,6 +60,8 @@ # include <inttypes.h> #endif +#include "k5-err.h" + struct plugin_file_handle; /* opaque */ struct plugin_dir_handle { @@ -69,24 +71,30 @@ struct plugin_dir_handle { #define PLUGIN_DIR_INIT(P) ((P)->files = NULL) #define PLUGIN_DIR_OPEN(P) ((P)->files != NULL) -int32_t KRB5_CALLCONV -krb5int_open_plugin (const char *, struct plugin_file_handle **); +long KRB5_CALLCONV +krb5int_open_plugin (const char *, struct plugin_file_handle **, + struct errinfo *); -int32_t KRB5_CALLCONV -krb5int_get_plugin_data (struct plugin_file_handle *, const char *, void **); +long KRB5_CALLCONV +krb5int_get_plugin_data (struct plugin_file_handle *, const char *, void **, + struct errinfo *); -int32_t KRB5_CALLCONV +long KRB5_CALLCONV krb5int_get_plugin_func (struct plugin_file_handle *, const char *, - void (**)()); + void (**)(), struct errinfo *); void KRB5_CALLCONV krb5int_close_plugin (struct plugin_file_handle *); -int32_t KRB5_CALLCONV krb5int_open_plugin_dir (const char *, struct plugin_dir_handle *); +long KRB5_CALLCONV krb5int_open_plugin_dir (const char *, + struct plugin_dir_handle *, + struct errinfo *); void KRB5_CALLCONV krb5int_close_plugin_dir (struct plugin_dir_handle *); void KRB5_CALLCONV krb5int_free_plugin_dir_data (void **); -int32_t KRB5_CALLCONV krb5int_get_plugin_dir_data (struct plugin_dir_handle *, - const char *, void ***); +long KRB5_CALLCONV krb5int_get_plugin_dir_data (struct plugin_dir_handle *, + const char *, void ***, + struct errinfo *); void KRB5_CALLCONV krb5int_free_plugin_dir_func (void (**)(void)); -int32_t KRB5_CALLCONV krb5int_get_plugin_dir_func (struct plugin_dir_handle *, - const char *, void (***)(void)); +long KRB5_CALLCONV krb5int_get_plugin_dir_func (struct plugin_dir_handle *, + const char *, void (***)(void), + struct errinfo *); diff --git a/src/lib/krb5/os/locate_kdc.c b/src/lib/krb5/os/locate_kdc.c index 47ac0eebe7..83b0066340 100644 --- a/src/lib/krb5/os/locate_kdc.c +++ b/src/lib/krb5/os/locate_kdc.c @@ -612,14 +612,17 @@ module_locate_server (krb5_context ctx, const krb5_data *realm, Tprintf("in module_locate_server\n"); cbdata.lp = addrlist; if (!PLUGIN_DIR_OPEN (&ctx->libkrb5_plugins)) { - code = krb5int_open_plugin_dir (objdir, &ctx->libkrb5_plugins); + code = krb5int_open_plugin_dir (objdir, &ctx->libkrb5_plugins, + &ctx->err); if (code) return KRB5_PLUGIN_NO_HANDLE; } - code = krb5int_get_plugin_dir_data (&ctx->libkrb5_plugins, "service_locator", &ptrs); + code = krb5int_get_plugin_dir_data (&ctx->libkrb5_plugins, + "service_locator", &ptrs, &ctx->err); if (code) { - Tprintf("error looking up plugin symbols: %s\n", error_message(code)); + Tprintf("error looking up plugin symbols: %s\n", + krb5_get_error_message(ctx, code)); return KRB5_PLUGIN_NO_HANDLE; } diff --git a/src/util/support/plugins.c b/src/util/support/plugins.c index 76e33ae3c1..d134da4bbb 100644 --- a/src/util/support/plugins.c +++ b/src/util/support/plugins.c @@ -72,21 +72,22 @@ struct plugin_file_handle { #endif }; -int32_t KRB5_CALLCONV -krb5int_open_plugin (const char *filename, struct plugin_file_handle **h) +long KRB5_CALLCONV +krb5int_open_plugin (const char *filename, struct plugin_file_handle **h, + struct errinfo *ep) { - int32_t err = 0; + long err = 0; struct stat statbuf; struct plugin_file_handle *htmp = NULL; int got_plugin = 0; - + if (!err) { if (stat (filename, &statbuf) < 0) { Tprintf ("stat(%s): %s\n", filename, strerror (errno)); err = errno; } } - + if (!err) { htmp = calloc (1, sizeof (*htmp)); /* calloc initializes ptrs to NULL */ if (htmp == NULL) { err = errno; } @@ -95,16 +96,17 @@ krb5int_open_plugin (const char *filename, struct plugin_file_handle **h) #if USE_DLOPEN if (!err && (statbuf.st_mode & S_IFMT) == S_IFREG) { void *handle = NULL; - + if (!err) { handle = dlopen(filename, RTLD_NOW | RTLD_GLOBAL); if (handle == NULL) { - const char *e = dlerror(); /* XXX copy and save away */ + const char *e = dlerror(); Tprintf ("dlopen(%s): %s\n", filename, e); err = ENOENT; /* XXX */ + krb5int_set_error (ep, err, "%s", e); } } - + if (!err) { got_plugin = 1; htmp->dlhandle = handle; @@ -114,13 +116,13 @@ krb5int_open_plugin (const char *filename, struct plugin_file_handle **h) if (handle != NULL) { dlclose (handle); } } #endif - + #if USE_CFBUNDLE if (!err && (statbuf.st_mode & S_IFMT) == S_IFDIR) { CFStringRef pluginPath = NULL; CFURLRef pluginURL = NULL; CFBundleRef pluginBundle = NULL; - + if (!err) { pluginPath = CFStringCreateWithCString (kCFAllocatorDefault, filename, kCFStringEncodingASCII); @@ -171,11 +173,12 @@ krb5int_open_plugin (const char *filename, struct plugin_file_handle **h) return err; } -static int32_t +static long krb5int_get_plugin_sym (struct plugin_file_handle *h, - const char *csymname, int isfunc, void **ptr) + const char *csymname, int isfunc, void **ptr, + struct errinfo *ep) { - int32_t err = 0; + long err = 0; void *sym = NULL; #if USE_DLOPEN @@ -187,6 +190,7 @@ krb5int_get_plugin_sym (struct plugin_file_handle *h, const char *e = dlerror (); /* XXX copy and save away */ Tprintf ("dlsym(%s): %s\n", csymname, e); err = ENOENT; /* XXX */ + krb5int_set_error(ep, err, "%s", e); } } #endif @@ -225,19 +229,19 @@ krb5int_get_plugin_sym (struct plugin_file_handle *h, return err; } -int32_t KRB5_CALLCONV +long KRB5_CALLCONV krb5int_get_plugin_data (struct plugin_file_handle *h, const char *csymname, - void **ptr) + void **ptr, struct errinfo *ep) { - return krb5int_get_plugin_sym (h, csymname, 0, ptr); + return krb5int_get_plugin_sym (h, csymname, 0, ptr, ep); } -int32_t KRB5_CALLCONV +long KRB5_CALLCONV krb5int_get_plugin_func (struct plugin_file_handle *h, const char *csymname, - void (**ptr)()) + void (**ptr)(), struct errinfo *ep) { void *dptr = NULL; - int32_t err = krb5int_get_plugin_sym (h, csymname, 1, &dptr); + long err = krb5int_get_plugin_sym (h, csymname, 1, &dptr, ep); if (!err) { /* Cast function pointers to avoid code duplication */ *ptr = (void (*)()) dptr; @@ -283,16 +287,16 @@ krb5int_close_plugin (struct plugin_file_handle *h) (strerror (ERR)) #endif -int32_t KRB5_CALLCONV +long KRB5_CALLCONV krb5int_open_plugin_dir (const char *dirname, - struct plugin_dir_handle *dirhandle) + struct plugin_dir_handle *dirhandle, + struct errinfo *ep) { - int32_t err = 0; + long err = 0; DIR *dir = NULL; struct dirent *d = NULL; struct plugin_file_handle **h = NULL; int count = 0; - char errbuf[1024]; if (!err) { h = calloc (1, sizeof (*h)); /* calloc initializes to NULL */ @@ -331,7 +335,7 @@ krb5int_open_plugin_dir (const char *dirname, } if (!err) { - if (krb5int_open_plugin (path, &handle) == 0) { + if (krb5int_open_plugin (path, &handle, ep) == 0) { struct plugin_file_handle **newh = NULL; count++; @@ -392,12 +396,13 @@ krb5int_free_plugin_dir_data (void **ptrs) free(ptrs); } -int32_t KRB5_CALLCONV +long KRB5_CALLCONV krb5int_get_plugin_dir_data (struct plugin_dir_handle *dirhandle, const char *symname, - void ***ptrs) + void ***ptrs, + struct errinfo *ep) { - int32_t err = 0; + long err = 0; void **p = NULL; int count = 0; @@ -417,7 +422,7 @@ krb5int_get_plugin_dir_data (struct plugin_dir_handle *dirhandle, for (i = 0; !err && (dirhandle->files[i] != NULL); i++) { void *sym = NULL; - if (krb5int_get_plugin_data (dirhandle->files[i], symname, &sym) == 0) { + if (krb5int_get_plugin_data (dirhandle->files[i], symname, &sym, ep) == 0) { void **newp = NULL; count++; @@ -450,12 +455,13 @@ krb5int_free_plugin_dir_func (void (**ptrs)(void)) free(ptrs); } -int32_t KRB5_CALLCONV +long KRB5_CALLCONV krb5int_get_plugin_dir_func (struct plugin_dir_handle *dirhandle, const char *symname, - void (***ptrs)(void)) + void (***ptrs)(void), + struct errinfo *ep) { - int32_t err = 0; + long err = 0; void (**p)() = NULL; int count = 0; @@ -475,7 +481,7 @@ krb5int_get_plugin_dir_func (struct plugin_dir_handle *dirhandle, for (i = 0; !err && (dirhandle->files[i] != NULL); i++) { void (*sym)() = NULL; - if (krb5int_get_plugin_func (dirhandle->files[i], symname, &sym) == 0) { + if (krb5int_get_plugin_func (dirhandle->files[i], symname, &sym, ep) == 0) { void (**newp)() = NULL; count++; |