summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/base/socket.cc14
-rw-r--r--src/base/socket.hh4
2 files changed, 17 insertions, 1 deletions
diff --git a/src/base/socket.cc b/src/base/socket.cc
index 7a444373b..5ef0f4b9e 100644
--- a/src/base/socket.cc
+++ b/src/base/socket.cc
@@ -40,12 +40,15 @@
#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));
diff --git a/src/base/socket.hh b/src/base/socket.hh
index 942318e45..fab7f7576 100644
--- a/src/base/socket.hh
+++ b/src/base/socket.hh
@@ -37,10 +37,14 @@ class ListenSocket
static bool listeningDisabled;
static bool anyListening;
+ static bool bindToLoopback;
+
public:
static void disableAll();
static bool allDisabled();
+ static void loopbackOnly();
+
protected:
bool listening;
int fd;