Return errors explicitly instead of using errno.
Change-Id: Ia29f500e747a8c72d13a8f38c3b08c319c8c029a
diff --git a/client/NetdClient.cpp b/client/NetdClient.cpp
index ba6dadd..8a54354 100644
--- a/client/NetdClient.cpp
+++ b/client/NetdClient.cpp
@@ -40,8 +40,7 @@
ConnectFunctionType libcConnect = 0;
SocketFunctionType libcSocket = 0;
-int closeFdAndRestoreErrno(int fd) {
- int error = errno;
+int closeFdAndSetErrno(int fd, int error) {
close(fd);
errno = error;
return -1;
@@ -58,13 +57,14 @@
} else {
socklen_t familyLen = sizeof(family);
if (getsockopt(acceptedSocket, SOL_SOCKET, SO_DOMAIN, &family, &familyLen) == -1) {
- return closeFdAndRestoreErrno(acceptedSocket);
+ return closeFdAndSetErrno(acceptedSocket, errno);
}
}
if (FwmarkClient::shouldSetFwmark(family)) {
FwmarkCommand command = {FwmarkCommand::ON_ACCEPT, 0};
- if (!FwmarkClient().send(&command, sizeof(command), acceptedSocket)) {
- return closeFdAndRestoreErrno(acceptedSocket);
+ int error = FwmarkClient().send(&command, sizeof(command), acceptedSocket);
+ if (error) {
+ return closeFdAndSetErrno(acceptedSocket, error);
}
}
return acceptedSocket;
@@ -73,7 +73,9 @@
int netdClientConnect(int sockfd, const sockaddr* addr, socklen_t addrlen) {
if (sockfd >= 0 && addr && FwmarkClient::shouldSetFwmark(addr->sa_family)) {
FwmarkCommand command = {FwmarkCommand::ON_CONNECT, 0};
- if (!FwmarkClient().send(&command, sizeof(command), sockfd)) {
+ int error = FwmarkClient().send(&command, sizeof(command), sockfd);
+ if (error) {
+ errno = error;
return -1;
}
}
@@ -87,8 +89,9 @@
}
unsigned netId = netIdForProcess;
if (netId != NETID_UNSET && FwmarkClient::shouldSetFwmark(domain)) {
- if (!setNetworkForSocket(netId, socketFd)) {
- return closeFdAndRestoreErrno(socketFd);
+ int error = setNetworkForSocket(netId, socketFd);
+ if (error) {
+ return closeFdAndSetErrno(socketFd, error);
}
}
return socketFd;
@@ -105,10 +108,10 @@
return netIdForResolv;
}
-bool setNetworkForTarget(unsigned netId, std::atomic_uint* target) {
+int setNetworkForTarget(unsigned netId, std::atomic_uint* target) {
if (netId == NETID_UNSET) {
*target = netId;
- return true;
+ return 0;
}
// Verify that we are allowed to use |netId|, by creating a socket and trying to have it marked
// with the netId. Call libcSocket() directly; else the socket creation (via netdClientSocket())
@@ -120,14 +123,14 @@
socketFd = socket(AF_INET6, SOCK_DGRAM, 0);
}
if (socketFd < 0) {
- return false;
+ return errno;
}
- bool status = setNetworkForSocket(netId, socketFd);
- closeFdAndRestoreErrno(socketFd);
- if (status) {
+ int error = setNetworkForSocket(netId, socketFd);
+ if (!error) {
*target = netId;
}
- return status;
+ close(socketFd);
+ return error;
}
} // namespace
@@ -164,27 +167,25 @@
return netIdForProcess;
}
-extern "C" bool setNetworkForSocket(unsigned netId, int socketFd) {
+extern "C" int setNetworkForSocket(unsigned netId, int socketFd) {
if (socketFd < 0) {
- errno = EBADF;
- return false;
+ return EBADF;
}
FwmarkCommand command = {FwmarkCommand::SELECT_NETWORK, netId};
return FwmarkClient().send(&command, sizeof(command), socketFd);
}
-extern "C" bool setNetworkForProcess(unsigned netId) {
+extern "C" int setNetworkForProcess(unsigned netId) {
return setNetworkForTarget(netId, &netIdForProcess);
}
-extern "C" bool setNetworkForResolv(unsigned netId) {
+extern "C" int setNetworkForResolv(unsigned netId) {
return setNetworkForTarget(netId, &netIdForResolv);
}
-extern "C" bool protectFromVpn(int socketFd) {
+extern "C" int protectFromVpn(int socketFd) {
if (socketFd < 0) {
- errno = EBADF;
- return false;
+ return EBADF;
}
FwmarkCommand command = {FwmarkCommand::PROTECT_FROM_VPN, 0};
return FwmarkClient().send(&command, sizeof(command), socketFd);