/*
  C K O S S L . C --  OpenSSL Interface for Kermit 95

  Copyright (C) 2000, 2004 Trustees of Columbia University in the City of New
  York.

  Copyright (C) 2006, 2007  Secure Endpoints Inc.

  Author:  Jeffrey E Altman (jaltman@secure-endpoints.com)
             Secure Endpoints Inc., New York City
*/

#include "ckcdeb.h"
#include "ck_ssl.h"

#ifdef NT
#include <windows.h>
#else /* NT */
#define INCL_DOSMODULEMGR
#define INCL_DOSSEMAPHORES
#include <os2.h>
#endif /* NT */
#include <stdarg.h>

#ifdef OS2
#ifdef CK_SSL
#ifdef SSLDLL

#ifdef NT
HINSTANCE hSSL = NULL;
#else /* NT */
HMODULE hSSL = NULL;
#endif /* NT */

int ssl_dll_loaded=0;

#ifdef NT
HINSTANCE hX5092UID=NULL;
#define SEM_INDEFINITE_WAIT INFINITE
#else /* NT */
HMODULE hX5092UID=NULL;
#endif /* NT */

#ifdef NOT_KERMIT
static int deblog = 0;
#ifdef debug
#undef debug
#endif
#define debug(x,a,b,c)
#ifdef printf
#undef printf
#endif
static int ssl_finished_messages = 0;
static unsigned long startflags = 0;
#endif /* NOT_KERMIT */

int     (*p_SSL_get_error)(SSL *ssl,int num)=NULL;
int     (*p_SSL_read)(SSL *ssl,char *buf,int num)=NULL;
int     (*p_SSL_connect)(SSL *ssl)=NULL;
int     (*p_SSL_set_fd)(SSL *s, int fd)=NULL;
void    (*p_SSL_free)(SSL *ssl)=NULL;
int     (*p_SSL_shutdown)(SSL *s)=NULL;
int     (*p_SSL_write)(SSL *ssl,char *buf,int num)=NULL;
int     (*p_SSL_pending)(SSL *ssl)=NULL;
int     (*p_SSL_peek)(SSL *ssl,char * buf,int num)=NULL;
void    (*p_SSL_load_error_strings)(void )=NULL;
X509 *  (*p_SSL_get_peer_certificate)(SSL *s)=NULL;
const char * (*p_SSL_CIPHER_get_name)(SSL_CIPHER *c)=NULL;
int     (*p_SSL_CIPHER_get_bits)(SSL_CIPHER *c,int *)=NULL;
char *  (*p_SSL_CIPHER_get_version)(SSL_CIPHER *c)=NULL;
SSL_CIPHER * (*p_SSL_get_current_cipher)(SSL *s)=NULL;
char *  (*p_SSL_get_shared_ciphers)(SSL *s, char *buf, int len)=NULL;
char *  (*p_SSL_get_ciphers)(SSL *s)=NULL;
const char * (*p_SSL_get_cipher_list)(SSL *s, int i)=NULL;
int     (*p_SSL_CTX_set_default_verify_paths)(SSL_CTX *ctx)=NULL;
int     (*p_SSL_use_RSAPrivateKey_file)(SSL *ssl, char *file, int type)=NULL;
int     (*p_SSL_use_DSAPrivateKey_file)(SSL *ssl, char *file, int type)=NULL;
int     (*p_SSL_use_PrivateKey_file)(SSL *ssl, char *file, int type)=NULL;
int     (*p_SSL_use_certificate_file)(SSL *ssl, char *file, int type)=NULL;
int     (*p_SSL_CTX_use_PrivateKey_file)(SSL_CTX *ctx, char *file, int type)=NULL;
int     (*p_SSL_CTX_use_certificate_file)(SSL_CTX *ctx, char *file, int type)=NULL;
int     (*p_SSL_CTX_check_private_key)(SSL_CTX *ctx)=NULL;
int     (*p_SSL_check_private_key)(SSL *ssl)=NULL;
void    (*p_SSL_set_verify)(SSL *s, int mode, int (*callback) ())=NULL;
void    (*p_SSL_CTX_set_verify)(SSL_CTX *ctx, int mode, int (*callback) ())=NULL;
SSL *   (*p_SSL_new)(SSL_CTX *ctx)=NULL;
long    (*p_SSL_CTX_ctrl)(SSL_CTX *ctx,int cmd, long larg, char *parg)=NULL;
SSL_CTX * (*p_SSL_CTX_new)(SSL_METHOD *meth)=NULL;
void    (*p_SSL_CTX_free)(SSL_CTX *ctx)=NULL;
void    (*p_SSL_CTX_set_default_passwd_cb)(SSL_CTX *ctx,int (*cb)())=NULL;
SSL_METHOD * (*p_SSLv23_method)(void)=NULL;
SSL_METHOD * (*p_SSLv3_method)(void)=NULL;
SSL_METHOD * (*p_TLSv1_method)(void)=NULL;
SSL_METHOD * (*p_SSLv23_client_method)(void)=NULL;
SSL_METHOD * (*p_SSLv3_client_method)(void)=NULL;
SSL_METHOD * (*p_TLSv1_client_method)(void)=NULL;
SSL_METHOD * (*p_SSLv23_server_method)(void)=NULL;
SSL_METHOD * (*p_SSLv3_server_method)(void)=NULL;
SSL_METHOD * (*p_TLSv1_server_method)(void)=NULL;
void (*p_SSL_library_init)(void)=NULL;
char *  (*p_SSL_state_string)(const SSL *s)=NULL;
char *  (*p_SSL_state_string_long)(const SSL *s)=NULL;
int     (*p_SSL_accept)(SSL *ssl)=NULL;
int     (*p_SSL_set_cipher_list)(SSL *ssl,char *s)=NULL;
void (*p_SSL_CTX_set_tmp_rsa_callback)(SSL_CTX *ctx,
     RSA *(*cb)(SSL *ssl,int is_export, int keylength))=NULL;
void (*p_SSL_set_tmp_rsa_callback)(SSL *ssl,
     RSA *(*cb)(SSL *ssl,int is_export,int keylength))=NULL;
void (*p_SSL_CTX_set_tmp_dh_callback)(SSL_CTX *ctx,
     DH *(*dh)(SSL *ssl,int is_export,int keylength))=NULL;
void (*p_SSL_set_tmp_dh_callback)(SSL *ssl,
     DH *(*dh)(SSL *ssl,int is_export, int keylength))=NULL;

