X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http.c;h=a174960db9ff46d018feda0ffb76ab67a1b795a4;hp=97899774f9f3a764f325d053bf076ecbb1476c0b;hb=b562e34cf4f8c8fae7b8fe773e0eed71592b09c2;hpb=d83edb65a0097de2d5baa1a9fd9dbcebed34cc79 diff --git a/http.c b/http.c index 9789977..a174960 100644 --- a/http.c +++ b/http.c @@ -52,6 +52,14 @@ #include "phpstr/phpstr.h" #ifdef HTTP_HAVE_CURL +# if defined(ZTS) && defined(HTTP_HAVE_SSL) +# if !defined(HAVE_OPENSSL_CRYPTO_H) +# error "libcurl was compiled with OpenSSL support, but we have no crypto.h" +# else +# define HTTP_NEED_SSL +# include +# endif +# endif # ifdef PHP_WIN32 # include # endif @@ -250,6 +258,51 @@ PHP_INI_BEGIN() PHP_INI_END() /* }}} */ +/* {{{ SSL */ +#ifdef HTTP_NEED_SSL + +static MUTEX_T *http_ssl_mutex = NULL; + +static void http_ssl_lock(int mode, int n, const char * file, int line) +{ + if (mode & CRYPTO_LOCK) { + tsrm_mutex_lock(http_ssl_mutex[n]); + } else { + tsrm_mutex_unlock(http_ssl_mutex[n]); + } +} +static unsigned long http_ssl_id(void) +{ + return (unsigned long) tsrm_thread_id(); +} +static inline void http_ssl_init(void) +{ + int i, c = CRYPTO_num_locks(); + http_ssl_mutex = malloc(c * sizeof(MUTEX_T)); + + for (i = 0; i < c; ++i) { + http_ssl_mutex[i] = tsrm_mutex_alloc(); + } + + CRYPTO_set_id_callback(http_ssl_id); + CRYPTO_set_locking_callback(http_ssl_lock); +} +static inline void http_ssl_cleanup(void) +{ + int i, c = CRYPTO_num_locks(); + + CRYPTO_set_id_callback(NULL); + CRYPTO_set_locking_callback(NULL); + + for (i = 0; i < c; ++i) { + tsrm_mutex_free(http_ssl_mutex[i]); + } + + free(http_ssl_mutex); + http_ssl_mutex = NULL; +} +#endif +/* }}} */ /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(http) @@ -265,7 +318,14 @@ PHP_MINIT_FUNCTION(http) HTTP_LONG_CONSTANT("HTTP_ETAG_MHASH", HTTP_ETAG_MHASH); #ifdef HTTP_HAVE_CURL - if (CURLE_OK != curl_global_init(CURL_GLOBAL_ALL)) { + if (CURLE_OK == curl_global_init(CURL_GLOBAL_ALL)) { +# ifdef HTTP_NEED_SSL + curl_version_info_data *cvid = curl_version_info(CURLVERSION_NOW); + if (cvid && (cvid->features & CURL_VERSION_SSL)) { + http_ssl_init(); + } +# endif + } else { return FAILURE; } #endif /* HTTP_HAVE_CURL */ @@ -293,6 +353,11 @@ PHP_MSHUTDOWN_FUNCTION(http) UNREGISTER_INI_ENTRIES(); #ifdef HTTP_HAVE_CURL curl_global_cleanup(); +# ifdef HTTP_NEED_SSL + if (http_ssl_mutex) { + http_ssl_cleanup(); + } +# endif #endif return SUCCESS; }