base: Teach the socket listeners how to bind to the loopback.
[gem5.git] / src / base / socket.cc
index 7a444373bfa5d25cfc70260946919fa71f3f25e2..5ef0f4b9eddcbd7e416c023786d1a2e9797bbe4a 100644 (file)
 
 #include "base/misc.hh"
 #include "base/types.hh"
+#include "sim/byteswap.hh"
 
 using namespace std;
 
 bool ListenSocket::listeningDisabled = false;
 bool ListenSocket::anyListening = false;
 
+bool ListenSocket::bindToLoopback = false;
+
 void
 ListenSocket::disableAll()
 {
@@ -60,6 +63,14 @@ ListenSocket::allDisabled()
     return listeningDisabled;
 }
 
+void
+ListenSocket::loopbackOnly()
+{
+    if (anyListening)
+        panic("Too late to bind to loopback, already have a listener");
+    bindToLoopback = true;
+}
+
 ////////////////////////////////////////////////////////////////////////
 //
 //
@@ -94,7 +105,8 @@ ListenSocket::listen(int port, bool reuse)
 
     struct sockaddr_in sockaddr;
     sockaddr.sin_family = PF_INET;
-    sockaddr.sin_addr.s_addr = INADDR_ANY;
+    sockaddr.sin_addr.s_addr =
+        htobe<unsigned long>(bindToLoopback ? INADDR_LOOPBACK : INADDR_ANY);
     sockaddr.sin_port = htons(port);
     // finally clear sin_zero
     memset(&sockaddr.sin_zero, 0, sizeof(sockaddr.sin_zero));