This is an automated email from the ASF dual-hosted git repository. swebb2066 pushed a commit to branch smtp_appender in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git
commit 2bebb26593a610afae5dc63b3518cf1001b45994 Author: Stephen Webb <[email protected]> AuthorDate: Wed Apr 12 18:07:39 2023 +1000 Fix SMTP appender --- src/CMakeLists.txt | 4 ++ src/cmake/FindESMTP.cmake | 76 +++++++++++++++++++++++++++ src/main/cpp/smtpappender.cpp | 33 ++++++------ src/main/include/CMakeLists.txt | 12 +++-- src/main/include/log4cxx/private/string_c11.h | 2 +- src/test/cpp/CMakeLists.txt | 3 ++ 6 files changed, 109 insertions(+), 21 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 788320de..456ea0ba 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -22,6 +22,10 @@ add_subdirectory(main) target_compile_definitions(log4cxx PRIVATE ${LOG4CXX_COMPILE_DEFINITIONS} ${APR_COMPILE_DEFINITIONS} ${APR_UTIL_COMPILE_DEFINITIONS} ) target_include_directories(log4cxx INTERFACE $<INSTALL_INTERFACE:include> PRIVATE ${APR_INCLUDE_DIR} ${APR_UTIL_INCLUDE_DIR}) target_link_libraries(log4cxx PRIVATE ${APR_UTIL_LIBRARIES} ${EXPAT_LIBRARIES} ${APR_LIBRARIES} ${APR_SYSTEM_LIBS}) +if(HAS_LIBESMTP) + target_include_directories(log4cxx PRIVATE ${ESMTP_INCLUDE_DIRS}) + target_link_libraries(log4cxx PRIVATE ${ESMTP_LIBRARIES}) +endif() if(WIN32) # The ODBC appender is always enabled in the Windows configuration target_link_libraries(log4cxx PRIVATE odbc32.lib) diff --git a/src/cmake/FindESMTP.cmake b/src/cmake/FindESMTP.cmake new file mode 100644 index 00000000..2e6a6533 --- /dev/null +++ b/src/cmake/FindESMTP.cmake @@ -0,0 +1,76 @@ +# Locate libesmtp include paths and libraries +include(FindPackageHandleStandardArgs) + +# This module defines +# ESMTP_INCLUDE_DIR, where to find libesmtp.h, etc. +# ESMTP_LIBRARIES, the libraries to link against to use libesmtp. +# ESMTP_FOUND, set to 'yes' if found +macro(_esmtp_invoke _varname) + execute_process( + COMMAND ${_esmtp_CONFIG_EXECUTABLE} ${ARGN} + OUTPUT_VARIABLE _esmtp_output + RESULT_VARIABLE _esmtp_failed + ) + + if(_esmtp_failed) + message(FATAL_ERROR "${_esmtp_CONFIG_EXECUTABLE} ${ARGN} failed with result ${_esmtp_failed}") + else() + string(REGEX REPLACE "[\r\n]" "" _esmtp_output "${_esmtp_output}") + string(REGEX REPLACE " +$" "" _esmtp_output "${_esmtp_output}") + string(REGEX REPLACE "^ +" "" _esmtp_output "${_esmtp_output}") + + separate_arguments(_esmtp_output) + set(${_varname} "${_esmtp_output}") + endif(_esmtp_failed) +endmacro(_esmtp_invoke) + +if(NOT LIBESMTP_STATIC) # libesmtp-config does not support --static used in FindPkgConfig.cmake +find_package(PkgConfig) +pkg_check_modules(esmtp esmtp) +message("esmtp_FOUND=${esmtp_FOUND}") +endif() + +if(esmtp_FOUND) + find_path(ESMTP_INCLUDE_DIR + NAMES libesmtp.h + HINTS ${ESMTP_INCLUDE_DIRS} + PATH_SUFFIXES esmtp) + if (LIBESMTP_STATIC OR NOT BUILD_SHARED_LIBS) + set(ESMTP_LIBRARIES ${LIBESMTP_STATIC_LINK_LIBRARIES}) + else() + set(ESMTP_LIBRARIES ${ESMTP_LINK_LIBRARIES}) + endif() +else() + find_program(_esmtp_CONFIG_EXECUTABLE + libesmtp-config + PATHS /usr/local/opt/libesmtp/bin $ENV{ProgramFiles}/esmtp/bin + ) + mark_as_advanced(_esmtp_CONFIG_EXECUTABLE) + if(EXISTS ${_esmtp_CONFIG_EXECUTABLE}) + _esmtp_invoke(_esmtp_cflags_args --cflags) + message("_esmtp_cflags_args=${_esmtp_cflags_args}") + string(REGEX MATCH "-I([^ ;]+)" _esmtp_include_flag "${_esmtp_cflags_args}") + set(ESMTP_INCLUDE_DIR "${CMAKE_MATCH_1}") + if (LIBESMTP_STATIC OR NOT BUILD_SHARED_LIBS) + find_library(ESMTP_LIBRARIES NAMES libesmtp.a) + else() + _esmtp_invoke(ESMTP_LIBRARIES --libs) + endif() + else() + find_path(ESMTP_INCLUDE_DIR libesmtp.h PATH_SUFFIXES esmtp) + if (LIBESMTP_STATIC OR NOT BUILD_SHARED_LIBS) + find_library(ESMTP_LIBRARIES NAMES libesmtp.a) + else() + find_library(ESMTP_LIBRARIES NAMES esmtp) + endif() + endif() +endif() +if(ESMTP_LIBRARIES) + set(ESMTP_FOUND TRUE) +endif() + +message("ESMTP_FOUND=${ESMTP_FOUND}") +message("ESMTP_INCLUDE_DIR=${ESMTP_INCLUDE_DIR}") +message("ESMTP_LIBRARIES=${ESMTP_LIBRARIES}") +find_package_handle_standard_args(ESMTP + ESMTP_INCLUDE_DIR ESMTP_LIBRARIES) diff --git a/src/main/cpp/smtpappender.cpp b/src/main/cpp/smtpappender.cpp index b295c1cf..47f4bfe8 100644 --- a/src/main/cpp/smtpappender.cpp +++ b/src/main/cpp/smtpappender.cpp @@ -19,6 +19,7 @@ #include <log4cxx/helpers/loglog.h> #include <log4cxx/helpers/optionconverter.h> #include <log4cxx/spi/loggingevent.h> +#include <log4cxx/private/string_c11.h> #include <log4cxx/helpers/stringhelper.h> #include <log4cxx/helpers/stringtokenizer.h> #include <log4cxx/helpers/transcoder.h> @@ -192,7 +193,7 @@ class SMTPMessage const LogString msg, Pool& p) { message = smtp_add_message(session); - current_len = str.length(); + current_len = msg.length(); body = current = toMessage(msg, p); messagecbState = 0; smtp_set_reverse_path(message, toAscii(from, p)); @@ -676,23 +677,23 @@ bool SMTPAppender::checkEntryConditions() { #if LOG4CXX_HAVE_LIBESMTP - if ((to.empty() && cc.empty() && bcc.empty()) || from.empty() || smtpHost.empty()) + if ((_priv->to.empty() && _priv->cc.empty() && _priv->bcc.empty()) || _priv->from.empty() || _priv->smtpHost.empty()) { - errorHandler->error(LOG4CXX_STR("Message not configured.")); + _priv->errorHandler->error(LOG4CXX_STR("Message not configured.")); return false; } - if (evaluator == 0) + if (_priv->evaluator == 0) { - errorHandler->error(LOG4CXX_STR("No TriggeringEventEvaluator is set for appender [") + - name + LOG4CXX_STR("].")); + _priv->errorHandler->error(LOG4CXX_STR("No TriggeringEventEvaluator is set for appender [") + + _priv->name + LOG4CXX_STR("].")); return false; } - if (layout == 0) + if (_priv->layout == 0) { - errorHandler->error(LOG4CXX_STR("No layout set for appender named [") + name + LOG4CXX_STR("].")); + _priv->errorHandler->error(LOG4CXX_STR("No layout set for appender named [") + _priv->name + LOG4CXX_STR("].")); return false; } @@ -751,22 +752,22 @@ void SMTPAppender::sendBuffer(Pool& p) try { LogString sbuf; - layout->appendHeader(sbuf, p); + _priv->layout->appendHeader(sbuf, p); - int len = cb.length(); + int len = _priv->cb.length(); for (int i = 0; i < len; i++) { - LoggingEventPtr event = cb.get(); - layout->format(sbuf, event, p); + LoggingEventPtr event = _priv->cb.get(); + _priv->layout->format(sbuf, event, p); } - layout->appendFooter(sbuf, p); + _priv->layout->appendFooter(sbuf, p); - SMTPSession session(smtpHost, smtpPort, smtpUsername, smtpPassword, p); + SMTPSession session(_priv->smtpHost, _priv->smtpPort, _priv->smtpUsername, _priv->smtpPassword, p); - SMTPMessage message(session, from, to, cc, - bcc, subject, sbuf, p); + SMTPMessage message(session, _priv->from, _priv->to, _priv->cc, + _priv->bcc, _priv->subject, sbuf, p); session.send(p); diff --git a/src/main/include/CMakeLists.txt b/src/main/include/CMakeLists.txt index 4b142fdc..49dceb6d 100644 --- a/src/main/include/CMakeLists.txt +++ b/src/main/include/CMakeLists.txt @@ -129,11 +129,15 @@ else() endif(LOG4CXX_ENABLE_ODBC) option(LOG4CXX_ENABLE_ESMTP "Support logging via libesmtp" OFF) +option(LIBESMTP_STATIC "Link to the libesmtp static library" OFF) if(LOG4CXX_ENABLE_ESMTP) - CHECK_LIBRARY_EXISTS(esmtp smtp_create_session "" HAS_LIBESMTP) - if(NOT HAS_LIBESMTP) - message(SEND_ERROR "SMTP support with libesmtp not found but requested") - endif() + find_package(ESMTP) + if(ESMTP_FOUND) + set(HAS_LIBESMTP 1) + else() + set(HAS_LIBESMTP 0) + message(SEND_ERROR "libesmtp not found but SMTP support requested") + endif(ESMTP_FOUND) else() set(HAS_LIBESMTP 0) endif(LOG4CXX_ENABLE_ESMTP) diff --git a/src/main/include/log4cxx/private/string_c11.h b/src/main/include/log4cxx/private/string_c11.h index f7182454..4c5a1b44 100644 --- a/src/main/include/log4cxx/private/string_c11.h +++ b/src/main/include/log4cxx/private/string_c11.h @@ -24,7 +24,7 @@ #include <limits.h> #if !defined(RSIZE_MAX) && defined(SSIZE_MAX) #define RSIZE_MAX (SSIZE_MAX >> 4) -#else !defined(RSIZE_MAX) +#else // !defined(RSIZE_MAX) #define RSIZE_MAX (2 << 20) #endif diff --git a/src/test/cpp/CMakeLists.txt b/src/test/cpp/CMakeLists.txt index 751abf8c..35f1cf2d 100644 --- a/src/test/cpp/CMakeLists.txt +++ b/src/test/cpp/CMakeLists.txt @@ -107,6 +107,9 @@ foreach(testName IN LISTS ALL_LOG4CXX_TESTS) target_compile_definitions(${testName} PRIVATE ${TEST_COMPILE_DEFINITIONS} ${LOG4CXX_COMPILE_DEFINITIONS} ${APR_COMPILE_DEFINITIONS} ${APR_UTIL_COMPILE_DEFINITIONS} ) target_include_directories(${testName} PRIVATE ${CMAKE_CURRENT_LIST_DIR} $<TARGET_PROPERTY:log4cxx,INCLUDE_DIRECTORIES>) target_link_libraries(${testName} PRIVATE testingFramework testingUtilities log4cxx ${APR_LIBRARIES} ${APR_SYSTEM_LIBS} Threads::Threads) + if(HAS_LIBESMTP) + target_link_libraries(${testName} PRIVATE ${ESMTP_LIBRARIES}) + endif() add_test(NAME ${testName} COMMAND ${testName} -v WORKING_DIRECTORY ${UNIT_TEST_WORKING_DIR}
