You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by sw...@apache.org on 2025/05/13 02:13:43 UTC

(logging-log4cxx) branch master updated: Support a TelnetAppender that accepts connections on a specific network (#498)

This is an automated email from the ASF dual-hosted git repository.

swebb2066 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git


The following commit(s) were added to refs/heads/master by this push:
     new 4d89919a Support a TelnetAppender that accepts connections on a specific network (#498)
4d89919a is described below

commit 4d89919a99ca4f22f66bff378ad06500b0a0ede5
Author: michieldwitte <mi...@gmail.com>
AuthorDate: Tue May 13 04:13:38 2025 +0200

    Support a TelnetAppender that accepts connections on a specific network (#498)
    
    Co-authored-by: Michiel De Witte <mi...@basalte.be>
---
 src/main/cpp/aprserversocket.cpp                   | 14 +++++++++++---
 src/main/cpp/serversocket.cpp                      |  4 ++--
 src/main/cpp/telnetappender.cpp                    | 17 ++++++++++++++++-
 src/main/include/log4cxx/helpers/serversocket.h    |  4 ++--
 src/main/include/log4cxx/net/telnetappender.h      | 11 +++++++++++
 src/main/include/log4cxx/private/aprserversocket.h |  4 ++--
 src/test/cpp/net/socketappendertestcase.cpp        |  2 +-
 src/test/cpp/net/telnetappendertestcase.cpp        |  1 +
 8 files changed, 46 insertions(+), 11 deletions(-)

diff --git a/src/main/cpp/aprserversocket.cpp b/src/main/cpp/aprserversocket.cpp
index b7bd27f5..c22c0263 100644
--- a/src/main/cpp/aprserversocket.cpp
+++ b/src/main/cpp/aprserversocket.cpp
@@ -18,6 +18,7 @@
 #include <log4cxx/private/aprserversocket.h>
 #include <log4cxx/private/serversocket_priv.h>
 #include <log4cxx/private/aprsocket.h>
+#include <log4cxx/helpers/transcoder.h>
 #include "apr_network_io.h"
 #include "apr_pools.h"
 #include "apr_poll.h"
@@ -37,10 +38,10 @@ struct APRServerSocket::APRServerSocketPriv : public ServerSocketPrivate {
 
 #if LOG4CXX_ABI_VERSION <= 15
 APRServerSocket::APRServerSocket(int port) : 
-	APRServerSocket(port, false) {}
+	APRServerSocket(port, false, {}) {}
 #endif
 
-APRServerSocket::APRServerSocket(int port, bool reuseAddress) :
+APRServerSocket::APRServerSocket(int port, bool reuseAddress, const LogString& hostname) :
 	ServerSocket(std::make_unique<APRServerSocketPriv>()){
 	apr_status_t status =
 		apr_socket_create(&_priv->socket, APR_INET, SOCK_STREAM,
@@ -68,9 +69,16 @@ APRServerSocket::APRServerSocket(int port, bool reuseAddress) :
 	}
 
 	// Create server socket address (including port number)
+	std::string hostname_str;
+	const char* hostname_ptr = NULL;
+	if (!hostname.empty()) {
+		Transcoder::encode(hostname, hostname_str);
+		hostname_ptr = hostname_str.c_str();
+	}
+
 	apr_sockaddr_t* server_addr;
 	status =
-		apr_sockaddr_info_get(&server_addr, NULL, APR_INET,
+		apr_sockaddr_info_get(&server_addr, hostname_ptr, APR_INET,
 			port, 0, _priv->pool.getAPRPool());
 
 	if (status != APR_SUCCESS)
diff --git a/src/main/cpp/serversocket.cpp b/src/main/cpp/serversocket.cpp
index e696bd1c..6be302db 100644
--- a/src/main/cpp/serversocket.cpp
+++ b/src/main/cpp/serversocket.cpp
@@ -57,6 +57,6 @@ ServerSocketUniquePtr ServerSocket::create(int port){
 }
 #endif
 
-ServerSocketUniquePtr ServerSocket::create(int port, bool reuseAddress){
-	return std::make_unique<APRServerSocket>(port, reuseAddress);
+ServerSocketUniquePtr ServerSocket::create(int port, bool reuseAddress, const LogString& hostname){
+	return std::make_unique<APRServerSocket>(port, reuseAddress, hostname);
 }
diff --git a/src/main/cpp/telnetappender.cpp b/src/main/cpp/telnetappender.cpp
index aa1374cd..fcacc40c 100644
--- a/src/main/cpp/telnetappender.cpp
+++ b/src/main/cpp/telnetappender.cpp
@@ -58,6 +58,7 @@ struct TelnetAppender::TelnetAppenderPriv : public AppenderSkeletonPrivate
 	{ stopAcceptingConnections(); }
 
 	int port;
+	LogString hostname;
 	bool reuseAddress = false;
 	ConnectionList connections;
 	LogString encoding;
@@ -113,7 +114,7 @@ void TelnetAppender::activateOptions(Pool& /* p */)
 {
 	if (_priv->serverSocket == NULL)
 	{
-		_priv->serverSocket = ServerSocket::create(_priv->port, _priv->reuseAddress);
+		_priv->serverSocket = ServerSocket::create(_priv->port, _priv->reuseAddress, _priv->hostname);
 		_priv->serverSocket->setSoTimeout(1000);
 	}
 
@@ -140,6 +141,10 @@ void TelnetAppender::setOption(const LogString& option,
 	{
 		setReuseAddress(OptionConverter::toBoolean(value, true));
 	}
+	else if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("HOSTNAME"), LOG4CXX_STR("hostname")))
+	{
+		setHostname(value);
+	}
 	else
 	{
 		AppenderSkeleton::setOption(option, value);
@@ -341,6 +346,16 @@ void TelnetAppender::setPort(int port1)
 	_priv->port = port1;
 }
 
+LogString TelnetAppender::getHostname() const
+{
+	return _priv->hostname;
+}
+
+void TelnetAppender::setHostname(const LogString& hostname)
+{
+	_priv->hostname = hostname;
+}
+
 int TelnetAppender::getMaxConnections() const
 {
 	return static_cast<int>(_priv->connections.size());
diff --git a/src/main/include/log4cxx/helpers/serversocket.h b/src/main/include/log4cxx/helpers/serversocket.h
index 5b7bd4a1..1e6ec371 100644
--- a/src/main/include/log4cxx/helpers/serversocket.h
+++ b/src/main/include/log4cxx/helpers/serversocket.h
@@ -59,9 +59,9 @@ class LOG4CXX_EXPORT ServerSocket
 
 #if LOG4CXX_ABI_VERSION <= 15
 		static ServerSocketUniquePtr create(int port);
-		static ServerSocketUniquePtr create(int port, bool reuseAddress);
+		static ServerSocketUniquePtr create(int port, bool reuseAddress, const LogString& hostname);
 #else
-		static ServerSocketUniquePtr create(int port, bool reuseAddress = false);
+		static ServerSocketUniquePtr create(int port, bool reuseAddress = false, const LogString& hostname = {});
 #endif
 
 };
diff --git a/src/main/include/log4cxx/net/telnetappender.h b/src/main/include/log4cxx/net/telnetappender.h
index e38d344c..0b1c6a46 100644
--- a/src/main/include/log4cxx/net/telnetappender.h
+++ b/src/main/include/log4cxx/net/telnetappender.h
@@ -116,6 +116,17 @@ class LOG4CXX_EXPORT TelnetAppender : public AppenderSkeleton
 		*/
 		void setPort(int newValue);
 
+		/**
+		The <b>Hostname</b> on which to accept connections.
+		*/
+		LogString getHostname() const;
+
+		/**
+		Use \c newValue as the Hostname on which to accept connections.
+		By default connections are accepted on any network interface device.
+		*/
+		void setHostname(const LogString& newValue);
+
 		/**
 		The number of allowed concurrent connections.
 
diff --git a/src/main/include/log4cxx/private/aprserversocket.h b/src/main/include/log4cxx/private/aprserversocket.h
index d8b3617f..363304eb 100644
--- a/src/main/include/log4cxx/private/aprserversocket.h
+++ b/src/main/include/log4cxx/private/aprserversocket.h
@@ -33,9 +33,9 @@ class LOG4CXX_EXPORT APRServerSocket : public helpers::ServerSocket
         public:
 #if LOG4CXX_ABI_VERSION <= 15
             APRServerSocket(int port);
-            APRServerSocket(int port, bool reuseAddress);
+            APRServerSocket(int port, bool reuseAddress, const LogString& hostname);
 #else
-            APRServerSocket(int port, bool reuseAddress = false);
+            APRServerSocket(int port, bool reuseAddress = false, const LogString& hostname = {});
 #endif
 
 	    void close() override;
diff --git a/src/test/cpp/net/socketappendertestcase.cpp b/src/test/cpp/net/socketappendertestcase.cpp
index 607863f2..e3b6111d 100644
--- a/src/test/cpp/net/socketappendertestcase.cpp
+++ b/src/test/cpp/net/socketappendertestcase.cpp
@@ -80,7 +80,7 @@ class SocketAppenderTestCase : public AppenderSkeletonTestCase
 			helpers::ServerSocketUniquePtr serverSocket;
 			try
 			{
-				serverSocket = helpers::ServerSocket::create(tcpPort, true);
+				serverSocket = helpers::ServerSocket::create(tcpPort, true, {});
 			}
 			catch (std::exception& ex)
 			{
diff --git a/src/test/cpp/net/telnetappendertestcase.cpp b/src/test/cpp/net/telnetappendertestcase.cpp
index 1e5a7437..b7ba0c4b 100644
--- a/src/test/cpp/net/telnetappendertestcase.cpp
+++ b/src/test/cpp/net/telnetappendertestcase.cpp
@@ -106,6 +106,7 @@ class TelnetAppenderTestCase : public AppenderSkeletonTestCase
 			appender->setPort(TEST_PORT);
 			appender->setMaxConnections(1);
 			appender->setReuseAddress(true);
+			appender->setHostname(LOG4CXX_STR("127.0.0.1"));
 			Pool p;
 			appender->activateOptions(p);
 			LoggerPtr root(Logger::getRootLogger());