diff options
-rw-r--r-- | src/base/socket.cc | 14 | ||||
-rw-r--r-- | src/base/socket.hh | 4 |
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; |