char *psz_accessname;
char *psz_parser;
const char *psz_user;
- const char *psz_pass;
- const char *psz_host;
- const char *psz_mount;
- const char *psz_port;
+ char *psz_pass;
+ char *psz_host;
+ char *psz_mount;
+ char *psz_port;
char *psz_name;
char *psz_description;
char *psz_genre;
return VLC_ENOMEM;
/* Parse connection data user:pwd@host:port/mountpoint */
- psz_user = psz_parser;
- while( psz_parser[0] && psz_parser[0] != ':' ) psz_parser++;
- if( psz_parser[0] ) { psz_parser[0] = 0; psz_parser++; }
- psz_pass = psz_parser;
- while( psz_parser[0] && psz_parser[0] != '@' ) psz_parser++;
- if( psz_parser[0] ) { psz_parser[0] = 0; psz_parser++; }
- psz_host = psz_parser;
- while( psz_parser[0] && psz_parser[0] != ':' ) psz_parser++;
- if( psz_parser[0] ) { psz_parser[0] = 0; psz_parser++; }
- psz_port = psz_parser;
- while( psz_parser[0] && psz_parser[0] != '/' ) psz_parser++;
- if( psz_parser[0] ) { psz_parser[0] = 0; psz_parser++; }
- psz_mount = psz_parser;
-
- i_port = atoi( psz_port );
+ psz_host = strchr( psz_parser, '@' );
+ if( psz_host )
+ {
+ psz_user = psz_parser;
+ *(psz_host++) = '\0';
+ }
+ else
+ psz_user = "";
+
+ psz_pass = strchr( psz_user, ':' );
+ if( psz_pass )
+ *(psz_pass++) = '\0';
+ else
+ psz_pass = "";
+
+ psz_mount = strchr( psz_host, '/' );
+ if( psz_mount )
+ *(psz_mount++) = '\0';
+ else
+ psz_mount = "";
+
+ if( psz_host[0] == '[' )
+ {
+ psz_port = strstr( psz_host, "]:" );
+ if( psz_port )
+ {
+ *psz_port = '\0';
+ psz_port += 2;
+ }
+ }
+ else
+ {
+ psz_port = strchr( psz_host, ':' );
+ if( psz_port )
+ *(psz_port++) = '\0';
+ }
+ i_port = psz_port ? atoi( psz_port ) : 8000;
p_sys = p_access->p_sys = malloc( sizeof( sout_access_out_sys_t ) );
if( !p_sys )
if( i_ret != SHOUTERR_SUCCESS )
{
msg_Err( p_access, "failed to set the shoutcast streaming format" );
- free( p_access->p_sys );
- free( psz_accessname );
- return VLC_EGENERIC;
+ goto error;
}
/* Don't force bitrate to 0 but only use when specified. This will otherwise
if( psz_val )
{
i_ret = shout_set_audio_info( p_shout, SHOUT_AI_BITRATE, psz_val );
+ free( psz_val );
if( i_ret != SHOUTERR_SUCCESS )
{
msg_Err( p_access, "failed to set the information about the bitrate" );
- free( psz_val );
- free( p_access->p_sys );
- free( psz_accessname );
- return VLC_EGENERIC;
+ goto error;
}
}
else
if( psz_val )
{
i_ret = shout_set_audio_info( p_shout, SHOUT_AI_SAMPLERATE, psz_val );
+ free( psz_val );
if( i_ret != SHOUTERR_SUCCESS )
{
msg_Err( p_access, "failed to set the information about the samplerate" );
- free( psz_val );
- free( p_access->p_sys );
- free( psz_accessname );
- return VLC_EGENERIC;
+ goto error;
}
}
if( psz_val )
{
i_ret = shout_set_audio_info( p_shout, SHOUT_AI_CHANNELS, psz_val );
+ free( psz_val );
if( i_ret != SHOUTERR_SUCCESS )
{
msg_Err( p_access, "failed to set the information about the number of channels" );
- free( psz_val );
- free( p_access->p_sys );
- free( psz_accessname );
- return VLC_EGENERIC;
+ goto error;
}
}
if( psz_val )
{
i_ret = shout_set_audio_info( p_shout, SHOUT_AI_QUALITY, psz_val );
+ free( psz_val );
if( i_ret != SHOUTERR_SUCCESS )
{
msg_Err( p_access, "failed to set the information about Ogg Vorbis quality" );
- free( psz_val );
- free( p_access->p_sys );
- free( psz_accessname );
- return VLC_EGENERIC;
+ goto error;
}
}
if( i_ret != SHOUTERR_SUCCESS )
{
msg_Err( p_access, "failed to set the server status setting to public" );
- free( p_access->p_sys );
- free( psz_accessname );
- return VLC_EGENERIC;
+ goto error;
}
}
if( i_ret != SHOUTERR_SUCCESS )
{
msg_Err( p_access, "failed to set the protocol to 'icy'" );
- free( p_access->p_sys );
- free( psz_accessname );
- return VLC_EGENERIC;
+ goto error;
}
i_ret = shout_open( p_shout );
if( i_ret == SHOUTERR_SUCCESS )
if( i_ret != SHOUTERR_SUCCESS )
{
msg_Err( p_access, "failed to set the protocol to 'http'" );
- free( p_access->p_sys );
- free( psz_accessname );
- return VLC_EGENERIC;
+ goto error;
}
i_ret = shout_open( p_shout );
if( i_ret == SHOUTERR_SUCCESS )
free( psz_accessname );
return VLC_SUCCESS;
+
+error:
+ free( psz_accessname );
+ free( p_sys );
+ return VLC_EGENERIC;
}
/*****************************************************************************