int  (*p_SSL_CTX_load_verify_locations)(SSL_CTX *,char *,char *)=NULL;
void (*p_SSL_CTX_set_default_passwd_cb_userdata)(SSL_CTX *, void *)=NULL;
int  (*p_X509_to_user)(X509 *peer_cert, char *userid, int len)=NULL;
int  (*p_X509_userok)(X509 *peer_cert, const char *userid)=NULL;
BIO *(*p_SSL_get_wbio)(SSL *)=NULL;
size_t (*p_SSL_get_finished)(SSL *,void *buf, size_t count)=NULL;
size_t (*p_SSL_get_peer_finished)(SSL *,void *buf, size_t count)=NULL;
void (*p_SSL_copy_session_id)(SSL *to,SSL *from)=NULL;
int  (*p_SSL_renegotiate)(SSL * ssl)=NULL;
int  (*p_SSL_set_session)(SSL *, SSL_SESSION *)=NULL;
SSL_SESSION * (*p_SSL_get_session)(SSL *)=NULL;
int (*p_SSL_CTX_set_session_id_context)(SSL_CTX *ctx,
    const unsigned char *sid_ctx,unsigned int sid_ctx_len)=NULL;
EVP_PKEY * (*p_SSL_get_privatekey)(SSL *)=NULL;
X509 * (*p_SSL_get_certificate)(SSL *)=NULL;
int (*p_SSL_clear)(SSL *)=NULL;
void (*p_SSL_set_accept_state)(SSL *)=NULL;
char * (*p_SSL_CIPHER_description)(SSL_CIPHER *,char *buf,int size)=NULL;
void (*p_SSL_CTX_set_info_callback)(SSL_CTX *ctx, void (*cb)(const SSL *ssl,int type,int val))=NULL;

#ifdef SSL_KRB5
KSSL_CTX * (*p_kssl_ctx_new)(void)=NULL;
KSSL_CTX * (*p_kssl_ctx_free)(KSSL_CTX *kssl_ctx)=NULL;
krb5_error_code (*p_kssl_ctx_setstring)(KSSL_CTX *kssl_ctx, int which, char *text)=NULL;
krb5_error_code (*p_kssl_ctx_setprinc)(KSSL_CTX *kssl_ctx, int which,
                                      krb5_data *realm, krb5_data *entity)=NULL;
#endif /* SSL_KRB5 */
int (*p_SSL_COMP_add_compression_method)(int id,COMP_METHOD *cm)=NULL;
int (*p_SSL_CTX_use_certificate_chain_file)(SSL_CTX *ctx, const char *file)=NULL;

static int ssl_shutdown_in_progress = 0;

int
ck_SSL_get_error(SSL *ssl,int num)
{
    if ( p_SSL_get_error ) {
        int rc;
#ifdef SSL_MUTEX
        if (RequestSSLMutex(20000))
            return(0);
        rc = p_SSL_get_error(ssl,num);
        ReleaseSSLMutex();
#else
        rc = p_SSL_get_error(ssl,num);
#endif
        return(rc);
    }
    return(0);
}

int
ck_SSL_read(SSL *ssl,char *buf,int num)
{
    if ( ssl && !ssl_shutdown_in_progress && p_SSL_read ) {
        int rc;
#ifdef SSL_MUTEX
        if (RequestSSLMutex(20000))
            return(0);
        rc = p_SSL_read(ssl,buf,num);;
        ReleaseSSLMutex();
#else
        rc = p_SSL_read(ssl,buf,num);;
#endif
        return(rc);
    }
    return(0);
}

int
ck_SSL_peek(SSL *ssl,char *buf,int num)
{
    if ( ssl && !ssl_shutdown_in_progress && p_SSL_peek ) {
        int rc;
#ifdef SSL_MUTEX
        if (RequestSSLMutex(20000))
            return(0);
        rc = p_SSL_peek(ssl,buf,num);
        ReleaseSSLMutex();
#else
        rc = p_SSL_peek(ssl,buf,num);
#endif
        return(rc);
    }
    return(0);
}

int
ck_SSL_connect(SSL *ssl)
{
    if ( ssl && !ssl_shutdown_in_progress && p_SSL_connect ) {
        int rc;
#ifdef SSL_MUTEX
        if (RequestSSLMutex(20000))
            return(0);
        rc = p_SSL_connect(ssl);
        ReleaseSSLMutex();
#else
        rc = p_SSL_connect(ssl);
#endif
        return(rc);
    }
    return(0);
}

int
ck_SSL_set_fd(SSL *ssl, int fd)
{
    if ( ssl && !ssl_shutdown_in_progress && p_SSL_set_fd ) {
        int rc;
#ifdef SSL_MUTEX
        if (RequestSSLMutex(20000))
            return(0);
        rc = p_SSL_set_fd(ssl,fd);
        ReleaseSSLMutex();
#else
        rc = p_SSL_set_fd(ssl,fd);
#endif
        return(rc);
    }
    return(0);
}

void
ck_SSL_free(SSL *ssl)
{
    if ( p_SSL_free ) {
#ifdef SSL_MUTEX
        if (RequestSSLMutex(20000))
            return;
        p_SSL_free(ssl);
        ReleaseSSLMutex();
#else
        p_SSL_free(ssl);
#endif
    }
}

int
ck_SSL_shutdown(SSL *s)
{
    int rc = 0;
    if ( p_SSL_shutdown ) {
        ssl_shutdown_in_progress = 1;
#ifdef SSL_MUTEX
        if (RequestSSLMutex(20000))
            return(0);
        rc = p_SSL_shutdown(s);
        ReleaseSSLMutex();
#else
        rc = p_SSL_shutdown(s);
#endif
        ssl_shutdown_in_progress = 0;
    }
    return(rc);
}

int
ck_SSL_write(SSL *ssl,char *buf,int num)
{
    if ( ssl && !ssl_shutdown_in_progress && p_SSL_write ) {
        int rc;
#ifdef SSL_MUTEX
        if (RequestSSLMutex(20000))
            return(0);
        rc = p_SSL_write(ssl,buf,num);
        ReleaseSSLMutex();
#else
        rc = p_SSL_write(ssl,buf,num);
#endif
        return(rc);
    }
    return(0);
}

int
ck_SSL_pending(SSL *ssl)
{
    if ( ssl && !ssl_shutdown_in_progress && p_SSL_pending ) {
        int rc;
#ifdef SSL_MUTEX
        if (RequestSSLMutex(20000))
            return(0);
        rc = p_SSL_pending(ssl);
        ReleaseSSLMutex();
#else
        rc = p_SSL_pending(ssl);
#endif
        return(rc);
    }
    return(0);
}

void
ck_SSL_load_error_strings(void )
{
    if ( p_SSL_load_error_strings )
        p_SSL_load_error_strings();
}

X509 *
ck_SSL_get_peer_certificate(SSL *s)
{
    if ( p_SSL_get_peer_certificate )
        return p_SSL_get_peer_certificate(s);
    return(NULL);
}

const char *
ck_SSL_CIPHER_get_name(SSL_CIPHER *c)
{
    if ( p_SSL_CIPHER_get_name )
        return p_SSL_CIPHER_get_name(c);
    return(NULL);
}

