/*****************************************************************************
* Various functions
*****************************************************************************/
-static struct
+static const struct
{
const char psz_ext[8];
const char *psz_mime;
/*****************************************************************************
* Low level
*****************************************************************************/
-static void httpd_HostThread( httpd_host_t * );
+static void* httpd_HostThread( vlc_object_t * );
/* create a new host */
httpd_host_t *httpd_HostNew( vlc_object_t *p_this, const char *psz_host,
psz_host = strdup( psz_hostname );
if( psz_host == NULL )
- {
- msg_Err( p_this, "memory error" );
return NULL;
- }
/* to be sure to avoid multiple creation */
var_Create( p_this->p_libvlc, "httpd_mutex", VLC_VAR_MUTEX );
ptrval.p_address = httpd;
libvlc_priv (p_this->p_libvlc)->p_httpd = httpd;
- vlc_object_yield( httpd );
+ vlc_object_hold( httpd );
vlc_object_attach( httpd, p_this->p_libvlc );
}
/* create the new host */
host = (httpd_host_t *)vlc_custom_create( p_this, sizeof (*host),
- VLC_OBJECT_HTTPD_HOST,
+ VLC_OBJECT_GENERIC,
psz_object_type );
if (host == NULL)
goto error;
free( psz_host );
if( httpd->i_host <= 0 )
{
+ libvlc_priv (httpd->p_libvlc)->p_httpd = NULL;
vlc_object_release( httpd );
vlc_object_detach( httpd );
vlc_object_release( httpd );
return cl;
}
-static int httpd_NetRecv( httpd_client_t *cl, uint8_t *p, int i_len )
+static
+ssize_t httpd_NetRecv (httpd_client_t *cl, uint8_t *p, size_t i_len)
{
tls_session_t *p_tls;
+ ssize_t val;
p_tls = cl->p_tls;
- if( p_tls != NULL)
- return tls_Recv( p_tls, p, i_len );
-
- return recv( cl->fd, p, i_len, 0 );
+ do
+ val = p_tls ? tls_Recv (p_tls, p, i_len)
+ : recv (cl->fd, p, i_len, 0);
+ while (val == -1 && errno == EINTR);
+ return val;
}
-static int httpd_NetSend( httpd_client_t *cl, const uint8_t *p, int i_len )
+static
+ssize_t httpd_NetSend (httpd_client_t *cl, const uint8_t *p, size_t i_len)
{
tls_session_t *p_tls;
+ ssize_t val;
p_tls = cl->p_tls;
- if( p_tls != NULL)
- return tls_Send( p_tls, p, i_len );
-
- return send( cl->fd, p, i_len, 0 );
+ do
+ val = p_tls ? tls_Send( p_tls, p, i_len )
+ : send (cl->fd, p, i_len, 0);
+ while (val == -1 && errno == EINTR);
+ return val;
}
#if defined( WIN32 ) || defined( UNDER_CE )
if( ( i_len < 0 && WSAGetLastError() != WSAEWOULDBLOCK ) || ( i_len == 0 ) )
#else
- if( ( i_len < 0 && errno != EAGAIN && errno != EINTR ) || ( i_len == 0 ) )
+ if( ( i_len < 0 && errno != EAGAIN ) || ( i_len == 0 ) )
#endif
{
if( cl->query.i_proto != HTTPD_PROTO_NONE && cl->query.i_type != HTTPD_MSG_NONE )
#if defined( WIN32 ) || defined( UNDER_CE )
if( ( i_len < 0 && WSAGetLastError() != WSAEWOULDBLOCK ) || ( i_len == 0 ) )
#else
- if( ( i_len < 0 && errno != EAGAIN && errno != EINTR ) || ( i_len == 0 ) )
+ if( ( i_len < 0 && errno != EAGAIN ) || ( i_len == 0 ) )
#endif
{
/* error */
}
}
-static void httpd_HostThread( httpd_host_t *host )
+static void* httpd_HostThread( vlc_object_t *p_this )
{
+ httpd_host_t *host = (httpd_host_t *)p_this;
tls_session_t *p_tls = NULL;
counter_t *p_total_counter = stats_CounterCreate( host, VLC_VAR_INTEGER, STATS_COUNTER );
counter_t *p_active_counter = stats_CounterCreate( host, VLC_VAR_INTEGER, STATS_COUNTER );
int evfd;
bool b_die;
+ int canc = vlc_savecancel ();
retry:
vlc_object_lock( host );
}
if( ( ( cl->query.i_proto == HTTPD_PROTO_HTTP ) &&
- ( ( cl->answer.i_version == 0 && b_keepalive ) ||
- ( cl->answer.i_version == 1 && !b_connection ) ) ) ||
+ ( ( cl->query.i_version == 0 && b_keepalive ) ||
+ ( cl->query.i_version == 1 && !b_connection ) ) ) ||
( ( cl->query.i_proto == HTTPD_PROTO_RTSP ) &&
!b_query && !b_connection ) )
{
stats_CounterClean( p_total_counter );
if( p_active_counter )
stats_CounterClean( p_active_counter );
+ vlc_restorecancel (canc);
+ return NULL;
}
#else /* ENABLE_HTTPD */