(trunk libT) new function: tr_ssToAddr()

This handles converting the data in a sockaddr_storage to a tr_address + port, and removes redundant code from fdlimit.c and tr-udp.c that previously did this work.
This commit is contained in:
Jordan Lee 2011-03-04 21:00:52 +00:00
parent 9024cb29f9
commit 3fdd80eb0d
4 changed files with 34 additions and 33 deletions

View File

@ -678,28 +678,7 @@ tr_fdSocketAccept( tr_session * s, int sockfd, tr_address * addr, tr_port * port
if( fd >= 0 )
{
/* "The ss_family field of the sockaddr_storage structure will always
* align with the family field of any protocol-specific structure." */
if( sock.ss_family == AF_INET )
{
struct sockaddr_in *si;
union { struct sockaddr_storage dummy; struct sockaddr_in si; } s;
s.dummy = sock;
si = &s.si;
addr->type = TR_AF_INET;
addr->addr.addr4.s_addr = si->sin_addr.s_addr;
*port = si->sin_port;
}
else
{
struct sockaddr_in6 *si;
union { struct sockaddr_storage dummy; struct sockaddr_in6 si; } s;
s.dummy = sock;
si = &s.si;
addr->type = TR_AF_INET6;
addr->addr.addr6 = si->sin6_addr;
*port = si->sin6_port;
}
tr_ssToAddr( addr, port, &sock );
++gFd->socket_count;
}

View File

@ -249,6 +249,32 @@ tr_netSetCongestionControl( int s UNUSED, const char *algorithm UNUSED )
#endif
}
tr_bool
tr_ssToAddr( tr_address * setme_addr,
tr_port * setme_port,
const struct sockaddr_storage * from )
{
if( from->ss_family == AF_INET )
{
struct sockaddr_in * sin = (struct sockaddr_in *)from;
setme_addr->type = TR_AF_INET;
setme_addr->addr.addr4.s_addr = sin->sin_addr.s_addr;
*setme_port = sin->sin_port;
return TRUE;
}
if( from->ss_family == AF_INET6 )
{
struct sockaddr_in6 *sin6 = (struct sockaddr_in6*) from;
setme_addr->type = TR_AF_INET6;
setme_addr->addr.addr6 = sin6->sin6_addr;
*setme_port = sin6->sin6_port;
return TRUE;
}
return FALSE;
}
static socklen_t
setup_sockaddr( const tr_address * addr,
tr_port port,

View File

@ -79,6 +79,10 @@ typedef struct tr_address
extern const tr_address tr_inaddr_any;
extern const tr_address tr_in6addr_any;
tr_bool tr_ssToAddr( tr_address * setme_addr,
tr_port * setme_port,
const struct sockaddr_storage * from );
const char *tr_ntop( const tr_address * src,
char * dst,
int size );
@ -128,6 +132,7 @@ void tr_netCloseSocket( int fd );
void tr_netInit( void );
/**
* @brief get a human-representable string representing the network error.
* @param err an errno on Unix/Linux and an WSAError on win32)

View File

@ -114,17 +114,8 @@ incoming(void *closure, struct UTPSocket *s)
}
UTP_GetPeerName(s, from, &fromlen);
if(from->sa_family == AF_INET) {
struct sockaddr_in *sin = (struct sockaddr_in*)from;
addr.type = TR_AF_INET;
addr.addr.addr4.s_addr = sin->sin_addr.s_addr;
port = sin->sin_port;
} else if(from->sa_family == AF_INET6) {
struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)from;
addr.type = TR_AF_INET6;
addr.addr.addr6 = sin6->sin6_addr;
port = sin6->sin6_port;
} else {
if( !tr_ssToAddr( &addr, &port, &from_storage ) )
{
tr_nerr("UTP", "Unknown socket family");
UTP_Close(s);
return;