-
-/*****************************************************************************
- * gcrypt thread option VLC implementation:
- *****************************************************************************/
-vlc_object_t *__p_gcry_data;
-
-static int gcry_vlc_mutex_init( void **p_sys )
-{
- int i_val;
- vlc_mutex_t *p_lock = (vlc_mutex_t *)malloc( sizeof( vlc_mutex_t ) );
-
- if( p_lock == NULL)
- return ENOMEM;
-
- i_val = vlc_mutex_init( __p_gcry_data, p_lock );
- if( i_val )
- free( p_lock );
- else
- *p_sys = p_lock;
- return i_val;
-}
-
-static int gcry_vlc_mutex_destroy( void **p_sys )
-{
- int i_val;
- vlc_mutex_t *p_lock = (vlc_mutex_t *)*p_sys;
-
- i_val = vlc_mutex_destroy( p_lock );
- free( p_lock );
- return i_val;
-}
-
-static int gcry_vlc_mutex_lock( void **p_sys )
-{
- return vlc_mutex_lock( (vlc_mutex_t *)*p_sys );
-}
-
-static int gcry_vlc_mutex_unlock( void **lock )
-{
- return vlc_mutex_unlock( (vlc_mutex_t *)*lock );
-}
-
-static struct gcry_thread_cbs gcry_threads_vlc =
-{
- GCRY_THREAD_OPTION_USER,
- NULL,
- gcry_vlc_mutex_init,
- gcry_vlc_mutex_destroy,
- gcry_vlc_mutex_lock,
- gcry_vlc_mutex_unlock
-};
-
-
-/*****************************************************************************
- * Module initialization
- *****************************************************************************/
-static int
-Open( vlc_object_t *p_this )
-{
- tls_t *p_tls = (tls_t *)p_this;
-
- vlc_value_t lock, count;
-
- var_Create( p_this->p_libvlc, "gnutls_mutex", VLC_VAR_MUTEX );
- var_Get( p_this->p_libvlc, "gnutls_mutex", &lock );
- vlc_mutex_lock( lock.p_address );
-
- /* Initialize GnuTLS only once */
- var_Create( p_this->p_libvlc, "gnutls_count", VLC_VAR_INTEGER );
- var_Get( p_this->p_libvlc, "gnutls_count", &count);
-
- if( count.i_int == 0)
- {
- const char *psz_version;
-
- __p_gcry_data = VLC_OBJECT( p_this->p_vlc );
-
- gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_vlc);
- if( gnutls_global_init( ) )
- {
- msg_Warn( p_this, "cannot initialize GnuTLS" );
- vlc_mutex_unlock( lock.p_address );
- return VLC_EGENERIC;
- }
- /*
- * FIXME: in fact, we currently depends on 1.0.17, but it breaks on
- * Debian which as a patched 1.0.16 (which we can use).
- */
- psz_version = gnutls_check_version( "1.0.16" );
- if( psz_version == NULL )
- {
- gnutls_global_deinit( );
- vlc_mutex_unlock( lock.p_address );
- msg_Err( p_this, "unsupported GnuTLS version" );
- return VLC_EGENERIC;
- }
- msg_Dbg( p_this, "GnuTLS v%s initialized", psz_version );
- }
-
- count.i_int++;
- var_Set( p_this->p_libvlc, "gnutls_count", count);
- vlc_mutex_unlock( lock.p_address );
-
- p_tls->pf_server_create = gnutls_ServerCreate;
- p_tls->pf_client_create = gnutls_ClientCreate;
- return VLC_SUCCESS;
-}
-
-
-/*****************************************************************************
- * Module deinitialization
- *****************************************************************************/
-static void
-Close( vlc_object_t *p_this )