]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/network.c
random_seed: Only read /dev/*random if we have unistd.h
[ffmpeg] / libavformat / network.c
index 6ef609f2ed87d197a8146c1ad9dc449087181ebb..c2f7a9b0de6745fb9d402e8b82e164d074b8c914 100644 (file)
@@ -45,7 +45,7 @@ static void openssl_lock(int mode, int type, const char *file, int line)
     else
         pthread_mutex_unlock(&openssl_mutexes[type]);
 }
-#ifndef WIN32
+#if !defined(WIN32) && OPENSSL_VERSION_NUMBER < 0x10000000
 static unsigned long openssl_thread_id(void)
 {
     return (intptr_t) pthread_self();
@@ -53,6 +53,16 @@ static unsigned long openssl_thread_id(void)
 #endif
 #endif
 #endif
+#if CONFIG_GNUTLS
+#include <gnutls/gnutls.h>
+#if THREADS && GNUTLS_VERSION_NUMBER <= 0x020b00
+#include <gcrypt.h>
+#include <errno.h>
+#undef malloc
+#undef free
+GCRY_THREAD_OPTION_PTHREAD_IMPL;
+#endif
+#endif
 
 void ff_tls_init(void)
 {
@@ -68,13 +78,20 @@ void ff_tls_init(void)
             for (i = 0; i < CRYPTO_num_locks(); i++)
                 pthread_mutex_init(&openssl_mutexes[i], NULL);
             CRYPTO_set_locking_callback(openssl_lock);
-#ifndef WIN32
+#if !defined(WIN32) && OPENSSL_VERSION_NUMBER < 0x10000000
             CRYPTO_set_id_callback(openssl_thread_id);
 #endif
         }
 #endif
     }
     openssl_init++;
+#endif
+#if CONFIG_GNUTLS
+#if THREADS && GNUTLS_VERSION_NUMBER < 0x020b00
+    if (gcry_control(GCRYCTL_ANY_INITIALIZATION_P) == 0)
+        gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
+#endif
+    gnutls_global_init();
 #endif
     avpriv_unlock_avformat();
 }
@@ -95,14 +112,27 @@ void ff_tls_deinit(void)
         }
 #endif
     }
+#endif
+#if CONFIG_GNUTLS
+    gnutls_global_deinit();
 #endif
     avpriv_unlock_avformat();
 }
 
+int ff_network_inited_globally;
+
 int ff_network_init(void)
 {
 #if HAVE_WINSOCK2_H
     WSADATA wsaData;
+#endif
+
+    if (!ff_network_inited_globally)
+        av_log(NULL, AV_LOG_WARNING, "Using network protocols without global "
+                                     "network initialization. Please use "
+                                     "avformat_network_init(), this will "
+                                     "become mandatory later.\n");
+#if HAVE_WINSOCK2_H
     if (WSAStartup(MAKEWORD(1,1), &wsaData))
         return 0;
 #endif
@@ -134,6 +164,14 @@ int ff_neterrno(void)
         return AVERROR(EAGAIN);
     case WSAEINTR:
         return AVERROR(EINTR);
+    case WSAEPROTONOSUPPORT:
+        return AVERROR(EPROTONOSUPPORT);
+    case WSAETIMEDOUT:
+        return AVERROR(ETIMEDOUT);
+    case WSAECONNREFUSED:
+        return AVERROR(ECONNREFUSED);
+    case WSAEINPROGRESS:
+        return AVERROR(EINPROGRESS);
     }
     return -err;
 }
@@ -152,4 +190,3 @@ int ff_is_multicast_address(struct sockaddr *addr)
 
     return 0;
 }
-