---- a/src/ptclib/pssl.cxx 2017-03-28 14:35:23.261060113 +0200
-+++ b/src/ptclib/pssl.cxx 2017-03-28 14:30:20.593853443 +0200
-@@ -140,7 +140,7 @@
- class PSSL_BIO
- {
- public:
-- PSSL_BIO(BIO_METHOD *method = BIO_s_file_internal())
-+ PSSL_BIO(const BIO_METHOD *method = BIO_s_file())
- { bio = BIO_new(method); }
-
- ~PSSL_BIO()
-@@ -627,9 +627,10 @@
- if (dh == NULL)
- return;
-
-- dh->p = BN_bin2bn(pData, pSize, NULL);
-- dh->g = BN_bin2bn(gData, gSize, NULL);
-- if (dh->p != NULL && dh->g != NULL)
-+ BIGNUM *p = BN_bin2bn(pData, pSize, NULL);
-+ BIGNUM *g = BN_bin2bn(gData, gSize, NULL);
-+ DH_set0_pqg(dh, p, NULL, g);
-+ if (p != NULL && p != NULL)
- return;
-
- DH_free(dh);
-@@ -1115,7 +1116,7 @@
- //
-
-
--#define PSSLCHANNEL(bio) ((PSSLChannel *)(bio->ptr))
-+#define PSSLCHANNEL(bio) ((PSSLChannel *)BIO_get_data(bio))
-
- extern "C" {
-
-@@ -1128,10 +1129,9 @@
-
- static int Psock_new(BIO * bio)
- {
-- bio->init = 0;
-- bio->num = 0;
-- bio->ptr = NULL; // this is really (PSSLChannel *)
-- bio->flags = 0;
-+ BIO_set_init(bio, 0);
-+ BIO_set_data(bio, NULL);
-+ BIO_clear_flags(bio, ~0);
-
- return(1);
- }
-@@ -1142,13 +1142,13 @@
- if (bio == NULL)
- return 0;
-
-- if (bio->shutdown) {
-- if (bio->init) {
-+ if (BIO_get_shutdown(bio)) {
-+ if (BIO_get_init(bio)) {
- PSSLCHANNEL(bio)->Shutdown(PSocket::ShutdownReadAndWrite);
- PSSLCHANNEL(bio)->Close();
- }
-- bio->init = 0;
-- bio->flags = 0;
-+ BIO_set_init(bio, 0);
-+ BIO_clear_flags(bio, ~0);
- }
- return 1;
- }
-@@ -1158,11 +1158,11 @@
- {
- switch (cmd) {
- case BIO_CTRL_SET_CLOSE:
-- bio->shutdown = (int)num;
-+ BIO_set_shutdown(bio, (int)num);
- return 1;
-
- case BIO_CTRL_GET_CLOSE:
-- return bio->shutdown;
-+ return BIO_get_shutdown(bio);
-
- case BIO_CTRL_FLUSH:
- return 1;
-@@ -1237,7 +1237,8 @@
- };
-
-
--static BIO_METHOD methods_Psock =
-+static BIO_METHOD *methods_Psock = NULL;
-+/*
- {
- BIO_TYPE_SOCKET,
- "PTLib-PSSLChannel",
-@@ -1259,19 +1260,33 @@
- Psock_free
- #endif
- };
--
-+*/
-
- PBoolean PSSLChannel::OnOpen()
- {
-- BIO * bio = BIO_new(&methods_Psock);
-+ if (methods_Psock == NULL) {
-+ methods_Psock = BIO_meth_new(BIO_TYPE_SOCKET | BIO_get_new_index(), "PTLib-PSSLChannel");
-+ if (methods_Psock == NULL ||
-+ BIO_meth_set_write(methods_Psock, Psock_write) ||
-+ BIO_meth_set_read(methods_Psock, Psock_read) ||
-+ BIO_meth_set_puts(methods_Psock, Psock_puts) ||
-+ BIO_meth_set_gets(methods_Psock, NULL) ||
-+ BIO_meth_set_ctrl(methods_Psock, Psock_ctrl) ||
-+ BIO_meth_set_create(methods_Psock, Psock_new) ||
-+ BIO_meth_set_destroy(methods_Psock, Psock_free)) {
-+ SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB);
-+ return PFalse;
-+ }
-+ }
-+ BIO * bio = BIO_new(methods_Psock);
- if (bio == NULL) {
- SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB);
- return PFalse;
- }
-
- // "Open" then bio
-- bio->ptr = this;
-- bio->init = 1;
-+ BIO_set_data(bio, this);
-+ BIO_set_init(bio, 1);
-
- SSL_set_bio(ssl, bio, bio);
- return PTrue;