int
ck_SSL_CIPHER_get_bits(SSL_CIPHER *c, int * alg_bits)
{
    if ( p_SSL_CIPHER_get_bits )
        return p_SSL_CIPHER_get_bits(c,alg_bits);
    return(0);
}

char *
ck_SSL_CIPHER_get_version(SSL_CIPHER *c)
{
    if ( p_SSL_CIPHER_get_version )
        return p_SSL_CIPHER_get_version(c);
    return(NULL);
}

SSL_CIPHER *
ck_SSL_get_current_cipher(SSL *s)
{
    if ( p_SSL_get_current_cipher )
        return p_SSL_get_current_cipher(s);
    return NULL;
}

char *
ck_SSL_get_shared_ciphers(SSL *s, char *buf, int len)
{
    if ( p_SSL_get_shared_ciphers )
        return(p_SSL_get_shared_ciphers(s,buf,len));
    else
        return(NULL);
}

char *
ck_SSL_get_ciphers(SSL *s)
{
    if ( p_SSL_get_ciphers )
        return(p_SSL_get_ciphers(s));
    else
        return(NULL);
}

const char *
ck_SSL_get_cipher_list(SSL *s, int i)
{
    if ( p_SSL_get_cipher_list )
        return(p_SSL_get_cipher_list(s,i));
    else
        return(NULL);
}

int
ck_SSL_CTX_set_default_verify_paths(SSL_CTX *ctx)
{
    if ( p_SSL_CTX_set_default_verify_paths )
        return p_SSL_CTX_set_default_verify_paths(ctx);
    return 0;
}

int
ck_SSL_use_RSAPrivateKey_file(SSL *ssl, char *file, int type)
{
    if ( p_SSL_use_RSAPrivateKey_file )
        return p_SSL_use_RSAPrivateKey_file(ssl, file, type);
    return(0);
}

int
ck_SSL_use_DSAPrivateKey_file(SSL *ssl, char *file, int type)
{
    if ( p_SSL_use_DSAPrivateKey_file )
        return p_SSL_use_DSAPrivateKey_file(ssl, file, type);
    return(0);
}

int
ck_SSL_use_PrivateKey_file(SSL *ssl, char *file, int type)
{
    if ( p_SSL_use_PrivateKey_file )
        return p_SSL_use_PrivateKey_file(ssl, file, type);
    return(0);
}

int
ck_SSL_use_certificate_file(SSL *ssl, char *file, int type)
{
    if ( p_SSL_use_certificate_file )
        return p_SSL_use_certificate_file(ssl,file,type);
    return(0);
}

int
ck_SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file)
{
    if ( p_SSL_CTX_use_certificate_chain_file )
        return p_SSL_CTX_use_certificate_chain_file(ctx,file);
    return(0);
}

int
ck_SSL_CTX_use_PrivateKey_file(SSL_CTX *ssl, char *file, int type)
{
    if ( p_SSL_CTX_use_PrivateKey_file )
        return p_SSL_CTX_use_PrivateKey_file(ssl, file, type);
    return(0);
}

int
ck_SSL_CTX_use_certificate_file(SSL_CTX *ssl, char *file, int type)
{
    if ( p_SSL_CTX_use_certificate_file )
        return p_SSL_CTX_use_certificate_file(ssl,file,type);
    return(0);
}

int
ck_SSL_CTX_check_private_key(SSL_CTX *ctx) {
    if ( p_SSL_CTX_check_private_key )
        return p_SSL_CTX_check_private_key(ctx);
    return(0);
}

int
ck_SSL_check_private_key(SSL *ssl) {
    if ( p_SSL_check_private_key )
        return p_SSL_check_private_key(ssl);
    return(0);
}

void
ck_SSL_set_verify(SSL *s, int mode, int (*callback) ())
{
    if ( p_SSL_set_verify )
        p_SSL_set_verify(s,mode,callback);
}

void
ck_SSL_CTX_set_verify(SSL_CTX *s, int mode, int (*callback) ())
{
    if ( p_SSL_CTX_set_verify )
        p_SSL_CTX_set_verify(s,mode,callback);
}

SSL *
ck_SSL_new(SSL_CTX *ctx)
{
    if ( p_SSL_new )
        return p_SSL_new(ctx);
    return(NULL);
}

long
ck_SSL_CTX_ctrl(SSL_CTX *ctx,int cmd, long larg, char *parg)
{
    if ( p_SSL_CTX_ctrl )
        return p_SSL_CTX_ctrl(ctx,cmd,larg,parg);
    return(0);
}

SSL_CTX *
ck_SSL_CTX_new(SSL_METHOD *meth)
{
    if ( p_SSL_CTX_new )
        return p_SSL_CTX_new(meth);
    return(NULL);
}

void
ck_SSL_CTX_free(SSL_CTX * ctx)
{
    if ( p_SSL_CTX_free )
        p_SSL_CTX_free(ctx);
}

void
ck_SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx,int (*cb)())
{
    if ( p_SSL_CTX_set_default_passwd_cb )
        p_SSL_CTX_set_default_passwd_cb(ctx,cb);
}

SSL_METHOD *
ck_SSLv23_method(void)
{
    if ( p_SSLv23_method )
        return p_SSLv23_method();
    return(NULL);
}

SSL_METHOD *
ck_SSLv3_method(void)
{
    if ( p_SSLv3_method )
        return p_SSLv3_method();
    return(NULL);
}

SSL_METHOD *
ck_TLSv1_method(void)
{
    if ( p_TLSv1_method )
        return p_TLSv1_method();
    return(NULL);
}

SSL_METHOD *
ck_SSLv23_client_method(void)
{
    if ( p_SSLv23_client_method )
        return p_SSLv23_client_method();
    return(NULL);
}

SSL_METHOD *
ck_SSLv3_client_method(void)
{
    if ( p_SSLv3_client_method )
        return p_SSLv3_client_method();
    return(NULL);
}

SSL_METHOD *
ck_TLSv1_client_method(void)
{
    if ( p_TLSv1_client_method )
        return p_TLSv1_client_method();
    return(NULL);
}

SSL_METHOD *
ck_SSLv23_server_method(void)
{
    if ( p_SSLv23_server_method )
        return p_SSLv23_server_method();
    return(NULL);
}

SSL_METHOD *
ck_SSLv3_server_method(void)
{
    if ( p_SSLv3_server_method )
        return p_SSLv3_server_method();
    return(NULL);
}

SSL_METHOD *
ck_TLSv1_server_method(void)
{
    if ( p_TLSv1_server_method )
        return p_TLSv1_server_method();
    return(NULL);
}

void
ck_SSL_library_init(void)
{
    if ( p_SSL_library_init )
        p_SSL_library_init();
}

char *
ck_SSL_state_string(const SSL *s)
{
    if ( p_SSL_state_string )
        return p_SSL_state_string(s);
    return NULL;
}

char *
ck_SSL_state_string_long(const SSL *s)
{
    if ( p_SSL_state_string_long )
        return p_SSL_state_string_long(s);
    return NULL;
}

