#include <stdlib.h>
#include "globals.h"
#include "http-private.h"
#ifdef HAVE_DLFCN_H
# include <dlfcn.h>
#endif
#ifdef HAVE_CDSASSL
OSStatus (*_cupsSSLCloseProc)(SSLContextRef context) = NULL;
OSStatus (*_cupsSSLDisposeContextProc)(SSLContextRef context) = NULL;
OSStatus (*_cupsSSLGetBufferedReadSizeProc)(SSLContextRef context, size_t *bufSize) = NULL;
OSStatus (*_cupsSSLHandshakeProc)(SSLContextRef context) = NULL;
OSStatus (*_cupsSSLNewContextProc)(Boolean isServer, SSLContextRef *contextPtr) = NULL;
OSStatus (*_cupsSSLReadProc)(SSLContextRef context, void *data, size_t dataLength, size_t *processed) = NULL;
OSStatus (*_cupsSSLSetConnectionProc)(SSLContextRef context, SSLConnectionRef connection) = NULL;
OSStatus (*_cupsSSLSetEnableCertVerifyProc)(SSLContextRef context, Boolean enableVerify) = NULL;
OSStatus (*_cupsSSLSetIOFuncsProc)(SSLContextRef context, SSLReadFunc read, SSLWriteFunc write) = NULL;
OSStatus (*_cupsSSLWriteProc)(SSLContextRef context, const void *data, size_t dataLength, size_t *processed) = NULL;
OSStatus (*_cupsSecKeychainOpenProc)(const char *pathName, SecKeychainRef *keychain) = NULL;
OSStatus (*_cupsSecIdentitySearchCreateProc)(CFTypeRef keychainOrArray, CSSM_KEYUSE keyUsage, SecIdentitySearchRef *searchRef) = NULL;
OSStatus (*_cupsSecIdentitySearchCopyNextProc)(SecIdentitySearchRef searchRef, SecIdentityRef *identity) = NULL;
static pthread_once_t cdsa_key_once = PTHREAD_ONCE_INIT;
#endif
static pthread_key_t globals_key = -1;
static pthread_once_t globals_key_once = PTHREAD_ONCE_INIT;
static void globals_init();
static void globals_destructor(void *value);
#ifdef HAVE_CDSASSL
static void cdsa_init();
#endif
static
void globals_init()
{
pthread_key_create(&globals_key, globals_destructor);
}
static
void globals_destructor(void *value)
{
free(value);
}
cups_globals_t *_cups_globals(void)
{
cups_globals_t *globals;
pthread_once(&globals_key_once, globals_init);
if ((globals = (cups_globals_t *) pthread_getspecific(globals_key)) == NULL)
{
globals = calloc(1, sizeof(cups_globals_t));
pthread_setspecific(globals_key, globals);
globals->cups_encryption = (http_encryption_t)-1;
globals->cups_pwdcb = cups_get_password;
strlcpy(globals->cups_server_domainsocket, CUPS_DEFAULT_DOMAINSOCKET, sizeof(globals->cups_server_domainsocket));
}
return globals;
}
#if defined(HAVE_CDSASSL)
static const char SecurityLibPath[] = "/System/Library/Frameworks/Security.framework/Security";
static
void cdsa_init()
{
#ifdef HAVE_DLFCN_H
void *cdsa_lib = NULL;
cdsa_lib = dlopen(SecurityLibPath, RTLD_LAZY);
_cupsSSLGetBufferedReadSizeProc = dlsym(cdsa_lib, "SSLGetBufferedReadSize");
_cupsSSLNewContextProc = dlsym(cdsa_lib, "SSLNewContext");
_cupsSSLSetIOFuncsProc = dlsym(cdsa_lib, "SSLSetIOFuncs");
_cupsSSLSetConnectionProc = dlsym(cdsa_lib, "SSLSetConnection");
_cupsSSLSetEnableCertVerifyProc = dlsym(cdsa_lib, "SSLSetEnableCertVerify");
_cupsSSLHandshakeProc = dlsym(cdsa_lib, "SSLHandshake");
_cupsSSLDisposeContextProc = dlsym(cdsa_lib, "SSLDisposeContext");
_cupsSSLCloseProc = dlsym(cdsa_lib, "SSLClose");
_cupsSSLReadProc = dlsym(cdsa_lib, "SSLRead");
_cupsSSLWriteProc = dlsym(cdsa_lib, "SSLWrite");
_cupsSecKeychainOpenProc = dlsym(cdsa_lib, "SecKeychainOpen");
_cupsSecIdentitySearchCreateProc = dlsym(cdsa_lib, "SecIdentitySearchCreate");
_cupsSecIdentitySearchCopyNextProc = dlsym(cdsa_lib, "SecIdentitySearchCopyNext");
#else
_cupsSSLGetBufferedReadSizeProc = SSLGetBufferedReadSize;
_cupsSSLNewContextProc = SSLNewContext;
_cupsSSLSetIOFuncsProc = SSLSetIOFuncs;
_cupsSSLSetConnectionProc = SSLSetConnection;
_cupsSSLSetEnableCertVerifyProc = SSLSetEnableCertVerify;
_cupsSSLHandshakeProc = SSLHandshake;
_cupsSSLDisposeContextProc = SSLDisposeContext;
_cupsSSLCloseProc = SSLClose;
_cupsSSLReadProc = SSLRead;
_cupsSSLWriteProc = SSLWrite;
_cupsSecKeychainOpenProc = SecKeychainOpen;
_cupsSecIdentitySearchCreateProc = SecIdentitySearchCreate;
_cupsSecIdentitySearchCopyNextProc = SecIdentitySearchCopyNext;
#endif
}
void _cups_cdsa_init(void)
{
pthread_once(&cdsa_key_once, cdsa_init);
return;
}
#endif