(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:
parent
9024cb29f9
commit
3fdd80eb0d
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue