@ -46,6 +46,8 @@
# define SO_REUSEPORT 15
# define SO_REUSEPORT 15
# endif
# endif
extern int verbose ;
int set_reuseport ( int socket )
int set_reuseport ( int socket )
{
{
int opt = 1 ;
int opt = 1 ;
@ -132,3 +134,71 @@ ssize_t get_sockaddr(char *host, char *port, struct sockaddr_storage *storage, i
return - 1 ;
return - 1 ;
}
}
int sockaddr_cmp ( struct sockaddr_storage * addr1 ,
struct sockaddr_storage * addr2 , socklen_t len )
{
struct sockaddr_in * p1_in = ( struct sockaddr_in * ) addr1 ;
struct sockaddr_in * p2_in = ( struct sockaddr_in * ) addr2 ;
struct sockaddr_in6 * p1_in6 = ( struct sockaddr_in6 * ) addr1 ;
struct sockaddr_in6 * p2_in6 = ( struct sockaddr_in6 * ) addr2 ;
if ( p1_in - > sin_family < p2_in - > sin_family )
return - 1 ;
if ( p1_in - > sin_family > p2_in - > sin_family )
return 1 ;
if ( verbose ) {
LOGI ( " sockaddr_cmp: sin_family equal? %d " , p1_in - > sin_family = = p2_in - > sin_family ) ;
}
/* compare ip4 */
if ( p1_in - > sin_family = = AF_INET ) {
/* just order it, ntohs not required */
if ( p1_in - > sin_port < p2_in - > sin_port )
return - 1 ;
if ( p1_in - > sin_port > p2_in - > sin_port )
return 1 ;
if ( verbose ) {
LOGI ( " sockaddr_cmp: sin_port equal? %d " , p1_in - > sin_port = = p2_in - > sin_port ) ;
}
return memcmp ( & p1_in - > sin_addr , & p2_in - > sin_addr , INET_SIZE ) ;
} else if ( p1_in6 - > sin6_family = = AF_INET6 ) {
/* just order it, ntohs not required */
if ( p1_in6 - > sin6_port < p2_in6 - > sin6_port )
return - 1 ;
if ( p1_in6 - > sin6_port > p2_in6 - > sin6_port )
return 1 ;
if ( verbose ) {
LOGI ( " sockaddr_cmp: sin6_port equal? %d " , p1_in6 - > sin6_port = = p2_in6 - > sin6_port ) ;
}
return memcmp ( & p1_in6 - > sin6_addr , & p2_in6 - > sin6_addr ,
INET6_SIZE ) ;
} else {
/* eek unknown type, perform this comparison for sanity. */
return memcmp ( addr1 , addr2 , len ) ;
}
}
int sockaddr_cmp_addr ( struct sockaddr_storage * addr1 ,
struct sockaddr_storage * addr2 , socklen_t len )
{
struct sockaddr_in * p1_in = ( struct sockaddr_in * ) addr1 ;
struct sockaddr_in * p2_in = ( struct sockaddr_in * ) addr2 ;
struct sockaddr_in6 * p1_in6 = ( struct sockaddr_in6 * ) addr1 ;
struct sockaddr_in6 * p2_in6 = ( struct sockaddr_in6 * ) addr2 ;
if ( p1_in - > sin_family < p2_in - > sin_family )
return - 1 ;
if ( p1_in - > sin_family > p2_in - > sin_family )
return 1 ;
if ( verbose ) {
LOGI ( " sockaddr_cmp_addr: sin_family equal? %d " , p1_in - > sin_family = = p2_in - > sin_family ) ;
}
/* compare ip4 */
if ( p1_in - > sin_family = = AF_INET ) {
return memcmp ( & p1_in - > sin_addr , & p2_in - > sin_addr , INET_SIZE ) ;
} else if ( p1_in6 - > sin6_family = = AF_INET6 ) {
return memcmp ( & p1_in6 - > sin6_addr , & p2_in6 - > sin6_addr ,
INET6_SIZE ) ;
} else {
/* eek unknown type, perform this comparison for sanity. */
return memcmp ( addr1 , addr2 , len ) ;
}
}