93 lines
2.4 KiB
C
93 lines
2.4 KiB
C
/*
|
|
*/
|
|
|
|
#include "krb5_locl.h"
|
|
#ifdef HAVE_DLFCN_H
|
|
#include <dlfcn.h>
|
|
#endif
|
|
#include <assert.h>
|
|
|
|
static HEIMDAL_MUTEX lsacc_mutex = HEIMDAL_MUTEX_INITIALIZER;
|
|
const krb5_cc_ops * lsacc_ops = NULL;
|
|
|
|
static void *lsacc_handle;
|
|
|
|
krb5_error_code
|
|
_krb5_mslsa_register_cc_ops(krb5_context context, krb5_boolean override)
|
|
{
|
|
const char *lib = NULL;
|
|
|
|
HEIMDAL_MUTEX_lock(&lsacc_mutex);
|
|
if (lsacc_ops) {
|
|
HEIMDAL_MUTEX_unlock(&lsacc_mutex);
|
|
if (context) {
|
|
krb5_clear_error_message(context);
|
|
krb5_cc_register(context, lsacc_ops, override);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
if (context)
|
|
lib = krb5_config_get_string(context, NULL,
|
|
"libdefaults", "mslsa_library",
|
|
NULL);
|
|
if (lib == NULL) {
|
|
lib = "%{LIBDIR}/mslsa_cc.dll";
|
|
}
|
|
|
|
{
|
|
char * explib = NULL;
|
|
if (_krb5_expand_path_tokens(context, lib, &explib) == 0) {
|
|
lsacc_handle = dlopen(explib, RTLD_LAZY|RTLD_LOCAL);
|
|
free(explib);
|
|
}
|
|
}
|
|
|
|
if (lsacc_handle == NULL) {
|
|
HEIMDAL_MUTEX_unlock(&lsacc_mutex);
|
|
if (context)
|
|
krb5_set_error_message(context, KRB5_CC_NOSUPP,
|
|
N_("Failed to load MSLSA cache module %s", "file"),
|
|
lib);
|
|
return KRB5_CC_NOSUPP;
|
|
}
|
|
|
|
{
|
|
krb5_error_code ret = 0;
|
|
krb5_error_code (KRB5_CALLCONV *lsacc_get_ops)(const krb5_cc_ops ** ops);
|
|
|
|
lsacc_get_ops = (krb5_error_code (KRB5_CALLCONV *)(const krb5_cc_ops **))
|
|
dlsym(lsacc_handle, "lsacc_get_ops");
|
|
|
|
if (lsacc_get_ops) {
|
|
ret = (*lsacc_get_ops)(&lsacc_ops);
|
|
}
|
|
|
|
HEIMDAL_MUTEX_unlock(&lsacc_mutex);
|
|
|
|
if (ret != 0) {
|
|
if (context)
|
|
krb5_set_error_message(context, KRB5_CC_NOSUPP,
|
|
N_("LSA cache initialization failed (%d)",
|
|
"error"), ret);
|
|
dlclose(lsacc_handle);
|
|
return KRB5_CC_NOSUPP;
|
|
}
|
|
|
|
if (lsacc_get_ops == NULL) {
|
|
if (context)
|
|
krb5_set_error_message(context, KRB5_CC_NOSUPP,
|
|
N_("Failed to find lsacc_get_ops"
|
|
"in %s: %s", "file, error"), lib, dlerror());
|
|
dlclose(lsacc_handle);
|
|
return KRB5_CC_NOSUPP;
|
|
}
|
|
}
|
|
|
|
assert(lsacc_ops != NULL);
|
|
|
|
if (context)
|
|
return krb5_cc_register(context, lsacc_ops, override);
|
|
return 0;
|
|
}
|