int
ck_SSL_accept(SSL *ssl)
{
    if ( p_SSL_accept )
        return p_SSL_accept(ssl);
    return(0);
}

int
ck_SSL_set_cipher_list(SSL *ssl,char *s)
{
    if ( p_SSL_set_cipher_list )
        return p_SSL_set_cipher_list(ssl,s);
    return(0);
}

void
ck_SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,
         RSA *(*cb)(SSL *ssl,int is_export, int keylength))
{
    if ( p_SSL_CTX_set_tmp_rsa_callback )
        p_SSL_CTX_set_tmp_rsa_callback(ctx,cb);
}

void
ck_SSL_set_tmp_rsa_callback(SSL *ssl,
         RSA *(*cb)(SSL *ssl,int is_export, int keylength))
{
    if ( p_SSL_set_tmp_rsa_callback )
        p_SSL_set_tmp_rsa_callback(ssl,cb);
}

void
ck_SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,
         DH *(*dh)(SSL *ssl,int is_export, int keylength))
{
    if ( p_SSL_CTX_set_tmp_dh_callback )
        p_SSL_CTX_set_tmp_dh_callback(ctx,dh);
}

void
ck_SSL_set_tmp_dh_callback(SSL *ssl,
         DH *(*dh)(SSL *ssl,int is_export, int keylength))
{
    if ( p_SSL_set_tmp_dh_callback )
        p_SSL_set_tmp_dh_callback(ssl,dh);

}

int
ck_SSL_CTX_load_verify_locations(SSL_CTX * ctx,char *f,char *p)
{
    if ( p_SSL_CTX_load_verify_locations )
        return(p_SSL_CTX_load_verify_locations(ctx,f,p));
    return(0);
}

void
ck_SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX * ctx, void * userdata)
{
    if ( p_SSL_CTX_set_default_passwd_cb_userdata )
        p_SSL_CTX_set_default_passwd_cb_userdata(ctx,userdata);
}

int
ck_X509_userok(X509 *peer_cert, const char *userid)
{
    if ( p_X509_userok )
        return(p_X509_userok(peer_cert,userid));
    else
        return(0);
}

int
ck_X509_to_user(X509 *peer_cert, char *userid, int len)
{
    if ( p_X509_to_user )
        return(p_X509_to_user(peer_cert,userid,len));
    else
        return(-1);
}

BIO *
ck_SSL_get_wbio(SSL * s)
{
    if ( p_SSL_get_wbio )
        return(p_SSL_get_wbio(s));
    else
        return(NULL);
}

size_t
ck_SSL_get_finished(SSL * s,void *buf, size_t count)
{
    if ( p_SSL_get_finished )
        return(p_SSL_get_finished(s,buf,count));
    else
        return(0);
}

size_t
ck_SSL_get_peer_finished(SSL * s,void *buf, size_t count)
{
    if ( p_SSL_get_peer_finished )
        return(p_SSL_get_peer_finished(s,buf,count));
    else
        return(0);
}

void
ck_SSL_copy_session_id(SSL *to,SSL *from)
{
    if ( p_SSL_copy_session_id )
        p_SSL_copy_session_id(to,from);
}

int
ck_SSL_renegotiate(SSL * ssl)
{
    if ( p_SSL_renegotiate )
        return(p_SSL_renegotiate(ssl));
    else
        return(-1);
}

int
ck_SSL_set_session(SSL *ssl, SSL_SESSION * session)
{
    if ( p_SSL_set_session )
        return(p_SSL_set_session(ssl,session));
    else
        return(-1);
}
SSL_SESSION *
ck_SSL_get_session(SSL * ssl)
{
    if ( p_SSL_get_session )
        return(p_SSL_get_session(ssl));
    else
        return(NULL);
}

int
ck_SSL_CTX_set_session_id_context(SSL_CTX *ctx,const unsigned char *sid_ctx,
                                   unsigned int sid_ctx_len)
{
    if ( p_SSL_CTX_set_session_id_context )
        return(p_SSL_CTX_set_session_id_context(ctx,sid_ctx,sid_ctx_len));
    else
        return(-1);
}

EVP_PKEY *
ck_SSL_get_privatekey(SSL * s)
{
    if ( p_SSL_get_privatekey )
        return(p_SSL_get_privatekey(s));
    else
        return(NULL);
}
X509 *
ck_SSL_get_certificate(SSL * s)
{
    if ( p_SSL_get_certificate )
        return(p_SSL_get_certificate(s));
    else
        return(NULL);
}

int
ck_SSL_clear(SSL * s)
{
    if ( p_SSL_clear )
        return(p_SSL_clear(s));
    else
        return(-1);
}

void
ck_SSL_set_accept_state(SSL * s)
{
    if ( p_SSL_set_accept_state )
        p_SSL_set_accept_state(s);
}

char *
ck_SSL_CIPHER_description(SSL_CIPHER * c,char *buf,int size)
{
    if (p_SSL_CIPHER_description)
        return(p_SSL_CIPHER_description(c,buf,size));
    else
        return(NULL);
}

#ifdef SSL_KRB5
KSSL_CTX *
ck_kssl_ctx_new(void)
{
    if ( p_kssl_ctx_new )
        return(p_kssl_ctx_new());
    else
        return(NULL);
}

KSSL_CTX *
ck_kssl_ctx_free(KSSL_CTX *kssl_ctx)
{
    if ( p_kssl_ctx_free )
        return(p_kssl_ctx_free(kssl_ctx));
    else
        return(NULL);
}

krb5_error_code
ck_kssl_ctx_setstring(KSSL_CTX *kssl_ctx, int which, char *text)
{
    if ( p_kssl_ctx_setstring )
        return(p_kssl_ctx_setstring(kssl_ctx,which,text));
    else
        return(-1);
}

krb5_error_code
ck_kssl_ctx_setprinc(KSSL_CTX *kssl_ctx, int which,
                      krb5_data *realm, krb5_data *entity)
{
    if ( p_kssl_ctx_setprinc )
        return(p_kssl_ctx_setprinc(kssl_ctx, which, realm, entity));
    else
        return(-1);
}
#endif /* SSL_KRB5 */
int
ck_SSL_COMP_add_compression_method(int id,COMP_METHOD *cm)
{
    if ( p_SSL_COMP_add_compression_method )
        return(p_SSL_COMP_add_compression_method(id,cm));
    else
        return(-1);
}

void 
ck_SSL_CTX_set_info_callback(SSL_CTX *ctx, void (*cb)(const SSL *ssl,int type,int val))
{
    if ( p_SSL_CTX_set_info_callback )
        p_SSL_CTX_set_info_callback(ctx,cb);
}


