Commit 81dd5aa6 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

- Add httpd_ServerIP() to obtain HTTP server's IP used with a given client

(much like httpd_ClientIP())
- Rewrite httpd_ClientIP() to use existing API and not use malloc/free
parent 7a8c3950
...@@ -131,7 +131,8 @@ VLC_EXPORT( void, httpd_UrlDelete, ( httpd_url_t * ) ); ...@@ -131,7 +131,8 @@ VLC_EXPORT( void, httpd_UrlDelete, ( httpd_url_t * ) );
/* Default client mode is FILE, use these to change it */ /* Default client mode is FILE, use these to change it */
VLC_EXPORT( void, httpd_ClientModeStream, ( httpd_client_t *cl ) ); VLC_EXPORT( void, httpd_ClientModeStream, ( httpd_client_t *cl ) );
VLC_EXPORT( void, httpd_ClientModeBidir, ( httpd_client_t *cl ) ); VLC_EXPORT( void, httpd_ClientModeBidir, ( httpd_client_t *cl ) );
VLC_EXPORT( char*, httpd_ClientIP, ( httpd_client_t *cl ) ); VLC_EXPORT( char*, httpd_ClientIP, ( httpd_client_t *cl, char *psz_ip ) );
VLC_EXPORT( char*, httpd_ServerIP, ( httpd_client_t *cl, char *psz_ip ) );
/* High level */ /* High level */
......
...@@ -201,7 +201,7 @@ struct module_symbols_t ...@@ -201,7 +201,7 @@ struct module_symbols_t
void (*httpd_UrlDelete_inner) (httpd_url_t *); void (*httpd_UrlDelete_inner) (httpd_url_t *);
void (*httpd_ClientModeStream_inner) (httpd_client_t *cl); void (*httpd_ClientModeStream_inner) (httpd_client_t *cl);
void (*httpd_ClientModeBidir_inner) (httpd_client_t *cl); void (*httpd_ClientModeBidir_inner) (httpd_client_t *cl);
char* (*httpd_ClientIP_inner) (httpd_client_t *cl); char* (*httpd_ClientIP_inner) (httpd_client_t *cl, char *psz_ip);
httpd_file_t * (*httpd_FileNew_inner) (httpd_host_t *, char *psz_url, char *psz_mime, char *psz_user, char *psz_password, const vlc_acl_t *p_acl, httpd_file_callback_t pf_fill, httpd_file_sys_t *); httpd_file_t * (*httpd_FileNew_inner) (httpd_host_t *, char *psz_url, char *psz_mime, char *psz_user, char *psz_password, const vlc_acl_t *p_acl, httpd_file_callback_t pf_fill, httpd_file_sys_t *);
void (*httpd_FileDelete_inner) (httpd_file_t *); void (*httpd_FileDelete_inner) (httpd_file_t *);
httpd_redirect_t * (*httpd_RedirectNew_inner) (httpd_host_t *, char *psz_url_dst, char *psz_url_src); httpd_redirect_t * (*httpd_RedirectNew_inner) (httpd_host_t *, char *psz_url_dst, char *psz_url_src);
...@@ -382,6 +382,7 @@ struct module_symbols_t ...@@ -382,6 +382,7 @@ struct module_symbols_t
int (*ACL_LoadFile_inner) (vlc_acl_t *p_acl, const char *path); int (*ACL_LoadFile_inner) (vlc_acl_t *p_acl, const char *path);
int (*ACL_AddNet_inner) (vlc_acl_t *p_acl, const char *psz_ip, int i_len, vlc_bool_t b_allow); int (*ACL_AddNet_inner) (vlc_acl_t *p_acl, const char *psz_ip, int i_len, vlc_bool_t b_allow);
void (*ACL_Destroy_inner) (vlc_acl_t *p_acl); void (*ACL_Destroy_inner) (vlc_acl_t *p_acl);
char* (*httpd_ServerIP_inner) (httpd_client_t *cl, char *psz_ip);
}; };
# if defined (__PLUGIN__) # if defined (__PLUGIN__)
# define aout_FiltersCreatePipeline (p_symbols)->aout_FiltersCreatePipeline_inner # define aout_FiltersCreatePipeline (p_symbols)->aout_FiltersCreatePipeline_inner
...@@ -749,6 +750,7 @@ struct module_symbols_t ...@@ -749,6 +750,7 @@ struct module_symbols_t
# define ACL_LoadFile (p_symbols)->ACL_LoadFile_inner # define ACL_LoadFile (p_symbols)->ACL_LoadFile_inner
# define ACL_AddNet (p_symbols)->ACL_AddNet_inner # define ACL_AddNet (p_symbols)->ACL_AddNet_inner
# define ACL_Destroy (p_symbols)->ACL_Destroy_inner # define ACL_Destroy (p_symbols)->ACL_Destroy_inner
# define httpd_ServerIP (p_symbols)->httpd_ServerIP_inner
# elif defined (HAVE_DYNAMIC_PLUGINS) && !defined (__BUILTIN__) # elif defined (HAVE_DYNAMIC_PLUGINS) && !defined (__BUILTIN__)
/****************************************************************** /******************************************************************
* STORE_SYMBOLS: store VLC APIs into p_symbols for plugin access. * STORE_SYMBOLS: store VLC APIs into p_symbols for plugin access.
...@@ -1119,6 +1121,7 @@ struct module_symbols_t ...@@ -1119,6 +1121,7 @@ struct module_symbols_t
((p_symbols)->ACL_LoadFile_inner) = ACL_LoadFile; \ ((p_symbols)->ACL_LoadFile_inner) = ACL_LoadFile; \
((p_symbols)->ACL_AddNet_inner) = ACL_AddNet; \ ((p_symbols)->ACL_AddNet_inner) = ACL_AddNet; \
((p_symbols)->ACL_Destroy_inner) = ACL_Destroy; \ ((p_symbols)->ACL_Destroy_inner) = ACL_Destroy; \
((p_symbols)->httpd_ServerIP_inner) = httpd_ServerIP; \
(p_symbols)->net_ConvertIPv4_deprecated = NULL; \ (p_symbols)->net_ConvertIPv4_deprecated = NULL; \
# endif /* __PLUGIN__ */ # endif /* __PLUGIN__ */
......
...@@ -171,7 +171,7 @@ static int RtspCallback( httpd_callback_sys_t *, httpd_client_t *, ...@@ -171,7 +171,7 @@ static int RtspCallback( httpd_callback_sys_t *, httpd_client_t *,
static int RtspCallbackES( httpd_callback_sys_t *, httpd_client_t *, static int RtspCallbackES( httpd_callback_sys_t *, httpd_client_t *,
httpd_message_t *, httpd_message_t * ); httpd_message_t *, httpd_message_t * );
static char *SDPGenerate( const vod_media_t * ); static char *SDPGenerate( const vod_media_t *, httpd_client_t *cl );
static void sprintf_hexa( char *s, uint8_t *p_data, int i_data ) static void sprintf_hexa( char *s, uint8_t *p_data, int i_data )
{ {
...@@ -623,7 +623,7 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl, ...@@ -623,7 +623,7 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl,
case HTTPD_MSG_DESCRIBE: case HTTPD_MSG_DESCRIBE:
{ {
char *psz_sdp = char *psz_sdp =
SDPGenerate( p_media ); SDPGenerate( p_media, cl );
answer->i_status = 200; answer->i_status = 200;
answer->psz_status = strdup( "OK" ); answer->psz_status = strdup( "OK" );
...@@ -636,7 +636,7 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl, ...@@ -636,7 +636,7 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl,
case HTTPD_MSG_PLAY: case HTTPD_MSG_PLAY:
{ {
char *psz_output, *ip; char *psz_output, ip[NI_MAXNUMERICHOST];
int i, i_port_audio = 0, i_port_video = 0; int i, i_port_audio = 0, i_port_video = 0;
/* for now only multicast so easy */ /* for now only multicast so easy */
...@@ -660,7 +660,7 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl, ...@@ -660,7 +660,7 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl,
} }
else if( p_rtsp->b_playing ) break; else if( p_rtsp->b_playing ) break;
if( !(ip = httpd_ClientIP( cl )) ) break; if( httpd_ClientIP( cl, ip ) == NULL ) break;
p_rtsp->b_playing = VLC_TRUE; p_rtsp->b_playing = VLC_TRUE;
...@@ -687,7 +687,6 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl, ...@@ -687,7 +687,6 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl,
vod_MediaControl( p_vod, p_media, psz_session, VOD_MEDIA_PLAY, vod_MediaControl( p_vod, p_media, psz_session, VOD_MEDIA_PLAY,
psz_output ); psz_output );
free( psz_output ); free( psz_output );
free( ip );
break; break;
} }
...@@ -773,11 +772,11 @@ static int RtspCallbackES( httpd_callback_sys_t *p_args, httpd_client_t *cl, ...@@ -773,11 +772,11 @@ static int RtspCallbackES( httpd_callback_sys_t *p_args, httpd_client_t *cl,
{ {
rtsp_client_t *p_rtsp; rtsp_client_t *p_rtsp;
rtsp_client_es_t *p_rtsp_es; rtsp_client_es_t *p_rtsp_es;
char *ip = httpd_ClientIP( cl ); char ip[NI_MAXNUMERICHOST];
int i_port = atoi( strstr( psz_transport, "client_port=" ) + int i_port = atoi( strstr( psz_transport, "client_port=" ) +
strlen("client_port=") ); strlen("client_port=") );
if( !ip ) if( httpd_ClientIP( cl, ip ) == NULL )
{ {
answer->i_status = 500; answer->i_status = 500;
answer->psz_status = strdup( "Internal server error" ); answer->psz_status = strdup( "Internal server error" );
...@@ -935,10 +934,10 @@ static int RtspCallbackES( httpd_callback_sys_t *p_args, httpd_client_t *cl, ...@@ -935,10 +934,10 @@ static int RtspCallbackES( httpd_callback_sys_t *p_args, httpd_client_t *cl,
* SDPGenerate: TODO * SDPGenerate: TODO
* FIXME: need to be moved to a common place ? * FIXME: need to be moved to a common place ?
*****************************************************************************/ *****************************************************************************/
static char *SDPGenerate( const vod_media_t *p_media ) static char *SDPGenerate( const vod_media_t *p_media, httpd_client_t *cl )
{ {
int i, i_size; int i, i_size;
char *p, *psz_sdp; char *p, *psz_sdp, *ip;
/* Calculate size */ /* Calculate size */
i_size = strlen( "v=0\r\n" ) + i_size = strlen( "v=0\r\n" ) +
......
...@@ -1641,7 +1641,7 @@ static int RtspCallbackId( httpd_callback_sys_t *p_args, ...@@ -1641,7 +1641,7 @@ static int RtspCallbackId( httpd_callback_sys_t *p_args,
else if( strstr( psz_transport, "unicast" ) && strstr( psz_transport, "client_port=" ) ) else if( strstr( psz_transport, "unicast" ) && strstr( psz_transport, "client_port=" ) )
{ {
int i_port = atoi( strstr( psz_transport, "client_port=" ) + strlen("client_port=") ); int i_port = atoi( strstr( psz_transport, "client_port=" ) + strlen("client_port=") );
char *ip = httpd_ClientIP( cl ); char ip[NI_MAXNUMERICHOST];
char psz_access[100]; char psz_access[100];
char psz_url[100]; char psz_url[100];
...@@ -1650,7 +1650,7 @@ static int RtspCallbackId( httpd_callback_sys_t *p_args, ...@@ -1650,7 +1650,7 @@ static int RtspCallbackId( httpd_callback_sys_t *p_args,
rtsp_client_t *rtsp = NULL; rtsp_client_t *rtsp = NULL;
if( ip == NULL ) if( httpd_ClientIP( cl, ip ) == NULL )
{ {
answer->i_status = 500; answer->i_status = 500;
answer->psz_status = strdup( "Internal server error" ); answer->psz_status = strdup( "Internal server error" );
...@@ -1679,7 +1679,6 @@ static int RtspCallbackId( httpd_callback_sys_t *p_args, ...@@ -1679,7 +1679,6 @@ static int RtspCallbackId( httpd_callback_sys_t *p_args,
answer->psz_status = strdup( "Unknown session id" ); answer->psz_status = strdup( "Unknown session id" );
answer->i_body = 0; answer->i_body = 0;
answer->p_body = NULL; answer->p_body = NULL;
free( ip );
break; break;
} }
} }
...@@ -1690,7 +1689,6 @@ static int RtspCallbackId( httpd_callback_sys_t *p_args, ...@@ -1690,7 +1689,6 @@ static int RtspCallbackId( httpd_callback_sys_t *p_args,
else else
sprintf( psz_access, "udp{raw}" ); sprintf( psz_access, "udp{raw}" );
sprintf( psz_url, "%s:%d", ip, i_port ); sprintf( psz_url, "%s:%d", ip, i_port );
free( ip );
if( ( p_access = sout_AccessOutNew( p_stream->p_sout, psz_access, psz_url ) ) == NULL ) if( ( p_access = sout_AccessOutNew( p_stream->p_sout, psz_access, psz_url ) ) == NULL )
{ {
......
...@@ -1329,20 +1329,14 @@ void httpd_ClientModeBidir( httpd_client_t *cl ) ...@@ -1329,20 +1329,14 @@ void httpd_ClientModeBidir( httpd_client_t *cl )
cl->i_mode = HTTPD_CLIENT_BIDIR; cl->i_mode = HTTPD_CLIENT_BIDIR;
} }
char* httpd_ClientIP( httpd_client_t *cl ) char* httpd_ClientIP( httpd_client_t *cl, char *psz_ip )
{ {
int i; return net_GetPeerAddress( cl->fd, psz_ip, NULL ) ? NULL : psz_ip;
char *psz_ip = malloc( NI_MAXNUMERICHOST ); }
if( psz_ip == NULL )
return NULL;
i = vlc_getnameinfo( (const struct sockaddr *)&cl->sock, cl->i_sock_size,
psz_ip, NI_MAXNUMERICHOST, NULL, NI_NUMERICHOST );
if( i )
return NULL;
return psz_ip; char* httpd_ServerIP( httpd_client_t *cl, char *psz_ip )
{
return net_GetSockAddress( cl->fd, psz_ip, NULL ) ? NULL : psz_ip;
} }
static void httpd_ClientClean( httpd_client_t *cl ) static void httpd_ClientClean( httpd_client_t *cl )
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment