#if defined( _WINDOWS )
#include <windows.h>
#include "proto-ntutil.h"
#endif
#include <nspr.h>
#include <ssl.h>
#include <ldap.h>
#ifdef _SOLARIS_SDK
#include <synch.h>
#include <libintl.h>
#endif
static const char *SECU_Strerror(PRErrorCode errNum);
const char *
LDAP_CALL
ldapssl_err2string( const int prerrno )
{
const char *s;
if (( s = SECU_Strerror( (PRErrorCode)prerrno )) == NULL ) {
s = dgettext(TEXT_DOMAIN, "unknown");
}
return( s );
}
#include "nspr.h"
#define NS_DIRECTORY 1
struct tuple_str {
PRErrorCode errNum;
const char * errString;
};
typedef struct tuple_str tuple_str;
#ifndef _SOLARIS_SDK
#define ER2(a,b) {a, b},
#define ER3(a,b,c) {a, c},
#else
#define ER2(a,b) {a, NULL},
#define ER3(a,b,c) {a, NULL},
#endif
#include "secerr.h"
#include "sslerr.h"
#ifndef _SOLARIS_SDK
const tuple_str errStrings[] = {
#else
tuple_str errStrings[] = {
#endif
#ifdef NS_DIRECTORY
#include "sslerrstrs.h"
#include "secerrstrs.h"
#include "prerrstrs.h"
#else
#include "SSLerrs.h"
#include "SECerrs.h"
#include "NSPRerrs.h"
#endif
};
const PRInt32 numStrings = sizeof(errStrings) / sizeof(tuple_str);
#ifndef _SOLARIS_SDK
#ifdef NS_DIRECTORY
static
#endif
const char *
SECU_Strerror(PRErrorCode errNum) {
PRInt32 low = 0;
PRInt32 high = numStrings - 1;
PRInt32 i;
PRErrorCode num;
static int initDone;
if (!initDone) {
PRErrorCode lastNum = 0x80000000;
for (i = low; i <= high; ++i) {
num = errStrings[i].errNum;
if (num <= lastNum) {
#if 0
#ifdef NS_DIRECTORY
LDAPDebug( LDAP_DEBUG_ANY,
"sequence error in error strings at item %d\n"
"error %d (%s)\n",
i, lastNum, errStrings[i-1].errString );
LDAPDebug( LDAP_DEBUG_ANY,
"should come after \n"
"error %d (%s)\n",
num, errStrings[i].errString, 0 );
#else
fprintf(stderr,
"sequence error in error strings at item %d\n"
"error %d (%s)\n"
"should come after \n"
"error %d (%s)\n",
i, lastNum, errStrings[i-1].errString,
num, errStrings[i].errString);
#endif
#endif
}
lastNum = num;
}
initDone = 1;
}
while (low + 1 < high) {
i = (low + high) / 2;
num = errStrings[i].errNum;
if (errNum == num)
return errStrings[i].errString;
if (errNum < num)
high = i;
else
low = i;
}
if (errNum == errStrings[low].errNum)
return errStrings[low].errString;
if (errNum == errStrings[high].errNum)
return errStrings[high].errString;
return NULL;
}
#else
#undef ER3
#define ER3(x, y, z) case (x): \
s = (z); \
break;
#undef ER2
#define ER2(x, y) case (x): \
s = (y); \
break;
static mutex_t err_mutex = DEFAULTMUTEX;
static const char *
getErrString(PRInt32 i, PRErrorCode errNum)
{
char *s;
mutex_lock(&err_mutex);
if (errStrings[i].errString != NULL) {
mutex_unlock(&err_mutex);
return (errStrings[i].errString);
}
switch (errNum) {
#include "sslerrstrs.h"
#include "secerrstrs.h"
#include "prerrstrs.h"
default:
s = NULL;
break;
}
errStrings[i].errString = s;
mutex_unlock(&err_mutex);
return (s);
}
static
const char *
SECU_Strerror(PRErrorCode errNum) {
PRInt32 low = 0;
PRInt32 high = numStrings - 1;
PRInt32 i;
PRErrorCode num;
while (low + 1 < high) {
i = (low + high) / 2;
num = errStrings[i].errNum;
if (errNum == num)
return getErrString(i, errNum);
if (errNum < num)
high = i;
else
low = i;
}
if (errNum == errStrings[low].errNum)
return getErrString(low, errNum);
if (errNum == errStrings[high].errNum)
return getErrString(high, errNum);
return NULL;
}
#endif