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 <[email protected]>
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 <[email protected]>
---
 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());

Reply via email to