Commit 6f987b51 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Fixes httpd_ClientIP on Win32 & the likes

parent 22571f1a
...@@ -422,7 +422,7 @@ struct addrinfo ...@@ -422,7 +422,7 @@ struct addrinfo
# endif # endif
VLC_EXPORT( const char *, vlc_gai_strerror, ( int ) ); VLC_EXPORT( const char *, vlc_gai_strerror, ( int ) );
VLC_EXPORT( int, vlc_getnameinfo, ( vlc_object_t *, const struct sockaddr *, int, char *, int, int *, int ) ); VLC_EXPORT( int, vlc_getnameinfo, ( const struct sockaddr *, int, char *, int, int *, int ) );
VLC_EXPORT( int, vlc_getaddrinfo, ( vlc_object_t *, const char *, int, const struct addrinfo *, struct addrinfo ** ) ); VLC_EXPORT( int, vlc_getaddrinfo, ( vlc_object_t *, const char *, int, const struct addrinfo *, struct addrinfo ** ) );
VLC_EXPORT( void, vlc_freeaddrinfo, ( struct addrinfo * ) ); VLC_EXPORT( void, vlc_freeaddrinfo, ( struct addrinfo * ) );
......
...@@ -367,7 +367,7 @@ struct module_symbols_t ...@@ -367,7 +367,7 @@ struct module_symbols_t
mtime_t (*vout_SynchroDate_inner) (vout_synchro_t *); mtime_t (*vout_SynchroDate_inner) (vout_synchro_t *);
void (*vout_SynchroNewPicture_inner) (vout_synchro_t *, int, int, mtime_t, mtime_t, int, vlc_bool_t); void (*vout_SynchroNewPicture_inner) (vout_synchro_t *, int, int, mtime_t, mtime_t, int, vlc_bool_t);
int (*vlc_getaddrinfo_inner) (vlc_object_t *, const char *, int, const struct addrinfo *, struct addrinfo **); int (*vlc_getaddrinfo_inner) (vlc_object_t *, const char *, int, const struct addrinfo *, struct addrinfo **);
int (*vlc_getnameinfo_inner) (vlc_object_t *, const struct sockaddr *, int, char *, int, int *, int); int (*vlc_getnameinfo_inner) (const struct sockaddr *, int, char *, int, int *, int);
void (*InitMD5_inner) (struct md5_s *); void (*InitMD5_inner) (struct md5_s *);
void (*EndMD5_inner) (struct md5_s *); void (*EndMD5_inner) (struct md5_s *);
void (*vlc_freeaddrinfo_inner) (struct addrinfo *); void (*vlc_freeaddrinfo_inner) (struct addrinfo *);
......
...@@ -250,9 +250,8 @@ static int Open( vlc_object_t *p_this ) ...@@ -250,9 +250,8 @@ static int Open( vlc_object_t *p_this )
goto exit_error; goto exit_error;
} }
i_answer = vlc_getnameinfo( p_this, (struct sockaddr *)&addr, len, i_answer = vlc_getnameinfo( (struct sockaddr *)&addr, len, hostaddr,
hostaddr, sizeof( hostaddr ), NULL, sizeof( hostaddr ), NULL, NI_NUMERICHOST );
NI_NUMERICHOST );
if( i_answer ) if( i_answer )
{ {
msg_Err( p_access, "getnameinfo failed: %s", msg_Err( p_access, "getnameinfo failed: %s",
......
...@@ -493,7 +493,7 @@ __getaddrinfo (const char *node, const char *service, ...@@ -493,7 +493,7 @@ __getaddrinfo (const char *node, const char *service,
#endif /* if !HAVE_GETADDRINFO */ #endif /* if !HAVE_GETADDRINFO */
int vlc_getnameinfo( vlc_object_t *p_this, const struct sockaddr *sa, int salen, int vlc_getnameinfo( const struct sockaddr *sa, int salen,
char *host, int hostlen, int *portnum, int flags ) char *host, int hostlen, int *portnum, int flags )
{ {
char psz_servbuf[6], *psz_serv; char psz_servbuf[6], *psz_serv;
...@@ -545,17 +545,20 @@ int vlc_getnameinfo( vlc_object_t *p_this, const struct sockaddr *sa, int salen, ...@@ -545,17 +545,20 @@ int vlc_getnameinfo( vlc_object_t *p_this, const struct sockaddr *sa, int salen,
flags ); flags );
#else #else
{ {
vlc_value_t lock; # ifdef HAVE_USABLE_MUTEX_THAT_DONT_NEED_LIBVLC_POINTER
static vlc_value_t lock;
/* my getnameinfo implementation is not thread-safe as it uses /* my getnameinfo implementation is not thread-safe as it uses
* gethostbyaddr and the likes */ * gethostbyaddr and the likes */
var_Create( p_this->p_libvlc, "getnameinfo_mutex", VLC_VAR_MUTEX );
var_Get( p_this->p_libvlc, "getnameinfo_mutex", &lock );
vlc_mutex_lock( lock.p_address ); vlc_mutex_lock( lock.p_address );
#else
# warning FIXME : This is not thread-safe! Your platform is outdated.
#endif
i_val = __getnameinfo( sa, salen, host, hostlen, psz_serv, i_servlen, i_val = __getnameinfo( sa, salen, host, hostlen, psz_serv, i_servlen,
flags ); flags );
# ifdef HAVE_USABLE_MUTEX_THAT_DONT_NEED_LIBVLC_POINTER
vlc_mutex_unlock( lock.p_address ); vlc_mutex_unlock( lock.p_address );
# endif
} }
#endif #endif
......
...@@ -1331,15 +1331,13 @@ void httpd_ClientModeBidir( httpd_client_t *cl ) ...@@ -1331,15 +1331,13 @@ void httpd_ClientModeBidir( httpd_client_t *cl )
cl->i_mode = HTTPD_CLIENT_BIDIR; cl->i_mode = HTTPD_CLIENT_BIDIR;
} }
/*
* FIXME: use vlc_getnameinfo
*/
char* httpd_ClientIP( httpd_client_t *cl ) char* httpd_ClientIP( httpd_client_t *cl )
{ {
#ifdef HAVE_GETNAMEINFO
char sz_ip[INET6_ADDRSTRLEN + 2];
int i; int i;
char *psz_ip;
psz_ip = (char *)malloc( NI_MAXNUMERICHOST + 2 );
#ifdef HAVE_GETNAMEINFO /* FIXME not very good check */
if( (cl->sock.ss_family == AF_INET6) && if( (cl->sock.ss_family == AF_INET6) &&
IN6_IS_ADDR_V4MAPPED( &((const struct sockaddr_in6 *) IN6_IS_ADDR_V4MAPPED( &((const struct sockaddr_in6 *)
&cl->sock)->sin6_addr) ) &cl->sock)->sin6_addr) )
...@@ -1352,34 +1350,31 @@ char* httpd_ClientIP( httpd_client_t *cl ) ...@@ -1352,34 +1350,31 @@ char* httpd_ClientIP( httpd_client_t *cl )
a.sin_port = ((const struct sockaddr_in6 *)&cl->sock)->sin6_port; a.sin_port = ((const struct sockaddr_in6 *)&cl->sock)->sin6_port;
a.sin_addr.s_addr = ((const uint32_t *)&((const struct sockaddr_in6 *) a.sin_addr.s_addr = ((const uint32_t *)&((const struct sockaddr_in6 *)
&cl->sock)->sin6_addr)[3]; &cl->sock)->sin6_addr)[3];
i = getnameinfo( (const struct sockaddr *)&a, sizeof( a ), i = vlc_getnameinfo( (const struct sockaddr *)&a, sizeof( a ),
&sz_ip[1], INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST ); psz_ip + 1, NI_MAXNUMERICHOST, NULL,
NI_NUMERICHOST );
} }
else else
i = getnameinfo( (const struct sockaddr *)&cl->sock, cl->i_sock_size, #endif
&sz_ip[1], INET6_ADDRSTRLEN, NULL, 0, i = vlc_getnameinfo( (const struct sockaddr *)&cl->sock,
NI_NUMERICHOST ); cl->i_sock_size, psz_ip + 1, NI_MAXNUMERICHOST,
NULL, NI_NUMERICHOST );
if( i != 0 ) if( i != 0 )
/* FIXME: msg_Err */
return NULL; return NULL;
if( strchr( &sz_ip[1], ':' ) != NULL ) /* semi-colon in address => must add bracket for HTTP */
if( strchr( psz_ip + 1, ':' ) != NULL )
{ {
*sz_ip = '['; psz_ip[0] = '[';
i = strlen( sz_ip ); i = strlen( psz_ip );
sz_ip[i++] = ']'; psz_ip[i++] = ']';
sz_ip[i] = '\0'; psz_ip[i] = '\0';
return strdup( sz_ip ); return psz_ip;
} }
return strdup( &sz_ip[1] ); return psz_ip + 1;
#else
/* FIXME not thread safe */
return strdup( inet_ntoa( ((const struct sockaddr_in *)&cl->sock)->sin_addr ) );
#endif
} }
static void httpd_ClientClean( httpd_client_t *cl ) static void httpd_ClientClean( httpd_client_t *cl )
...@@ -1961,14 +1956,6 @@ static void httpd_HostThread( httpd_host_t *host ) ...@@ -1961,14 +1956,6 @@ static void httpd_HostThread( httpd_host_t *host )
( cl->i_activity_timeout > 0 && ( cl->i_activity_timeout > 0 &&
cl->i_activity_date+cl->i_activity_timeout < mdate()) ) ) ) cl->i_activity_date+cl->i_activity_timeout < mdate()) ) ) )
{ {
char *ip;
// FIXME: it sucks to allocate memory on the stack for debug
ip = httpd_ClientIP( cl );
msg_Dbg( host, "connection closed(%s)",
(ip != NULL) ? ip : "unknown" );
free( ip );
httpd_ClientClean( cl ); httpd_ClientClean( cl );
TAB_REMOVE( host->i_client, host->client, cl ); TAB_REMOVE( host->i_client, host->client, cl );
free( cl ); free( cl );
...@@ -2392,7 +2379,6 @@ static void httpd_HostThread( httpd_host_t *host ) ...@@ -2392,7 +2379,6 @@ static void httpd_HostThread( httpd_host_t *host )
if( fd >= 0 ) if( fd >= 0 )
{ {
char *ip;
httpd_client_t *cl; httpd_client_t *cl;
cl = httpd_ClientNew( fd, &sock, i_sock_size, p_tls ); cl = httpd_ClientNew( fd, &sock, i_sock_size, p_tls );
...@@ -2403,13 +2389,6 @@ static void httpd_HostThread( httpd_host_t *host ) ...@@ -2403,13 +2389,6 @@ static void httpd_HostThread( httpd_host_t *host )
if( i_state != 0 ) if( i_state != 0 )
cl->i_state = i_state; // override state for TLS cl->i_state = i_state; // override state for TLS
// FIXME: it sucks to allocate memory for debug
ip = httpd_ClientIP( cl );
msg_Dbg( host, "new connection (%s)",
ip != NULL ? ip : "unknown" );
if( ip != NULL )
free( ip );
} }
} }
} }
......
...@@ -298,9 +298,8 @@ static int announce_SAPAnnounceAdd( sap_handler_t *p_sap, ...@@ -298,9 +298,8 @@ static int announce_SAPAnnounceAdd( sap_handler_t *p_sap,
i = vlc_getaddrinfo( (vlc_object_t *)p_sap, p_session->psz_uri, 0, i = vlc_getaddrinfo( (vlc_object_t *)p_sap, p_session->psz_uri, 0,
&hints, &res ); &hints, &res );
if( i == 0 ) if( i == 0 )
i = vlc_getnameinfo( (vlc_object_t *)p_sap, res->ai_addr, i = vlc_getnameinfo( res->ai_addr, res->ai_addrlen, psz_buf,
res->ai_addrlen, psz_buf, sizeof( psz_buf ), sizeof( psz_buf ), NULL, NI_NUMERICHOST );
NULL, NI_NUMERICHOST );
if( i ) if( i )
{ {
msg_Err( p_sap, "Invalid URI for SAP announce : %s : %s", msg_Err( p_sap, "Invalid URI for SAP announce : %s : %s",
......
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