LCOV - code coverage report
Current view: top level - ext/http - php_http_curl.c (source / functions) Hit Total Coverage
Test: PHP Code Coverage Lines: 6 7 85.7 %
Date: 2015-02-17 20:30:22 Functions: 2 2 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :     +--------------------------------------------------------------------+
       3             :     | PECL :: http                                                       |
       4             :     +--------------------------------------------------------------------+
       5             :     | Redistribution and use in source and binary forms, with or without |
       6             :     | modification, are permitted provided that the conditions mentioned |
       7             :     | in the accompanying LICENSE file are met.                          |
       8             :     +--------------------------------------------------------------------+
       9             :     | Copyright (c) 2004-2014, Michael Wallner <mike@php.net>            |
      10             :     +--------------------------------------------------------------------+
      11             : */
      12             : 
      13             : #include "php_http_api.h"
      14             : 
      15             : #if PHP_HTTP_HAVE_CURL
      16             : 
      17             : #if defined(ZTS) && defined(PHP_HTTP_HAVE_SSL)
      18             : #       ifdef PHP_WIN32
      19             : #               define PHP_HTTP_NEED_OPENSSL_TSL
      20             : #               include <openssl/crypto.h>
      21             : #       else /* !PHP_WIN32 */
      22             : #               if defined(PHP_HTTP_HAVE_OPENSSL)
      23             : #                       define PHP_HTTP_NEED_OPENSSL_TSL
      24             : #                       include <openssl/crypto.h>
      25             : #               elif defined(PHP_HTTP_HAVE_GNUTLS)
      26             : #                       define PHP_HTTP_NEED_GNUTLS_TSL
      27             : #                       include <gcrypt.h>
      28             : #               endif /* PHP_HTTP_HAVE_OPENSSL || PHP_HTTP_HAVE_GNUTLS */
      29             : #       endif /* PHP_WIN32 */
      30             : #endif /* ZTS && PHP_HTTP_HAVE_SSL */
      31             : 
      32             : 
      33             : #ifdef PHP_HTTP_NEED_OPENSSL_TSL
      34             : static MUTEX_T *php_http_openssl_tsl = NULL;
      35             : 
      36             : static void php_http_openssl_thread_lock(int mode, int n, const char * file, int line)
      37             : {
      38             :         if (mode & CRYPTO_LOCK) {
      39             :                 tsrm_mutex_lock(php_http_openssl_tsl[n]);
      40             :         } else {
      41             :                 tsrm_mutex_unlock(php_http_openssl_tsl[n]);
      42             :         }
      43             : }
      44             : 
      45             : static ulong php_http_openssl_thread_id(void)
      46             : {
      47             :         return (ulong) tsrm_thread_id();
      48             : }
      49             : #endif
      50             : #ifdef PHP_HTTP_NEED_GNUTLS_TSL
      51             : static int php_http_gnutls_mutex_create(void **m)
      52             : {
      53             :         if (*((MUTEX_T *) m) = tsrm_mutex_alloc()) {
      54             :                 return SUCCESS;
      55             :         } else {
      56             :                 return FAILURE;
      57             :         }
      58             : }
      59             : 
      60             : static int php_http_gnutls_mutex_destroy(void **m)
      61             : {
      62             :         tsrm_mutex_free(*((MUTEX_T *) m));
      63             :         return SUCCESS;
      64             : }
      65             : 
      66             : static int php_http_gnutls_mutex_lock(void **m)
      67             : {
      68             :         return tsrm_mutex_lock(*((MUTEX_T *) m));
      69             : }
      70             : 
      71             : static int php_http_gnutls_mutex_unlock(void **m)
      72             : {
      73             :         return tsrm_mutex_unlock(*((MUTEX_T *) m));
      74             : }
      75             : 
      76             : static struct gcry_thread_cbs php_http_gnutls_tsl = {
      77             :         GCRY_THREAD_OPTION_USER,
      78             :         NULL,
      79             :         php_http_gnutls_mutex_create,
      80             :         php_http_gnutls_mutex_destroy,
      81             :         php_http_gnutls_mutex_lock,
      82             :         php_http_gnutls_mutex_unlock
      83             : };
      84             : #endif
      85             : 
      86             : 
      87         374 : PHP_MINIT_FUNCTION(http_curl)
      88             : {
      89             : #ifdef PHP_HTTP_NEED_OPENSSL_TSL
      90             :         /* mod_ssl, libpq or ext/curl might already have set thread lock callbacks */
      91             :         if (!CRYPTO_get_id_callback()) {
      92             :                 int i, c = CRYPTO_num_locks();
      93             : 
      94             :                 php_http_openssl_tsl = malloc(c * sizeof(MUTEX_T));
      95             : 
      96             :                 for (i = 0; i < c; ++i) {
      97             :                         php_http_openssl_tsl[i] = tsrm_mutex_alloc();
      98             :                 }
      99             : 
     100             :                 CRYPTO_set_id_callback(php_http_openssl_thread_id);
     101             :                 CRYPTO_set_locking_callback(php_http_openssl_thread_lock);
     102             :         }
     103             : #endif
     104             : #ifdef PHP_HTTP_NEED_GNUTLS_TSL
     105             :         gcry_control(GCRYCTL_SET_THREAD_CBS, &php_http_gnutls_tsl);
     106             : #endif
     107             : 
     108         374 :         if (CURLE_OK != curl_global_init(CURL_GLOBAL_ALL)) {
     109           0 :                 return FAILURE;
     110             :         }
     111             : 
     112         374 :         return SUCCESS;
     113             : }
     114             : 
     115         374 : PHP_MSHUTDOWN_FUNCTION(http_curl)
     116             : {
     117         374 :         curl_global_cleanup();
     118             : #ifdef PHP_HTTP_NEED_OPENSSL_TSL
     119             :         if (php_http_openssl_tsl) {
     120             :                 int i, c = CRYPTO_num_locks();
     121             : 
     122             :                 CRYPTO_set_id_callback(NULL);
     123             :                 CRYPTO_set_locking_callback(NULL);
     124             : 
     125             :                 for (i = 0; i < c; ++i) {
     126             :                         tsrm_mutex_free(php_http_openssl_tsl[i]);
     127             :                 }
     128             : 
     129             :                 free(php_http_openssl_tsl);
     130             :                 php_http_openssl_tsl = NULL;
     131             :         }
     132             : #endif
     133         374 :         return SUCCESS;
     134             : }
     135             : 
     136             : #endif /* PHP_HTTP_HAVE_CURL */
     137             : 
     138             : /*
     139             :  * Local variables:
     140             :  * tab-width: 4
     141             :  * c-basic-offset: 4
     142             :  * End:
     143             :  * vim600: noet sw=4 ts=4 fdm=marker
     144             :  * vim<600: noet sw=4 ts=4
     145             :  */
     146             : 

Generated by: LCOV version 1.11