#include <new>
/* lazy initialisation */
-#ifdef WIN32
-static volatile OM_uint32 gssEapAttrProvidersInitStatus = GSS_S_UNAVAILABLE;
-#else
static GSSEAP_THREAD_ONCE gssEapAttrProvidersInitOnce = GSSEAP_ONCE_INITIALIZER;
static OM_uint32 gssEapAttrProvidersInitStatus = GSS_S_UNAVAILABLE;
-#endif
GSSEAP_ONCE_CALLBACK(gssEapAttrProvidersInitInternal)
{
if (GSS_ERROR(major))
goto cleanup;
-#ifdef HAVE_OPENSAML
- major = gssEapSamlAttrProvidersInit(&minor);
- if (GSS_ERROR(major))
- goto cleanup;
-#endif
#ifdef HAVE_SHIBRESOLVER
/* Allow Shibboleth initialization failure to be non-fatal */
gssEapLocalAttrProviderInit(&minor);
#endif
+#ifdef HAVE_OPENSAML
+ wpa_printf(MSG_INFO, "### gssEapAttrProvidersInitInternal(): Calling gssEapSamlAttrProvidersInit()");
+ major = gssEapSamlAttrProvidersInit(&minor);
+ if (GSS_ERROR(major)) {
+ wpa_printf(MSG_ERROR, "### gssEapAttrProvidersInitInternal(): Error returned from gssEapSamlAttrProvidersInit; major code is %08X; minor is %08X", major, minor);
+ goto cleanup;
+ }
+#else
+ wpa_printf(MSG_INFO, "### gssEapAttrProvidersInitInternal(): Don't have OpenSAML; not calling gssEapSamlAttrProvidersInit()");
+#endif
cleanup:
#ifdef GSSEAP_DEBUG
GSSEAP_ASSERT(major == GSS_S_COMPLETE);
#endif
-#ifdef WIN32
- InterlockedCompareExchangeRelease(&gssEapAttrProvidersInitStatus,
- major, GSS_S_UNAVAILABLE);
-#else
+ wpa_printf(MSG_INFO, "### gssEapAttrProvidersInitInternal(): Setting gssEapAttrProvidersInitStatus to %08X", major);
gssEapAttrProvidersInitStatus = major;
-#endif
GSSEAP_ONCE_LEAVE;
}
static OM_uint32
gssEapAttrProvidersInit(OM_uint32 *minor)
{
-#ifdef WIN32
- if (gssEapAttrProvidersInitStatus == GSS_S_UNAVAILABLE)
- gssEapAttrProvidersInitInternal();
-#else
GSSEAP_ONCE(&gssEapAttrProvidersInitOnce, gssEapAttrProvidersInitInternal);
-#endif
if (GSS_ERROR(gssEapAttrProvidersInitStatus))
*minor = GSSEAP_NO_ATTR_PROVIDERS;
return gssEapAttrProvidersInitStatus;
}
-OM_uint32
-gssEapAttrProvidersFinalize(OM_uint32 *minor)
-{
- if (gssEapAttrProvidersInitStatus == GSS_S_COMPLETE) {
-#ifdef HAVE_SHIBRESOLVER
- gssEapLocalAttrProviderFinalize(minor);
-#endif
+
+namespace {
+
+ class finalize_class {
+ public:
+
+ finalize_class() {
+ wpa_printf(MSG_INFO, "### finalize_class::finalize_class(): Constructing");
+ }
+
+ ~finalize_class()
+ {
+ OM_uint32 minor = 0;
+
+ wpa_printf(MSG_INFO, "### ~finalize_class::~finalize_class() : initStatus=%08x", gssEapAttrProvidersInitStatus);
+
+ if (gssEapAttrProvidersInitStatus == GSS_S_COMPLETE) {
+ wpa_printf(MSG_INFO, "### ~finalize_class::~finalize_class() : really finalizing");
+
#ifdef HAVE_OPENSAML
- gssEapSamlAttrProvidersFinalize(minor);
+ gssEapSamlAttrProvidersFinalize(&minor);
#endif
- gssEapRadiusAttrProviderFinalize(minor);
-
- gssEapAttrProvidersInitStatus = GSS_S_UNAVAILABLE;
- }
+ gssEapRadiusAttrProviderFinalize(&minor);
- return GSS_S_COMPLETE;
+ gssEapAttrProvidersInitStatus = GSS_S_UNAVAILABLE;
+ }
+ }
+ } finalizer;
}
+
+
static gss_eap_attr_create_provider gssEapAttrFactories[ATTR_TYPE_MAX + 1];
/*
OM_uint32
gssEapExportAttrContext(OM_uint32 *minor,
- gss_name_t name,
+ gss_const_name_t name,
gss_buffer_t buffer)
{
if (name->attrCtx == NULL) {
OM_uint32
gssEapDuplicateAttrContext(OM_uint32 *minor,
- gss_name_t in,
+ gss_const_name_t in,
gss_name_t out)
{
gss_eap_attr_ctx *ctx = NULL;