Add getNetworkForSocket().
This doesn't require a roundtrip to netd, since anybody can read the SO_MARK.
Change-Id: I51dd17725c4534cb0d5dbc8e93e844e6a7847959
diff --git a/client/NetdClient.cpp b/client/NetdClient.cpp
index 8a54354..7380224 100644
--- a/client/NetdClient.cpp
+++ b/client/NetdClient.cpp
@@ -16,6 +16,7 @@
#include "NetdClient.h"
+#include "Fwmark.h"
#include "FwmarkClient.h"
#include "FwmarkCommand.h"
#include "resolv_netid.h"
@@ -163,6 +164,19 @@
}
}
+extern "C" int getNetworkForSocket(unsigned* netId, int socketFd) {
+ if (!netId || socketFd < 0) {
+ return EBADF;
+ }
+ Fwmark fwmark;
+ socklen_t fwmarkLen = sizeof(fwmark.intValue);
+ if (getsockopt(socketFd, SOL_SOCKET, SO_MARK, &fwmark.intValue, &fwmarkLen) == -1) {
+ return errno;
+ }
+ *netId = fwmark.netId;
+ return 0;
+}
+
extern "C" unsigned getNetworkForProcess() {
return netIdForProcess;
}