int
ck_ssl_loaddll_eh(void)
{
    if ( hSSL ) {
#ifdef NT
        FreeLibrary(hSSL);
        hSSL = NULL;
#else /* NT */
        DosFreeModule(hSSL);
        hSSL = 0;
#endif  /* NT */
    }

    if ( hX5092UID ) {
#ifdef NT
        FreeLibrary(hX5092UID);
        hX5092UID = NULL;
#else /* NT */
        DosFreeModule(hX5092UID);
        hX5092UID = 0;
#endif  /* NT */
    }
    p_SSL_get_error=NULL;
    p_SSL_read=NULL;
    p_SSL_peek=NULL;
    p_SSL_connect=NULL;
    p_SSL_set_fd=NULL;
    p_SSL_free=NULL;
    p_SSL_shutdown=NULL;
    p_SSL_write=NULL;
    p_SSL_pending=NULL;
    p_SSL_load_error_strings=NULL;
    p_SSL_get_peer_certificate=NULL;
    p_SSL_CIPHER_get_name=NULL;
    p_SSL_CIPHER_get_bits=NULL;
    p_SSL_CIPHER_get_version=NULL;
    p_SSL_get_current_cipher=NULL;
    p_SSL_get_shared_ciphers=NULL;
    p_SSL_get_ciphers=NULL;
    p_SSL_get_cipher_list=NULL;
    p_SSL_CTX_set_default_verify_paths=NULL;
    p_SSL_use_RSAPrivateKey_file=NULL;
    p_SSL_use_DSAPrivateKey_file=NULL;
    p_SSL_use_PrivateKey_file=NULL;
    p_SSL_use_certificate_file=NULL;
    p_SSL_check_private_key=NULL;
    p_SSL_CTX_use_PrivateKey_file=NULL;
    p_SSL_CTX_use_certificate_file=NULL;
    p_SSL_CTX_use_certificate_chain_file=NULL;
    p_SSL_CTX_check_private_key=NULL;
    p_SSL_set_verify=NULL;
    p_SSL_CTX_set_verify=NULL;
    p_SSL_new=NULL;
    p_SSL_CTX_ctrl=NULL;
    p_SSL_CTX_new=NULL;
    p_SSL_CTX_free=NULL;
    p_SSL_CTX_set_default_passwd_cb=NULL;
    p_SSLv23_method=NULL;
    p_SSLv3_method=NULL;
    p_TLSv1_method=NULL;
    p_SSLv23_server_method=NULL;
    p_SSLv3_server_method=NULL;
    p_TLSv1_server_method=NULL;
    p_SSLv23_client_method=NULL;
    p_SSLv3_client_method=NULL;
    p_TLSv1_client_method=NULL;
    p_SSL_library_init=NULL;
    p_SSL_state_string=NULL;
    p_SSL_state_string_long=NULL;
    p_SSL_accept=NULL;
    p_SSL_set_cipher_list=NULL;

    p_SSL_CTX_set_tmp_rsa_callback=NULL;
    p_SSL_set_tmp_rsa_callback=NULL;
    p_SSL_CTX_set_tmp_dh_callback=NULL;
    p_SSL_set_tmp_dh_callback=NULL;

    p_SSL_CTX_load_verify_locations=NULL;
    p_SSL_CTX_set_default_passwd_cb_userdata=NULL;
    p_X509_to_user=NULL;
    p_X509_userok=NULL;
    p_SSL_get_wbio=NULL;
    p_SSL_get_finished=NULL;
    p_SSL_get_peer_finished=NULL;
    p_SSL_copy_session_id=NULL;
    p_SSL_renegotiate=NULL;
    p_SSL_get_session=NULL;
    p_SSL_set_session=NULL;
    p_SSL_CTX_set_session_id_context=NULL;
    p_SSL_get_privatekey=NULL;
    p_SSL_get_certificate=NULL;
    p_SSL_clear=NULL;
    p_SSL_set_accept_state=NULL;
    p_SSL_CIPHER_description=NULL;

#ifdef SSL_KRB5
    p_kssl_ctx_new = NULL;
    p_kssl_ctx_free = NULL;
    p_kssl_ctx_setstring = NULL;
    p_kssl_ctx_setprinc = NULL;
#endif /* SSL_KRB5 */
    p_SSL_COMP_add_compression_method=NULL;
    p_SSL_CTX_set_info_callback = NULL;
    return(1);
}

