nfs4: Take advantage of PeerAddress class in Connection::Connect()
This commit is contained in:
@@ -636,15 +636,12 @@ Connection::SetTo(Connection **_connection, int socket,
|
|||||||
status_t
|
status_t
|
||||||
Connection::Connect()
|
Connection::Connect()
|
||||||
{
|
{
|
||||||
const sockaddr& address
|
|
||||||
= *reinterpret_cast<const sockaddr*>(&fPeerAddress);
|
|
||||||
|
|
||||||
switch (fPeerAddress.fProtocol) {
|
switch (fPeerAddress.fProtocol) {
|
||||||
case IPPROTO_TCP:
|
case IPPROTO_TCP:
|
||||||
fSocket = socket(address.sa_family, SOCK_STREAM, IPPROTO_TCP);
|
fSocket = socket(fPeerAddress.Family(), SOCK_STREAM, IPPROTO_TCP);
|
||||||
break;
|
break;
|
||||||
case IPPROTO_UDP:
|
case IPPROTO_UDP:
|
||||||
fSocket = socket(address.sa_family, SOCK_DGRAM, IPPROTO_UDP);
|
fSocket = socket(fPeerAddress.Family(), SOCK_DGRAM, IPPROTO_UDP);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
@@ -655,21 +652,7 @@ Connection::Connect()
|
|||||||
status_t result;
|
status_t result;
|
||||||
uint16 port, attempt = 0;
|
uint16 port, attempt = 0;
|
||||||
|
|
||||||
sockaddr_in addr;
|
PeerAddress address(fPeerAddress.Family());
|
||||||
sockaddr_in6 addr6;
|
|
||||||
switch (address.sa_family) {
|
|
||||||
case AF_INET:
|
|
||||||
memset(&addr, 0, sizeof(addr));
|
|
||||||
addr.sin_len = sizeof(addr);
|
|
||||||
addr.sin_family = AF_INET;
|
|
||||||
addr.sin_addr.s_addr = INADDR_ANY;
|
|
||||||
break;
|
|
||||||
case AF_INET6:
|
|
||||||
memset(&addr6, 0, sizeof(addr6));
|
|
||||||
addr6.sin6_len = sizeof(addr6);
|
|
||||||
addr6.sin6_family = AF_INET6;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
port = rand() % (IPPORT_RESERVED - NFS_MIN_PORT);
|
port = rand() % (IPPORT_RESERVED - NFS_MIN_PORT);
|
||||||
@@ -679,19 +662,9 @@ Connection::Connect()
|
|||||||
port = 0;
|
port = 0;
|
||||||
attempt++;
|
attempt++;
|
||||||
|
|
||||||
switch (address.sa_family) {
|
address.SetPort(port);
|
||||||
case AF_INET:
|
result = bind(fSocket, (sockaddr*)&address.fAddress,
|
||||||
addr.sin_port = htons(port);
|
address.AddressSize());
|
||||||
result = bind(fSocket, (struct sockaddr*)&addr, sizeof(addr));
|
|
||||||
break;
|
|
||||||
case AF_INET6:
|
|
||||||
addr6.sin6_port = htons(port);
|
|
||||||
result = bind(fSocket, (struct sockaddr*)&addr6, sizeof(addr6));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
result = EAFNOSUPPORT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} while (attempt <= 10 && result != B_OK);
|
} while (attempt <= 10 && result != B_OK);
|
||||||
|
|
||||||
if (attempt > 10) {
|
if (attempt > 10) {
|
||||||
@@ -699,19 +672,8 @@ Connection::Connect()
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
socklen_t addressSize;
|
result = connect(fSocket, (sockaddr*)&fPeerAddress.fAddress,
|
||||||
switch (address.sa_family) {
|
fPeerAddress.AddressSize());
|
||||||
case AF_INET:
|
|
||||||
addressSize = sizeof(sockaddr_in);
|
|
||||||
break;
|
|
||||||
case AF_INET6:
|
|
||||||
addressSize = sizeof(sockaddr_in6);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return B_BAD_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = connect(fSocket, &address, addressSize);
|
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
result = errno;
|
result = errno;
|
||||||
close(fSocket);
|
close(fSocket);
|
||||||
|
|||||||
Reference in New Issue
Block a user