X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Fvlmshell.c;h=9c254347f3454c925a53e89c59a43f56d0a5ed94;hb=f96f02d9958fefa8381106084eb2b114b3cc544e;hp=fba07746f11e7d836860cccfcd4cc9d1a21124d3;hpb=f6cecfc93bd3b0fe10141d2f928b2a1da9ff4e19;p=vlc diff --git a/src/input/vlmshell.c b/src/input/vlmshell.c index fba07746f1..9c254347f3 100644 --- a/src/input/vlmshell.c +++ b/src/input/vlmshell.c @@ -1,26 +1,26 @@ /***************************************************************************** - * vlm.c: VLM interface plugin + * vlmshell.c: VLM interface plugin ***************************************************************************** - * Copyright (C) 2000-2005 the VideoLAN team + * Copyright (C) 2000-2005 VLC authors and VideoLAN * $Id$ * * Authors: Simon Latapie * Laurent Aimar * Gildas Bazin * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -49,6 +49,7 @@ #include #include #include +#include #include "../stream_output/stream_output.h" #include "../libvlc.h" @@ -79,7 +80,7 @@ static const char quotes[] = "\"'"; */ static const char *FindCommandEnd( const char *psz_sent ) { - char c, quote = 0; + unsigned char c, quote = 0; while( (c = *psz_sent) != '\0' ) { @@ -126,7 +127,7 @@ static const char *FindCommandEnd( const char *psz_sent ) */ static int Unescape( char *out, const char *in ) { - char c, quote = 0; + unsigned char c, quote = 0; bool param = false; while( (c = *in++) != '\0' ) @@ -459,43 +460,6 @@ static int ExecuteControl( vlm_t *p_vlm, const char *psz_name, const int i_arg, i_result = VLC_EGENERIC; } } - else if( !strcmp( psz_control, "rewind" ) ) - { - if( psz_argument ) - { - const double d_scale = us_atof( psz_argument ); - double d_position; - - vlm_ControlInternal( p_vlm, VLM_GET_MEDIA_INSTANCE_POSITION, p_media->cfg.id, psz_instance, &d_position ); - d_position -= (d_scale / 1000.0); - if( d_position < 0.0 ) - d_position = 0.0; - i_result = vlm_ControlInternal( p_vlm, VLM_SET_MEDIA_INSTANCE_POSITION, p_media->cfg.id, psz_instance, d_position ); - } - else - { - i_result = VLC_EGENERIC; - } - } - else if( !strcmp( psz_control, "forward" ) ) - { - if( psz_argument ) - { - const double d_scale = us_atof( psz_argument ); - double d_position; - - vlm_ControlInternal( p_vlm, VLM_GET_MEDIA_INSTANCE_POSITION, p_media->cfg.id, psz_instance, &d_position ); - d_position += (d_scale / 1000.0); - if( d_position > 1.0 ) - d_position = 1.0; - i_result = vlm_ControlInternal( p_vlm, VLM_SET_MEDIA_INSTANCE_POSITION, p_media->cfg.id, psz_instance, d_position ); - - } - else - { - i_result = VLC_EGENERIC; - } - } else if( !strcmp( psz_control, "stop" ) ) { i_result = vlm_ControlInternal( p_vlm, VLM_STOP_MEDIA_INSTANCE, p_media->cfg.id, psz_instance ); @@ -559,9 +523,11 @@ error: return VLC_EGENERIC; } -static int ExecuteLoad( vlm_t *p_vlm, const char *psz_url, vlm_message_t **pp_status ) +static int ExecuteLoad( vlm_t *p_vlm, const char *psz_path, vlm_message_t **pp_status ) { + char *psz_url = vlc_path2uri( psz_path, NULL ); stream_t *p_stream = stream_UrlNew( p_vlm, psz_url ); + free( psz_url ); uint64_t i_size; char *psz_buffer; @@ -636,7 +602,7 @@ static int ExecuteScheduleProperty( vlm_t *p_vlm, vlm_schedule_sys_t *p_schedule if( ++i >= i_property ) break; - psz_line = strdup( ppsz_property[i] ); + psz_line = xstrdup( ppsz_property[i] ); for( j = i+1; j < i_property; j++ ) { psz_line = xrealloc( psz_line, @@ -645,7 +611,9 @@ static int ExecuteScheduleProperty( vlm_t *p_vlm, vlm_schedule_sys_t *p_schedule strcat( psz_line, ppsz_property[j] ); } - if( vlm_ScheduleSetup( p_schedule, "append", psz_line ) ) + int val = vlm_ScheduleSetup( p_schedule, "append", psz_line ); + free( psz_line ); + if( val ) goto error; break; } @@ -736,13 +704,11 @@ static int ExecuteMediaProperty( vlm_t *p_vlm, int64_t id, bool b_new, } else if( !strcmp( psz_option, "inputdeln" ) ) { - int i_index; - MISSING( "inputdeln" ); - i_index = atoi( psz_value ); - if( i_index > 0 && i_index <= p_cfg->i_input ) - TAB_REMOVE( p_cfg->i_input, p_cfg->ppsz_input, p_cfg->ppsz_input[i_index-1] ); + int idx = atoi( psz_value ); + if( idx > 0 && idx <= p_cfg->i_input ) + TAB_REMOVE( p_cfg->i_input, p_cfg->ppsz_input, p_cfg->ppsz_input[idx-1] ); i++; } else if( !strcmp( psz_option, "output" ) ) @@ -881,16 +847,27 @@ int ExecuteCommand( vlm_t *p_vlm, const char *psz_command, vlm_message_t **pp_message ) { size_t i_command = 0; - char buf[strlen (psz_command) + 1], *psz_buf = buf; - char *ppsz_command[3+sizeof (buf) / 2]; + size_t i_command_len = strlen( psz_command ); + char *buf = malloc( i_command_len + 1 ), *psz_buf = buf; + size_t i_ppsz_command_len = (3 + (i_command_len + 1) / 2); + char **ppsz_command = malloc( i_ppsz_command_len * sizeof(char *) ); vlm_message_t *p_message = NULL; + int i_ret = 0; + + if( !psz_buf || !ppsz_command ) + { + p_message = vlm_MessageNew( "Memory error", + "allocation failed for command of length %zu", + i_command_len ); + goto error; + } /* First, parse the line and cut it */ while( *psz_command != '\0' ) { const char *psz_temp; - if(isspace (*psz_command)) + if(isspace ((unsigned char)*psz_command)) { psz_command++; continue; @@ -911,7 +888,7 @@ int ExecuteCommand( vlm_t *p_vlm, const char *psz_command, goto error; } - assert (i_command < (sizeof (ppsz_command) / sizeof (ppsz_command[0]))); + assert (i_command < i_ppsz_command_len); ppsz_command[i_command] = psz_buf; memcpy (psz_buf, psz_command, psz_temp - psz_command); @@ -923,7 +900,7 @@ int ExecuteCommand( vlm_t *p_vlm, const char *psz_command, psz_buf += psz_temp - psz_command + 1; psz_command = psz_temp; - assert (buf + sizeof (buf) >= psz_buf); + assert (buf + i_command_len + 1 >= psz_buf); } /* @@ -947,20 +924,27 @@ int ExecuteCommand( vlm_t *p_vlm, const char *psz_command, else IF_EXECUTE( "setup", (i_command < 2), ExecuteSetup(p_vlm, ppsz_command[1], i_command-2, &ppsz_command[2], &p_message) ) else { - p_message = vlm_MessageNew( ppsz_command[0], "Unknown command" ); + p_message = vlm_MessageNew( ppsz_command[0], "Unknown VLM command" ); goto error; } #undef IF_EXECUTE success: *pp_message = p_message; + free( buf ); + free( ppsz_command ); return VLC_SUCCESS; syntax_error: - return ExecuteSyntaxError( ppsz_command[0], pp_message ); + i_ret = ExecuteSyntaxError( ppsz_command[0], pp_message ); + free( buf ); + free( ppsz_command ); + return i_ret; error: *pp_message = p_message; + free( buf ); + free( ppsz_command ); return VLC_EGENERIC; } @@ -1008,18 +992,17 @@ static vlm_schedule_sys_t *vlm_ScheduleNew( vlm_t *vlm, const char *psz_name ) /* for now, simple delete. After, del with options (last arg) */ void vlm_ScheduleDelete( vlm_t *vlm, vlm_schedule_sys_t *sched ) { + int i; if( sched == NULL ) return; TAB_REMOVE( vlm->i_schedule, vlm->schedule, sched ); if( vlm->i_schedule == 0 ) free( vlm->schedule ); free( sched->psz_name ); - while( sched->i_command ) - { - char *psz_cmd = sched->command[0]; - TAB_REMOVE( sched->i_command, sched->command, psz_cmd ); - free( psz_cmd ); - } + + for ( i = 0; i < sched->i_command; i++ ) + free( sched->command[i] ); + free( sched->command ); free( sched ); } @@ -1533,7 +1516,7 @@ static vlm_message_t *vlm_Show( vlm_t *vlm, vlm_media_sys_t *media, struct tm tm; char psz_date[32]; - strftime( psz_date, sizeof(psz_date), "%F %H:%M:%S (%a)", + strftime( psz_date, sizeof(psz_date), "%Y-%m-%d %H:%M:%S (%a)", localtime_r( &i_date, &tm ) ); vlm_MessageAdd( msg_schedule, vlm_MessageNew( "next launch", "%s", psz_date ) ); @@ -1629,12 +1612,12 @@ static char *Save( vlm_t *vlm ) else i_length += strlen( "new * broadcast " ) + strlen(p_cfg->psz_name); - if( p_cfg->b_enabled == true ) + if( p_cfg->b_enabled ) i_length += strlen( "enabled" ); else i_length += strlen( "disabled" ); - if( !p_cfg->b_vod && p_cfg->broadcast.b_loop == true ) + if( !p_cfg->b_vod && p_cfg->broadcast.b_loop ) i_length += strlen( " loop\n" ); else i_length += strlen( "\n" ); @@ -1658,7 +1641,7 @@ static char *Save( vlm_t *vlm ) i_length += strlen( "new schedule " ) + strlen( schedule->psz_name ); - if( schedule->b_enabled == true ) + if( schedule->b_enabled ) { i_length += strlen( "date //-:: enabled\n" ) + 14; } @@ -1749,7 +1732,7 @@ static char *Save( vlm_t *vlm ) localtime_r( &i_time, &date); p += sprintf( p, "new %s schedule ", schedule->psz_name); - if( schedule->b_enabled == true ) + if( schedule->b_enabled ) { p += sprintf( p, "date %d/%d/%d-%d:%d:%d enabled\n", date.tm_year + 1900, date.tm_mon + 1, date.tm_mday,