int
ck_ssl_loaddll( void )
{
    ULONG rc = 0 ;
    extern unsigned long startflags;
    int load_error = 0;
#ifdef OS2ONLY
    CHAR *exe_path;
    CHAR path[256];
    CHAR * dllname = "SSLEAY2";
    CHAR errbuf[256];
#endif /* OS2ONLY */

    if ( ssl_dll_loaded )
        return(1);

    if ( startflags & 8 )       /* do not load if we are not supposed to */
        return(0);

#ifdef NT
    hSSL = LoadLibrary("SSLEAY32");
    if ( !hSSL ) {
        rc = GetLastError() ;
        debug(F111, "OpenSSL LoadLibrary failed","SSLEAY32",rc) ;
        return(0);
    } else {
        if (((FARPROC) p_SSL_get_error =
              GetProcAddress( hSSL, "SSL_get_error" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_get_error",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_read =
              GetProcAddress( hSSL, "SSL_read" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_read",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_peek =
              GetProcAddress( hSSL, "SSL_peek" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_peek",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_connect =
              GetProcAddress( hSSL, "SSL_connect" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_connect",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_set_fd =
              GetProcAddress( hSSL, "SSL_set_fd" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_set_fd",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_free =
              GetProcAddress( hSSL, "SSL_free" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_free",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_shutdown =
              GetProcAddress( hSSL, "SSL_shutdown" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_shutdown",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_write =
              GetProcAddress( hSSL, "SSL_write" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_write",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_pending =
              GetProcAddress( hSSL, "SSL_pending" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_pending",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_load_error_strings =
              GetProcAddress( hSSL, "SSL_load_error_strings" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_load_error_strings",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_get_peer_certificate =
              GetProcAddress( hSSL, "SSL_get_peer_certificate" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_get_peer_certificate",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CIPHER_get_name =
              GetProcAddress( hSSL, "SSL_CIPHER_get_name" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CIPHER_get_name",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CIPHER_get_bits =
              GetProcAddress( hSSL, "SSL_CIPHER_get_bits" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CIPHER_get_bits",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CIPHER_get_version =
              GetProcAddress( hSSL, "SSL_CIPHER_get_version" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CIPHER_get_version",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_get_current_cipher =
              GetProcAddress( hSSL, "SSL_get_current_cipher" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_get_current_cipher",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_get_shared_ciphers =
              GetProcAddress( hSSL, "SSL_get_shared_ciphers" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_get_shared_ciphers",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_get_ciphers =
              GetProcAddress( hSSL, "SSL_get_ciphers" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_get_ciphers",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_get_cipher_list =
              GetProcAddress( hSSL, "SSL_get_cipher_list" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_get_cipher_list",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CTX_set_default_verify_paths =
              GetProcAddress( hSSL, "SSL_CTX_set_default_verify_paths" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_set_default_verify_paths",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_use_RSAPrivateKey_file =
              GetProcAddress( hSSL, "SSL_use_RSAPrivateKey_file" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_use_RSAPrivateKey_file",rc);
        }
        if (((FARPROC) p_SSL_use_PrivateKey_file =
              GetProcAddress( hSSL, "SSL_use_PrivateKey_file" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_use_PrivateKey_file",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_use_certificate_file =
              GetProcAddress( hSSL, "SSL_use_certificate_file" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_use_certificate_file",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CTX_use_PrivateKey_file =
              GetProcAddress( hSSL, "SSL_CTX_use_PrivateKey_file" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CTX_use_PrivateKey_file",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CTX_use_certificate_file =
              GetProcAddress( hSSL, "SSL_CTX_use_certificate_file" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_use_certificate_file",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CTX_use_certificate_chain_file =
              GetProcAddress( hSSL, "SSL_CTX_use_certificate_chain_file" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_use_certificate_chain_file",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CTX_check_private_key =
              GetProcAddress( hSSL, "SSL_CTX_check_private_key" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_check_private_key",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_check_private_key =
              GetProcAddress( hSSL, "SSL_check_private_key" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_check_private_key",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_set_verify =
              GetProcAddress( hSSL, "SSL_set_verify" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_set_verify",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CTX_set_verify =
              GetProcAddress( hSSL, "SSL_CTX_set_verify" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CTX_set_verify",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_new =
              GetProcAddress( hSSL, "SSL_new" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_new",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CTX_ctrl =
              GetProcAddress( hSSL, "SSL_CTX_ctrl" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CTX_ctrl",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CTX_new =
              GetProcAddress( hSSL, "SSL_CTX_new" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CTX_new",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CTX_free =
              GetProcAddress( hSSL, "SSL_CTX_free" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CTX_free",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CTX_set_default_passwd_cb =
              GetProcAddress( hSSL, "SSL_CTX_set_default_passwd_cb" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CTX_set_default_passwd_cb",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSLv23_method =
              GetProcAddress( hSSL, "SSLv23_method" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSLv23_method",rc);
        }
        if (((FARPROC) p_SSLv3_method =
              GetProcAddress( hSSL, "SSLv3_method" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSLv3_method",rc);
        }
        if (((FARPROC) p_TLSv1_method =
              GetProcAddress( hSSL, "TLSv1_method" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","TLSv1_method",rc);
            load_error = 1;
        }

        if (((FARPROC) p_SSLv23_client_method =
              GetProcAddress( hSSL, "SSLv23_client_method" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSLv23_client_method",rc);
        }
        if (((FARPROC) p_SSLv3_client_method =
              GetProcAddress( hSSL, "SSLv3_client_method" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSLv3_client_method",rc);
        }
        if (((FARPROC) p_TLSv1_client_method =
              GetProcAddress( hSSL, "TLSv1_client_method" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","TLSv1_client_method",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSLv23_server_method =
              GetProcAddress( hSSL, "SSLv23_server_method" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSLv23_server_method",rc);
        }
        if (((FARPROC) p_SSLv3_server_method =
              GetProcAddress( hSSL, "SSLv3_server_method" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSLv3_server_method",rc);
        }
        if (((FARPROC) p_TLSv1_server_method =
              GetProcAddress( hSSL, "TLSv1_server_method" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","TLSv1_server_method",rc);
            load_error = 1;
        }

        if (((FARPROC) p_SSL_library_init =
              GetProcAddress( hSSL, "SSL_library_init" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_library_init",rc);
            if (((FARPROC) p_SSL_library_init =
              GetProcAddress( hSSL, "OpenSSL_add_ssl_algorithms" )) == NULL )
            {
                rc = GetLastError() ;
                debug(F111,"OpenSSL SSL GetProcAddress failed",
                       "OpenSSL_add_ssl_algorithms",rc);
                load_error = 1;
            }
        }
        if (((FARPROC) p_SSL_state_string =
              GetProcAddress( hSSL, "SSL_state_string" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_state_string",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_state_string_long =
              GetProcAddress( hSSL, "SSL_state_string_long" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_state_string_long",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_accept =
              GetProcAddress( hSSL, "SSL_accept" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_accept",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_set_cipher_list =
              GetProcAddress( hSSL, "SSL_set_cipher_list" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_set_cipher_list",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CTX_set_tmp_rsa_callback =
              GetProcAddress( hSSL, "SSL_CTX_set_tmp_rsa_callback" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_set_tmp_rsa_callback",rc);
        }
        if (((FARPROC) p_SSL_set_tmp_rsa_callback =
              GetProcAddress( hSSL, "SSL_set_tmp_rsa_callback" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_set_tmp_rsa_callback",rc);
        }
        if (((FARPROC) p_SSL_CTX_set_tmp_dh_callback =
              GetProcAddress( hSSL, "SSL_CTX_set_tmp_dh_callback" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_set_tmp_dh_callback",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_set_tmp_dh_callback =
              GetProcAddress( hSSL, "SSL_set_tmp_dh_callback" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_set_tmp_dh_callback",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CTX_load_verify_locations =
              GetProcAddress( hSSL, "SSL_CTX_load_verify_locations" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_load_verify_locations",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_CTX_set_default_passwd_cb_userdata =
              GetProcAddress( hSSL,
                    "SSL_CTX_set_default_passwd_cb_userdata" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_set_default_passwd_cb_userdata",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_get_wbio =
              GetProcAddress( hSSL, "SSL_get_wbio" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_get_wbio",rc);
            load_error = 1;
        }
        if (((FARPROC) p_SSL_get_finished =
              GetProcAddress( hSSL, "SSL_get_finished" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_get_finished",rc);
        }
        if (((FARPROC) p_SSL_get_peer_finished =
              GetProcAddress( hSSL, "SSL_get_peer_finished" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_get_peer_finished",rc);
        }
        if (((FARPROC) p_SSL_copy_session_id =
              GetProcAddress( hSSL, "SSL_copy_session_id" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_copy_session_id",rc);
        }
        if (((FARPROC) p_SSL_renegotiate =
              GetProcAddress( hSSL, "SSL_renegotiate" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_renegotiate",rc);
        }
        if (((FARPROC) p_SSL_get_session =
              GetProcAddress( hSSL, "SSL_get_session" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_get_session",rc);
        }
        if (((FARPROC) p_SSL_set_session =
              GetProcAddress( hSSL, "SSL_set_session" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_set_session",rc);
        }
        if (((FARPROC) p_SSL_CTX_set_session_id_context =
              GetProcAddress( hSSL, "SSL_CTX_set_session_id_context" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                  "SSL_CTX_set_session_id_context",rc);
        }
        if (((FARPROC) p_SSL_get_privatekey =
              GetProcAddress( hSSL, "SSL_get_priavatekey" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_get_privatekey",rc);
        }
        if (((FARPROC) p_SSL_get_certificate =
              GetProcAddress( hSSL, "SSL_get_certificate" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_get_certificate",rc);
        }
        if (((FARPROC) p_SSL_clear =
              GetProcAddress( hSSL, "SSL_clear" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_clear",rc);
        }
        if (((FARPROC) p_SSL_set_accept_state =
              GetProcAddress( hSSL, "SSL_set_accept_state" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_set_accept_state",rc);
        }
        if (((FARPROC) p_SSL_CIPHER_description =
              GetProcAddress( hSSL, "SSL_CIPHER_description" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CIPHER_description",rc);
        }
        if (((FARPROC) p_SSL_CTX_set_info_callback =
              GetProcAddress( hSSL, "SSL_CTX_set_info_callback" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_set_info_callback",rc);
        }

#ifdef SSL_KRB5
        if (((FARPROC) p_kssl_ctx_new =
              GetProcAddress( hSSL, "kssl_ctx_new" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "kssl_ctx_new",rc);
        }
        if (((FARPROC) p_kssl_ctx_free =
              GetProcAddress( hSSL, "kssl_ctx_free" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "kssl_ctx_free",rc);
        }
        if (((FARPROC) p_kssl_ctx_setstring =
              GetProcAddress( hSSL, "kssl_ctx_setstring" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "kssl_ctx_setstring",rc);
        }
        if (((FARPROC) p_kssl_ctx_setprinc =
              GetProcAddress( hSSL, "kssl_ctx_setprinc" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "kssl_ctx_setprinc",rc);
        }
#endif /* SSL_KRB5 */
        if (((FARPROC) p_SSL_COMP_add_compression_method =
              GetProcAddress( hSSL, "SSL_COMP_add_compression_method" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_COMP_add_compression_method",rc);
        }

        if ( load_error ) {
            ck_ssl_loaddll_eh();
            return 0;
        }
    }
#else /* NT */
    exe_path = GetLoadPath();
    sprintf(path, "%.*s%s.DLL", (int)get_dir_len(exe_path), exe_path,dllname);
    rc = DosLoadModule(errbuf, 256, path, &hSSL);
    if (rc) {
        debug(F111, "OpenSSL LoadLibrary failed",path,rc) ;
        rc = DosLoadModule(errbuf, 256, dllname, &hSSL);
    }
    if ( rc ) {
        debug(F111, "OpenSSL LoadLibrary failed",errbuf,rc) ;
        return(0);
    } else {
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_get_error",
                                  (PFN*) &p_SSL_get_error))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                  "SSL_get_error",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_read",
                                  (PFN*) &p_SSL_read))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_read",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_peek",
                                  (PFN*) &p_SSL_peek))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_peek",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_connect",
                                  (PFN*) &p_SSL_connect))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_connect",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_set_fd",
                                  (PFN*) &p_SSL_set_fd))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_set_fd",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_free",
                                  (PFN*) &p_SSL_free))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_free",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_shutdown",
                                  (PFN*) &p_SSL_shutdown))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_shutdown",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_write",
                                  (PFN*) &p_SSL_write))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_write",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_pending",
                                  (PFN*) &p_SSL_pending))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_pending",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_load_error_strings",
                                  (PFN*) &p_SSL_load_error_strings ))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_load_error_strings",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_get_peer_certificate",
                                  (PFN*) &p_SSL_get_peer_certificate))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_get_peer_certificate",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CIPHER_get_name",
                                  (PFN*) &p_SSL_CIPHER_get_name))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CIPHER_get_name",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CIPHER_get_bits",
                                  (PFN*) &p_SSL_CIPHER_get_bits))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CIPHER_get_bits",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CIPHER_get_version",
                                  (PFN*) &p_SSL_CIPHER_get_version))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CIPHER_get_version",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_get_current_cipher",
                                  (PFN*) &p_SSL_get_current_cipher))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_get_current_cipher",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_get_shared_ciphers",
                                  (PFN*) &p_SSL_get_shared_ciphers))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_get_shared_ciphers",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_get_ciphers",
                                  (PFN*) &p_SSL_get_ciphers))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_get_ciphers",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_get_cipher_list",
                                  (PFN*) &p_SSL_get_cipher_list))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_get_cipher_list",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CTX_set_default_verify_paths",
                                  (PFN*) &p_SSL_CTX_set_default_verify_paths))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_set_default_verify_paths",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_use_RSAPrivateKey_file",
                                  (PFN*) &p_SSL_use_RSAPrivateKey_file))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                  "SSL_use_RSAPrivateKey_file",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_use_PrivateKey_file",
                                  (PFN*) &p_SSL_use_PrivateKey_file))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_use_PrivateKey_file",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_use_certificate_file",
                                  (PFN*) &p_SSL_use_certificate_file))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_use_certificate_file",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CTX_use_PrivateKey_file",
                                  (PFN*) &p_SSL_CTX_use_PrivateKey_file))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CTX_use_PrivateKey_file",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CTX_use_certificate_file",
                                  (PFN*) &p_SSL_CTX_use_certificate_file))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_use_certificate_file",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CTX_use_certificate_chain_file",
                                  (PFN*) &p_SSL_CTX_use_certificate_chain_file))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_use_certificate_chain_file",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CTX_check_private_key",
                                  (PFN*) &p_SSL_CTX_check_private_key))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_check_private_key",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_check_private_key",
                                  (PFN*) &p_SSL_check_private_key))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_check_private_key",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_set_verify",
                                  (PFN*) &p_SSL_set_verify))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_set_verify",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CTX_set_verify",
                                  (PFN*) &p_SSL_CTX_set_verify))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CTX_set_verify",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_new",
                                  (PFN*) &p_SSL_new))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_new",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CTX_ctrl",
                                  (PFN*) &p_SSL_CTX_ctrl))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CTX_ctrl",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CTX_new",
                                  (PFN*) &p_SSL_CTX_new))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CTX_new",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CTX_free",
                                  (PFN*) &p_SSL_CTX_free))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CTX_free",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CTX_set_default_passwd_cb",
                                  (PFN*) &p_SSL_CTX_set_default_passwd_cb))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_CTX_set_default_passwd_cb",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSLv23_method",
                                  (PFN*) &p_SSLv23_method))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSLv23_method",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSLv3_method",
                                  (PFN*) &p_SSLv3_method))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSLv3_method",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "TLSv1_method",
                                  (PFN*) &p_TLSv1_method))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","TLSv1_method",rc);
            load_error = 1;
        }

        if (rc = DosQueryProcAddr( hSSL, 0, "SSLv23_client_method",
                                  (PFN*) &p_SSLv23_client_method))
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSLv23_client_method",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSLv3_client_method",
                                  (PFN*) &p_SSLv3_client_method) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSLv3_client_method",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "TLSv1_client_method",
                                  (PFN*) &p_TLSv1_client_method) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","TLSv1_client_method",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSLv23_server_method",
                                  (PFN*) &p_SSLv23_server_method) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSLv23_server_method",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSLv3_server_method",
                                  (PFN*) &p_SSLv3_server_method) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSLv3_server_method",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "TLSv1_server_method",
                                  (PFN*) &p_TLSv1_server_method) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","TLSv1_server_method",rc);
            load_error = 1;
        }

        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_library_init",
                                  (PFN*) &p_SSL_library_init) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_library_init",rc);

            if (rc = DosQueryProcAddr( hSSL, 0, "OpenSSL_add_ssl_algorithms",
                                      (PFN*) &p_SSL_library_init) )
            {
                debug(F111,"OpenSSL SSL GetProcAddress failed",
                       "OpenSSL_add_ssl_algorithms",rc);
                load_error = 1;
            }
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_state_string",
                                  (PFN*) &p_SSL_state_string) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_state_string",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_state_string_long",
                                  (PFN*) &p_SSL_state_string_long) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_state_string_long",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_accept",
                                  (PFN*) &p_SSL_accept) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_accept",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_set_cipher_list",
                                  (PFN*) &p_SSL_set_cipher_list) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed","SSL_set_cipher_list",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CTX_set_tmp_rsa_callback",
                                  (PFN*) &p_SSL_CTX_set_tmp_rsa_callback) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_set_tmp_rsa_callback",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_set_tmp_rsa_callback",
                                  (PFN*) &p_SSL_set_tmp_rsa_callback) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_set_tmp_rsa_callback",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CTX_set_tmp_dh_callback",
                                  (PFN*) &p_SSL_CTX_set_tmp_dh_callback) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_set_tmp_dh_callback",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_set_tmp_dh_callback",
                                  (PFN*) &p_SSL_set_tmp_dh_callback) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_set_tmp_dh_callback",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0, "SSL_CTX_load_verify_locations",
                                  (PFN*) &p_SSL_CTX_load_verify_locations) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_load_verify_locations",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0,
                                  "SSL_CTX_set_default_passwd_cb_userdata",
                                  (PFN*) &p_SSL_CTX_set_default_passwd_cb_userdata) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_set_default_passwd_cb_userdata",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0,
                                  "SSL_get_wbio",
                                  (PFN*) &p_SSL_get_wbio) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_get_wbio",rc);
            load_error = 1;
        }
        if (rc = DosQueryProcAddr( hSSL, 0,
                                  "SSL_get_finished",
                                  (PFN*) &p_SSL_get_finished) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_get_finished",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0,
                                  "SSL_get_peer_finished",
                                  (PFN*) &p_SSL_get_peer_finished) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_get_peer_finished",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0,
                                  "SSL_copy_session_id",
                                  (PFN*) &p_SSL_copy_session_id) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_copy_session_id",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0,
                                  "SSL_renegotiate",
                                  (PFN*) &p_SSL_renegotiate) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_renegotiate",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0,
                                  "SSL_get_session",
                                  (PFN*) &p_SSL_get_session) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_get_session",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0,
                                  "SSL_set_session",
                                  (PFN*) &p_SSL_set_session) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_set_session",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0,
                                  "SSL_CTX_set_session_id_context",
                                  (PFN*) &p_SSL_CTX_set_session_id_context) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CTX_set_session_id_context",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0,
                                  "SSL_get_privatekey",
                                  (PFN*) &p_SSL_get_privatekey) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_get_privatekey",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0,
                                  "SSL_get_certificate",
                                  (PFN*) &p_SSL_get_certificate) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_get_certificate",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0,
                                  "SSL_clear",
                                  (PFN*) &p_SSL_clear) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_clear",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0,
                                  "SSL_set_accept_state",
                                  (PFN*) &p_SSL_set_accept_state) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_set_accept_state",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0,
                                  "SSL_CIPHER_description",
                                  (PFN*) &p_SSL_CIPHER_description) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_CIPHER_description",rc);
        }
        if (rc = DosQueryProcAddr( hSSL, 0,
                                  "SSL_COMP_add_compression_method",
                                  (PFN*) &p_SSL_COMP_add_compression_method) )
        {
            debug(F111,"OpenSSL SSL GetProcAddress failed",
                   "SSL_COMP_add_compression_method",rc);
        }

        if ( load_error ) {
            ck_ssl_loaddll_eh();
            return 0;
        }
    }
