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());