#include "http.h"
#include <vlc_plugin.h>
+#include <vlc_url.h>
+#include <vlc_fs.h>
#include <assert.h>
#define HANDLERS_LONGTEXT N_( \
"List of handler extensions and executable paths (for instance: " \
"php=/usr/bin/php,pl=/usr/bin/perl)." )
-#define ART_TEXT N_( "Export album art as /art." )
+#define ART_TEXT N_( "Export album art as /art" )
#define ART_LONGTEXT N_( \
"Allow exporting album art for current playlist items at the " \
"/art and /art?id=<id> URLs." )
#define CRL_TEXT N_( "CRL file" )
#define CRL_LONGTEXT N_( "HTTP interace Certificates Revocation List file." )
-vlc_module_begin();
- set_shortname( N_("HTTP"));
- set_description( N_("HTTP remote control interface") );
- set_category( CAT_INTERFACE );
- set_subcategory( SUBCAT_INTERFACE_MAIN );
- add_string ( "http-host", NULL, NULL, HOST_TEXT, HOST_LONGTEXT, true );
- add_string ( "http-src", NULL, NULL, SRC_TEXT, SRC_LONGTEXT, true );
- add_obsolete_string ( "http-charset" );
+vlc_module_begin ()
+ set_shortname( N_("HTTP"))
+ set_description( N_("HTTP remote control interface") )
+ set_category( CAT_INTERFACE )
+ set_subcategory( SUBCAT_INTERFACE_MAIN )
+ add_string ( "http-host", NULL, NULL, HOST_TEXT, HOST_LONGTEXT, true )
+ add_string ( "http-src", NULL, NULL, SRC_TEXT, SRC_LONGTEXT, true )
+ add_obsolete_string ( "http-charset" )
#if defined( HAVE_FORK ) || defined( WIN32 )
- add_string ( "http-handlers", NULL, NULL, HANDLERS_TEXT, HANDLERS_LONGTEXT, true );
+ add_string ( "http-handlers", NULL, NULL, HANDLERS_TEXT, HANDLERS_LONGTEXT, true )
#endif
- add_bool ( "http-album-art", false, NULL, ART_TEXT, ART_LONGTEXT, true );
- set_section( N_("HTTP SSL" ), 0 );
- add_string ( "http-intf-cert", NULL, NULL, CERT_TEXT, CERT_LONGTEXT, true );
- add_string ( "http-intf-key", NULL, NULL, KEY_TEXT, KEY_LONGTEXT, true );
- add_string ( "http-intf-ca", NULL, NULL, CA_TEXT, CA_LONGTEXT, true );
- add_string ( "http-intf-crl", NULL, NULL, CRL_TEXT, CRL_LONGTEXT, true );
- set_capability( "interface", 0 );
- set_callbacks( Open, Close );
-vlc_module_end();
+ add_bool ( "http-album-art", false, NULL, ART_TEXT, ART_LONGTEXT, true )
+ set_section( N_("HTTP SSL" ), 0 )
+ add_string ( "http-intf-cert", NULL, NULL, CERT_TEXT, CERT_LONGTEXT, true )
+ add_string ( "http-intf-key", NULL, NULL, KEY_TEXT, KEY_LONGTEXT, true )
+ add_string ( "http-intf-ca", NULL, NULL, CA_TEXT, CA_LONGTEXT, true )
+ add_string ( "http-intf-crl", NULL, NULL, CRL_TEXT, CRL_LONGTEXT, true )
+ set_capability( "interface", 0 )
+ set_callbacks( Open, Close )
+ add_shortcut( "http" )
+vlc_module_end ()
/*****************************************************************************
return( VLC_ENOMEM );
}
- p_sys->p_playlist = pl_Hold( p_this );
+ p_sys->p_playlist = pl_Get( p_this );
p_sys->p_input = NULL;
p_sys->p_vlm = NULL;
p_sys->psz_address = psz_address;
p_sys->i_handlers = 0;
p_sys->pp_handlers = NULL;
#if defined( HAVE_FORK ) || defined( WIN32 )
- psz_src = config_GetPsz( p_intf, "http-handlers" );
- if( psz_src != NULL && *psz_src )
+ psz_src = var_InheritString( p_intf, "http-handlers" );
+ if( psz_src != NULL )
{
char *p = psz_src;
while( p != NULL )
TAB_APPEND( p_sys->i_handlers, p_sys->pp_handlers, p_handler );
}
+ free( psz_src );
}
- free( psz_src );
#endif
/* determine SSL configuration */
- psz_cert = config_GetPsz( p_intf, "http-intf-cert" );
+ psz_cert = var_InheritString( p_intf, "http-intf-cert" );
if ( psz_cert != NULL )
{
msg_Dbg( p_intf, "enabling TLS for HTTP interface (cert file: %s)",
psz_cert );
- psz_key = var_GetNonEmptyString( p_intf, "http-intf-key" );
- psz_ca = var_GetNonEmptyString( p_intf, "http-intf-ca" );
- psz_crl = var_GetNonEmptyString( p_intf, "http-intf-crl" );
+ psz_key = var_InheritString( p_intf, "http-intf-key" );
+ psz_ca = var_InheritString( p_intf, "http-intf-ca" );
+ psz_crl = var_InheritString( p_intf, "http-intf-crl" );
if( i_port <= 0 )
i_port = 8443;
if( p_sys->p_httpd_host == NULL )
{
msg_Err( p_intf, "cannot listen on %s:%d", psz_address, i_port );
- pl_Release( p_this );
free( p_sys->psz_address );
free( p_sys );
return VLC_EGENERIC;
p_sys->i_files = 0;
p_sys->pp_files = NULL;
- psz_src = config_GetPsz( p_intf, "http-src" );
- if( ( psz_src == NULL ) || ( *psz_src == '\0' ) )
+ psz_src = var_InheritString( p_intf, "http-src" );
+ if( psz_src == NULL )
{
- const char *data_path = config_GetDataDir ();
+ char *data_path = config_GetDataDir( p_intf );
if( asprintf( &psz_src, "%s" DIR_SEP "http", data_path ) == -1 )
psz_src = NULL;
+ free( data_path );
}
- if( !psz_src || *psz_src == '\0' )
+ if( psz_src == NULL )
{
msg_Err( p_intf, "invalid web interface source directory" );
goto failed;
free( psz_src );
- if( config_GetInt( p_intf, "http-album-art" ) )
+ if( var_InheritInteger( p_intf, "http-album-art" ) )
{
/* FIXME: we're leaking h */
httpd_handler_sys_t *h = malloc( sizeof( httpd_handler_sys_t ) );
if( !h )
- {
- msg_Err( p_intf, "not enough memory to allocate album art handler" );
goto failed;
- }
h->file.p_intf = p_intf;
h->file.file = NULL;
h->file.name = NULL;
httpd_HostDelete( p_sys->p_httpd_host );
free( p_sys->psz_address );
free( p_sys );
- pl_Release( p_this );
return VLC_EGENERIC;
}
httpd_HostDelete( p_sys->p_httpd_host );
free( p_sys->psz_address );
free( p_sys );
- pl_Release( p_this );
}
/****************************************************************************
intf_sys_t *p_sys = p_args->p_intf->p_sys;
int i_request = p_request != NULL ? strlen( p_request ) : 0;
char *dst;
- vlc_value_t val;
char position[4]; /* percentage */
char time[12]; /* in seconds */
char length[12]; /* in seconds */
p_sys->p_input = playlist_CurrentInput( p_sys->p_playlist );
if( p_sys->p_input )
{
- var_Get( p_sys->p_input, "position", &val);
- sprintf( position, "%d" , (int)((val.f_float) * 100.0));
- var_Get( p_sys->p_input, "time", &val);
- sprintf( time, "%"PRIi64, (int64_t)val.i_time / INT64_C(1000000) );
- var_Get( p_sys->p_input, "length", &val);
- sprintf( length, "%"PRIi64, (int64_t)val.i_time / INT64_C(1000000) );
+ snprintf( position, sizeof(position), "%d",
+ (int)(var_GetFloat( p_sys->p_input, "position" ) * 100.));
+ snprintf( time, sizeof(time), "%"PRIi64,
+ var_GetTime( p_sys->p_input, "time" ) / CLOCK_FREQ );
+ snprintf( length, sizeof(length), "%"PRIi64,
+ var_GetTime( p_sys->p_input, "length" ) / CLOCK_FREQ );
- var_Get( p_sys->p_input, "state", &val );
- if( val.i_int == PLAYING_S )
- {
- state = "playing";
- }
- else if( val.i_int == OPENING_S )
- {
- state = "opening/connecting";
- }
- else if( val.i_int == BUFFERING_S )
- {
- state = "buffering";
- }
- else if( val.i_int == PAUSE_S )
- {
- state = "paused";
- }
- else
+ switch( var_GetInteger( p_sys->p_input, "state" ) )
{
- state = "stop";
+ case PLAYING_S: state = "playing"; break;
+ case OPENING_S: state = "opening/connecting"; break;
+ case PAUSE_S: state = "paused"; break;
+ default: state = "stop"; break;
}
}
else
{
- sprintf( position, "%d", 0 );
- sprintf( time, "%d", 0 );
- sprintf( length, "%d", 0 );
+ strcpy( position, "0" );
+ strcpy( time, "0" );
+ strcpy( length, "0" );
state = "stop";
}
- aout_VolumeGet( p_args->p_intf, &i_volume );
- sprintf( volume, "%d", (int)i_volume );
+ aout_VolumeGet( p_sys->p_playlist, &i_volume );
+ snprintf( volume, sizeof(volume), "%d", (int)i_volume );
p_args->vars = mvar_New( "variables", "" );
mvar_AppendNewVar( p_args->vars, "url_param",
mvar_AppendNewVar( p_args->vars, "vlc_compile_by", VLC_CompileBy() );
mvar_AppendNewVar( p_args->vars, "vlc_compile_host",
VLC_CompileHost() );
- mvar_AppendNewVar( p_args->vars, "vlc_compile_domain",
- VLC_CompileDomain() );
mvar_AppendNewVar( p_args->vars, "vlc_compiler", VLC_Compiler() );
- mvar_AppendNewVar( p_args->vars, "vlc_changeset", VLC_Changeset() );
mvar_AppendNewVar( p_args->vars, "stream_position", position );
mvar_AppendNewVar( p_args->vars, "stream_time", time );
mvar_AppendNewVar( p_args->vars, "stream_length", length );
char **pp_data = (char **)_pp_data;
FILE *f;
- if( ( f = utf8_fopen( p_args->file, "r" ) ) == NULL )
+ if( ( f = vlc_fopen( p_args->file, "r" ) ) == NULL )
{
Callback404( p_args, pp_data, pi_data );
return VLC_SUCCESS;
int i_env = 0;
char **ppsz_env = NULL;
char *psz_tmp;
- char sep;
size_t i_buffer;
char *p_buffer;
char *psz_cwd, *psz_file = NULL;
int i_ret;
-#ifdef WIN32
- sep = '\\';
-#else
- sep = '/';
-#endif
-
/* Create environment for the CGI */
TAB_APPEND( i_env, ppsz_env, strdup("GATEWAY_INTERFACE=CGI/1.1") );
TAB_APPEND( i_env, ppsz_env, strdup("SERVER_PROTOCOL=HTTP/1.1") );
- TAB_APPEND( i_env, ppsz_env, strdup("SERVER_SOFTWARE=" COPYRIGHT_MESSAGE) );
+ TAB_APPEND( i_env, ppsz_env, strdup("SERVER_SOFTWARE=VLC "VERSION) );
switch( i_type )
{
if( i_request )
{
- psz_tmp = malloc( sizeof("QUERY_STRING=") + i_request );
- sprintf( psz_tmp, "QUERY_STRING=%s", p_request );
+ if( -1==asprintf( &psz_tmp, "QUERY_STRING=%s", p_request ) )
+ psz_tmp = NULL;
TAB_APPEND( i_env, ppsz_env, psz_tmp );
- psz_tmp = malloc( sizeof("REQUEST_URI=?") + strlen(p_url)
- + i_request );
- sprintf( psz_tmp, "REQUEST_URI=%s?%s", p_url, p_request );
+ if( -1==asprintf( &psz_tmp, "REQUEST_URI=%s?%s", p_url, p_request ) )
+ psz_tmp = NULL;
TAB_APPEND( i_env, ppsz_env, psz_tmp );
}
else
{
- psz_tmp = malloc( sizeof("REQUEST_URI=") + strlen(p_url) );
- sprintf( psz_tmp, "REQUEST_URI=%s", p_url );
+ if( -1==asprintf( &psz_tmp, "REQUEST_URI=%s", p_url ) )
+ psz_tmp = NULL;
TAB_APPEND( i_env, ppsz_env, psz_tmp );
}
- psz_tmp = malloc( sizeof("SCRIPT_NAME=") + strlen(p_url) );
- sprintf( psz_tmp, "SCRIPT_NAME=%s", p_url );
+ if( -1==asprintf( &psz_tmp, "SCRIPT_NAME=%s", p_url ) )
+ psz_tmp = NULL;
TAB_APPEND( i_env, ppsz_env, psz_tmp );
#define p_sys p_args->file.p_intf->p_sys
- psz_tmp = malloc( sizeof("SERVER_NAME=") + strlen(p_sys->psz_address) );
- sprintf( psz_tmp, "SERVER_NAME=%s", p_sys->psz_address );
+ if( -1==asprintf( &psz_tmp, "SERVER_NAME=%s", p_sys->psz_address ) )
+ psz_tmp = NULL;
TAB_APPEND( i_env, ppsz_env, psz_tmp );
- psz_tmp = malloc( sizeof("SERVER_PORT=") + 5 );
- sprintf( psz_tmp, "SERVER_PORT=%u", p_sys->i_port );
+ if( -1==asprintf( &psz_tmp, "SERVER_PORT=%u", p_sys->i_port ) )
+ psz_tmp = NULL;
TAB_APPEND( i_env, ppsz_env, psz_tmp );
#undef p_sys
p = getenv( "PATH" );
if( p != NULL )
{
- psz_tmp = malloc( sizeof("PATH=") + strlen(p) );
- sprintf( psz_tmp, "PATH=%s", p );
+ if( -1==asprintf( &psz_tmp, "PATH=%s", p ) )
+ psz_tmp = NULL;
TAB_APPEND( i_env, ppsz_env, psz_tmp );
}
p = getenv( "windir" );
if( p != NULL )
{
- psz_tmp = malloc( sizeof("SYSTEMROOT=") + strlen(p) );
- sprintf( psz_tmp, "SYSTEMROOT=%s", p );
+ if( -1==asprintf( &psz_tmp, "SYSTEMROOT=%s", p ) )
+ psz_tmp = NULL;
TAB_APPEND( i_env, ppsz_env, psz_tmp );
}
#endif
if( psz_remote_addr != NULL && *psz_remote_addr )
{
- psz_tmp = malloc( sizeof("REMOTE_ADDR=") + strlen(psz_remote_addr) );
- sprintf( psz_tmp, "REMOTE_ADDR=%s", psz_remote_addr );
+ if( -1==asprintf( &psz_tmp, "REMOTE_ADDR=%s", psz_remote_addr ) )
+ psz_tmp = NULL;
TAB_APPEND( i_env, ppsz_env, psz_tmp );
}
if( psz_remote_host != NULL && *psz_remote_host )
{
- psz_tmp = malloc( sizeof("REMOTE_HOST=") + strlen(psz_remote_host) );
- sprintf( psz_tmp, "REMOTE_HOST=%s", psz_remote_host );
+ if( -1==asprintf( &psz_tmp, "REMOTE_HOST=%s", psz_remote_host ) )
+ psz_tmp = NULL;
TAB_APPEND( i_env, ppsz_env, psz_tmp );
}
if( end == NULL )
break;
*end = '\0';
- psz_tmp = malloc( sizeof("CONTENT_TYPE=") + strlen(p) );
- sprintf( psz_tmp, "CONTENT_TYPE=%s", p );
+ if( -1==asprintf( &psz_tmp, "CONTENT_TYPE=%s", p ) )
+ psz_tmp = NULL;
TAB_APPEND( i_env, ppsz_env, psz_tmp );
*end = '\r';
}
if( end == NULL )
break;
*end = '\0';
- psz_tmp = malloc( sizeof("CONTENT_LENGTH=") + strlen(p) );
- sprintf( psz_tmp, "CONTENT_LENGTH=%s", p );
+ if( -1==asprintf( &psz_tmp, "CONTENT_LENGTH=%s", p ) )
+ psz_tmp = NULL;
TAB_APPEND( i_env, ppsz_env, psz_tmp );
*end = '\r';
}
}
}
- psz_file = strrchr( p_args->file.file, sep );
+ psz_file = strrchr( p_args->file.file, DIR_SEP_CHAR );
if( psz_file != NULL )
{
psz_file++;
- psz_tmp = malloc( sizeof("SCRIPT_FILENAME=") + strlen(psz_file) );
- sprintf( psz_tmp, "SCRIPT_FILENAME=%s", psz_file );
+ if( -1==asprintf( &psz_tmp, "SCRIPT_FILENAME=%s", psz_file ) )
+ psz_tmp = NULL;
TAB_APPEND( i_env, ppsz_env, psz_tmp );
TAB_APPEND( p_args->p_association->i_argc,
NULL );
psz_tmp = strdup( p_args->file.file );
- p = strrchr( psz_tmp, sep );
+ p = strrchr( psz_tmp, DIR_SEP_CHAR );
if( p != NULL )
{
*p = '\0';
i_id = atoi( psz_id );
if( i_id )
{
+ playlist_Lock( p_sys->p_playlist );
playlist_item_t *p_pl_item = playlist_ItemGetById( p_sys->p_playlist,
- i_id, false );
+ i_id );
if( p_pl_item )
p_item = p_pl_item->p_input;
+ playlist_Unlock( p_sys->p_playlist );
}
else
{
psz_art = input_item_GetArtURL( p_item );
}
- if( psz_art && !strncmp( psz_art, "file://", strlen( "file://" ) ) )
+ if( psz_art )
{
- FILE *f;
- char *psz_ext;
- char *psz_header;
- char *p_data = NULL;
- int i_header_size, i_data;
+ char *psz = make_path( psz_art );
+ free( psz_art );
+ psz_art = psz;
+ }
- if( ( f = utf8_fopen( psz_art + strlen( "file://" ), "r" ) ) == NULL )
- {
- msg_Dbg( p_intf, "Couldn't open album art file %s",
- psz_art + strlen( "file://" ) );
- Callback404( &p_args->file, (char**)pp_data, pi_data );
- free( psz_art );
- return VLC_SUCCESS;
- }
+ if( psz_art == NULL )
+ {
+ msg_Dbg( p_intf, "No album art found" );
+ Callback404( &p_args->file, (char**)pp_data, pi_data );
+ return VLC_SUCCESS;
+ }
- FileLoad( f, &p_data, &i_data );
+ FILE *f = vlc_fopen( psz_art, "r" );
+ if( f == NULL )
+ {
+ msg_Dbg( p_intf, "Couldn't open album art file %s", psz_art );
+ Callback404( &p_args->file, (char**)pp_data, pi_data );
+ free( psz_art );
+ return VLC_SUCCESS;
+ }
+ free( psz_art );
- fclose( f );
+ char *p_data = NULL;
+ int i_data;
+ FileLoad( f, &p_data, &i_data );
+ fclose( f );
- psz_ext = strrchr( psz_art, '.' );
- if( psz_ext ) psz_ext++;
+ char *psz_ext = strrchr( psz_art, '.' );
+ if( psz_ext ) psz_ext++;
#define HEADER "Content-Type: image/%s\n" \
"Content-Length: %d\n" \
"\n"
- i_header_size = asprintf( &psz_header, HEADER, psz_ext, i_data );
+ char *psz_header;
+ int i_header_size = asprintf( &psz_header, HEADER, psz_ext, i_data );
#undef HEADER
-
- *pi_data = i_header_size + i_data;
- *pp_data = (uint8_t*)malloc( *pi_data );
- memcpy( *pp_data, psz_header, i_header_size );
- memcpy( *pp_data+i_header_size, p_data, i_data );
- free( psz_header );
- free( p_data );
- }
- else
+ if( likely(i_header_size != -1) )
{
- msg_Dbg( p_intf, "No album art found" );
- Callback404( &p_args->file, (char**)pp_data, pi_data );
+ *pp_data = malloc( i_header_size + i_data );
+ if( likely(*pp_data != NULL) )
+ {
+ *pi_data = i_header_size + i_data;
+ memcpy( *pp_data, psz_header, i_header_size );
+ memcpy( *pp_data+i_header_size, p_data, i_data );
+ }
+ free( psz_header );
}
-
- free( psz_art );
+ free( p_data );
return VLC_SUCCESS;
}