#endif /* NT */

    ssl_dll_loaded = 1;
    if ( deblog ) {
        printf("OpenSSL DLLs Loaded\n");
        debug(F100,"OpenSSL DLLs Loaded","",0);
    }

    if ( p_SSL_get_finished &&
         p_SSL_get_peer_finished) {
        ssl_finished_messages = 1;
        if ( deblog ) {
            printf("OpenSSL Finished Messages available\n");
            debug(F100,"OpenSSL Finished Messages available","",0);
        }
    }

    /* Attempt to load a X509_to_user() function */
#ifdef NT
    hX5092UID = LoadLibrary("X5092UID");
    if ( hX5092UID ) {
        if (((FARPROC) p_X509_to_user =
              GetProcAddress( hX5092UID, "X509_to_user" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"X5092UID GetProcAddress failed","X509_to_user",rc);
        }
        if (((FARPROC) p_X509_userok =
              GetProcAddress( hX5092UID, "X509_userok" )) == NULL )
        {
            rc = GetLastError() ;
            debug(F111,"X5092UID GetProcAddress failed","X509_userok",rc);
        }
    }
#else /* NT */
    dllname = "X5092UID";
    sprintf(path, "%.*s%s.DLL", (int)get_dir_len(exe_path), exe_path,dllname);
    rc = DosLoadModule(errbuf, 256, path, &hX5092UID);
    if (rc) {
        debug(F111, "X5092UID LoadLibrary failed",path,rc) ;
        rc = DosLoadModule(errbuf, 256, dllname, &hX5092UID);
    }
    if ( !rc ) {
        if (rc = DosQueryProcAddr( hX5092UID, 0, "X509_to_user",
                                  (PFN*) &p_X509_to_user))
        {
            debug(F111,"X5092UID GetProcAddress failed",
                  "X509_to_user",rc);
        }
        if (rc = DosQueryProcAddr( hX5092UID, 0, "X509_userok",
                                  (PFN*) &p_X509_userok))
        {
            debug(F111,"X5092UID GetProcAddress failed",
                  "X509_userok",rc);
        }
    }
#endif /* NT */
    return(1);
}

int
ck_ssl_unloaddll( void )
{
    if ( !ssl_dll_loaded )
        return(1);

    /* unload dlls */
    ck_ssl_loaddll_eh();

    /* success */
    ssl_dll_loaded = 0;
    ssl_finished_messages = 0;
    return(1);
}
#endif /* SSLDLL */
#endif /* CK_SSL */
#endif /* OS2 */