diff options
author | wm4 <nfxjfg@googlemail.com> | 2015-05-26 19:25:42 +0200 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2015-05-26 21:48:51 +0300 |
commit | 57cde2b180fcec0eaf60aad65f436ab6420546f5 (patch) | |
tree | 8f11332b40ddf10dafd3b82a8fd2ac5141466c9f /libavformat/tls_openssl.c | |
parent | d8ffb2055f0e0fcb5d025bab72eb19c2a886c125 (diff) | |
download | ffmpeg-57cde2b180fcec0eaf60aad65f436ab6420546f5.tar.gz |
lavf: move TLS-related ifdeffery to library specific files
There is no need to have this mess in network.c.
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/tls_openssl.c')
-rw-r--r-- | libavformat/tls_openssl.c | 68 |
1 files changed, 66 insertions, 2 deletions
diff --git a/libavformat/tls_openssl.c b/libavformat/tls_openssl.c index 0fc4122394..a6d4a9ee34 100644 --- a/libavformat/tls_openssl.c +++ b/libavformat/tls_openssl.c @@ -25,14 +25,19 @@ #include "os_support.h" #include "url.h" #include "tls.h" +#include "libavcodec/internal.h" #include "libavutil/avstring.h" +#include "libavutil/avutil.h" #include "libavutil/opt.h" #include "libavutil/parseutils.h" +#include "libavutil/thread.h" #include <openssl/bio.h> #include <openssl/ssl.h> #include <openssl/err.h> +static int openssl_init; + typedef struct TLSContext { const AVClass *class; TLSShared tls_shared; @@ -40,6 +45,65 @@ typedef struct TLSContext { SSL *ssl; } TLSContext; +#if HAVE_THREADS +#include <openssl/crypto.h> +pthread_mutex_t *openssl_mutexes; +static void openssl_lock(int mode, int type, const char *file, int line) +{ + if (mode & CRYPTO_LOCK) + pthread_mutex_lock(&openssl_mutexes[type]); + else + pthread_mutex_unlock(&openssl_mutexes[type]); +} +#if !defined(WIN32) && OPENSSL_VERSION_NUMBER < 0x10000000 +static unsigned long openssl_thread_id(void) +{ + return (intptr_t) pthread_self(); +} +#endif +#endif + +void ff_openssl_init(void) +{ + avpriv_lock_avformat(); + if (!openssl_init) { + SSL_library_init(); + SSL_load_error_strings(); +#if HAVE_THREADS + if (!CRYPTO_get_locking_callback()) { + int i; + openssl_mutexes = av_malloc(sizeof(pthread_mutex_t) * CRYPTO_num_locks()); + for (i = 0; i < CRYPTO_num_locks(); i++) + pthread_mutex_init(&openssl_mutexes[i], NULL); + CRYPTO_set_locking_callback(openssl_lock); +#if !defined(WIN32) && OPENSSL_VERSION_NUMBER < 0x10000000 + CRYPTO_set_id_callback(openssl_thread_id); +#endif + } +#endif + } + openssl_init++; + avpriv_unlock_avformat(); +} + +void ff_openssl_deinit(void) +{ + avpriv_lock_avformat(); + openssl_init--; + if (!openssl_init) { +#if HAVE_THREADS + if (CRYPTO_get_locking_callback() == openssl_lock) { + int i; + CRYPTO_set_locking_callback(NULL); + for (i = 0; i < CRYPTO_num_locks(); i++) + pthread_mutex_destroy(&openssl_mutexes[i]); + av_free(openssl_mutexes); + } +#endif + } + avpriv_unlock_avformat(); +} + static int print_tls_error(URLContext *h, int ret) { av_log(h, AV_LOG_ERROR, "%s\n", ERR_error_string(ERR_get_error(), NULL)); @@ -57,7 +121,7 @@ static int tls_close(URLContext *h) SSL_CTX_free(c->ctx); if (c->tls_shared.tcp) ffurl_close(c->tls_shared.tcp); - ff_tls_deinit(); + ff_openssl_deinit(); return 0; } @@ -131,7 +195,7 @@ static int tls_open(URLContext *h, const char *uri, int flags, AVDictionary **op BIO *bio; int ret; - ff_tls_init(); + ff_openssl_init(); if ((ret = ff_tls_open_underlying(c, h, uri, options)) < 0) goto fail; |