+/*****************************************************************************
+ * TLS session resumption callbacks
+ *****************************************************************************/
+static int cb_store( void *p_server, gnutls_datum key, gnutls_datum data )
+{
+ tls_server_sys_t *p_sys = ((tls_server_t *)p_server)->p_sys;
+
+ if( ( p_sys->i_cache_size == 0 )
+ || ( key.size > MAX_SESSION_ID )
+ || ( data.size > MAX_SESSION_DATA ) )
+ return -1;
+
+ vlc_mutex_lock( &p_sys->cache_lock );
+
+ memcpy( p_sys->p_store->id, key.data, key.size);
+ memcpy( p_sys->p_store->data, data.data, data.size );
+ p_sys->p_store->i_idlen = key.size;
+ p_sys->p_store->i_datalen = data.size;
+
+ p_sys->p_store++;
+ if( ( p_sys->p_store - p_sys->p_cache ) == p_sys->i_cache_size )
+ p_sys->p_store = p_sys->p_cache;
+
+ vlc_mutex_unlock( &p_sys->cache_lock );
+
+ return 0;
+}
+
+
+static const gnutls_datum err_datum = { NULL, 0 };
+
+static gnutls_datum cb_fetch( void *p_server, gnutls_datum key )
+{
+ tls_server_sys_t *p_sys = ((tls_server_t *)p_server)->p_sys;
+ saved_session_t *p_session, *p_end;
+
+ p_session = p_sys->p_cache;
+ p_end = p_session + p_sys->i_cache_size;
+
+ vlc_mutex_lock( &p_sys->cache_lock );
+
+ while( p_session < p_end )
+ {
+ if( ( p_session->i_idlen == key.size )
+ && !memcmp( p_session->id, key.data, key.size ) )
+ {
+ gnutls_datum data;
+
+ data.size = p_session->i_datalen;
+
+ data.data = gnutls_malloc( data.size );
+ if( data.data == NULL )
+ {
+ vlc_mutex_unlock( &p_sys->cache_lock );
+ return err_datum;
+ }
+
+ memcpy( data.data, p_session->data, data.size );
+ vlc_mutex_unlock( &p_sys->cache_lock );
+ return data;
+ }
+ p_session++;
+ }
+
+ vlc_mutex_unlock( &p_sys->cache_lock );
+
+ return err_datum;
+}
+
+
+static int cb_delete( void *p_server, gnutls_datum key )
+{
+ tls_server_sys_t *p_sys = ((tls_server_t *)p_server)->p_sys;
+ saved_session_t *p_session, *p_end;
+
+ p_session = p_sys->p_cache;
+ p_end = p_session + p_sys->i_cache_size;
+
+ vlc_mutex_lock( &p_sys->cache_lock );
+
+ while( p_session < p_end )
+ {
+ if( ( p_session->i_idlen == key.size )
+ && !memcmp( p_session->id, key.data, key.size ) )
+ {
+ p_session->i_datalen = p_session->i_idlen = 0;
+ vlc_mutex_unlock( &p_sys->cache_lock );
+ return 0;
+ }
+ p_session++;
+ }
+
+ vlc_mutex_unlock( &p_sys->cache_lock );
+
+ return -1;
+}
+
+