>From 5e108a0140131cff26a8222ec880480c1859c338 Mon Sep 17 00:00:00 2001
From: Hofi <hofione@gmail.com>
Date: Wed, 27 Aug 2025 17:23:32 +0200
Subject: [PATCH] cmake: fix afmongodb discovery, add support for v2

Signed-off-by: Hofi <hofione@gmail.com>
---
 modules/afmongodb/CMakeLists.txt |  118 ++++++++++++++++++++++++++++-----------
 syslog-ng-config.h.in            |    2 
 2 files changed, 89 insertions(+), 31 deletions(-)

--- a/modules/afmongodb/CMakeLists.txt
+++ b/modules/afmongodb/CMakeLists.txt
@@ -1,39 +1,95 @@
-if (ENABLE_MONGODB STREQUAL OFF)
-  return()
+if(NOT DEFINED ENABLE_MONGODB OR ENABLE_MONGODB)
+  set(LMC_1_MIN_VERSION 1.0.0)
+  set(LMC_MIN_VERSION 2.0.0)
+
+  find_package(PkgConfig REQUIRED)
+
+  # First try libmongoc-1.0
+  pkg_check_modules(LIBMONGO libmongoc-1.0>=${LMC_1_MIN_VERSION})
+
+  if(LIBMONGO_FOUND)
+    set(ENABLE_MONGODB_INFO_STR "v1" CACHE INTERNAL "MongoDB version")
+    set(MONGOC_HEADER "<mongoc.h>")
+
+    # libbson-1.0 is needed for libmongoc-1.0
+    pkg_check_modules(LIBBSON libbson-1.0>=${LMC_1_MIN_VERSION})
+
+    if(NOT LIBBSON_FOUND)
+      message(FATAL_ERROR "libbson-1.0 is required for libmongoc-1.0")
+    endif()
+
+    include_directories(${LIBMONGO_INCLUDE_DIRS} ${LIBBSON_INCLUDE_DIRS})
+    link_directories(${LIBMONGO_LIBRARY_DIRS} ${LIBBSON_LIBRARY_DIRS})
+
+  else()
+    # libmongoc-1.0 not found, try mongoc2
+    pkg_check_modules(LIBMONGO mongoc2>=${LMC_MIN_VERSION})
+
+    if(LIBMONGO_FOUND)
+      set(SYSLOG_NG_HAVE_MONGOC_V2 1 CACHE INTERNAL "MongoDB version 2 is available")
+      set(ENABLE_MONGODB_INFO_STR "v2" CACHE INTERNAL "MongoDB version")
+      set(MONGOC_HEADER "<mongoc/mongoc.h>")
+
+      include_directories(${LIBMONGO_INCLUDE_DIRS})
+      link_directories(${LIBMONGO_LIBRARY_DIRS})
+    endif()
+  endif()
+endif()
+
+if(ENABLE_MONGODB AND NOT LIBMONGO_FOUND)
+  message(FATAL_ERROR "Could not find suitable mongo-c-driver (or its dependencies), and MongoDB support was explicitly enabled.")
 endif()
 
-find_package(libmongoc-1.0)
-find_package(libbson-1.0)
+module_switch(ENABLE_MONGODB "Enable mongodb destination driver" LIBMONGO_FOUND)
+
+if(NOT ENABLE_MONGODB)
+  return()
+endif()
 
-module_switch(ENABLE_MONGODB "Enable mongodb destination driver" libmongoc-1.0_FOUND)
+include(CheckCSourceCompiles)
+set(CMAKE_REQUIRED_INCLUDES ${LIBMONGO_INCLUDE_DIRS})
 
-if (ENABLE_MONGODB)
+if(ENABLE_MONGODB_INFO_STR STREQUAL "v1")
+  list(APPEND CMAKE_REQUIRED_INCLUDES ${LIBBSON_INCLUDE_DIRS})
+endif()
 
-  set(CMAKE_REQUIRED_INCLUDES ${MONGOC_INCLUDE_DIRS})
-  set(CMAKE_REQUIRED_LIBRARIES ${MONGOC_LIBRARY})
-  set(CMAKE_REQUIRED_LIBRARIES ${BSON_LIBRARY})
-  check_symbol_exists(mongoc_uri_set_option_as_int32 "mongoc.h" SYSLOG_NG_HAVE_DECL_MONGOC_URI_SET_OPTION_AS_INT32)
-  check_symbol_exists(MONGOC_URI_SERVERSELECTIONTIMEOUTMS "mongoc.h" SYSLOG_NG_HAVE_DECL_MONGOC_URI_SERVERSELECTIONTIMEOUTMS)
-
-  set(AFMONGODB_SOURCES
-    "afmongodb.h"
-    "afmongodb.c"
-    "afmongodb-worker.h"
-    "afmongodb-worker.c"
-    "afmongodb-parser.h"
-    "afmongodb-parser.c"
-    "afmongodb-private.h"
-  )
-
-  add_module(
-    TARGET afmongodb
-    GRAMMAR afmongodb-grammar
-    INCLUDES ${MONGOC_INCLUDE_DIRS}
-    DEPENDS ${MONGOC_LIBRARY}
-    DEPENDS ${BSON_LIBRARY}
-    SOURCES ${AFMONGODB_SOURCES}
-  )
+check_c_source_compiles("
+#include ${MONGOC_HEADER}
+#include <bson/bson.h>
+int main() {
+    (void) mongoc_uri_set_option_as_int32;
+    return 0;
+}" HAVE_MONGOC_URI_SET_OPTION_AS_INT32)
+check_c_source_compiles("
+#include ${MONGOC_HEADER}
+int main() {
+    (void) MONGOC_URI_SERVERSELECTIONTIMEOUTMS;
+    return 0;
+}" HAVE_MONGOC_URI_SERVERSELECTIONTIMEOUTMS)
 
-  add_test_subdirectory(tests)
+if(HAVE_MONGOC_URI_SET_OPTION_AS_INT32)
+  add_compile_definitions(HAVE_MONGOC_URI_SET_OPTION_AS_INT32=1)
+endif()
 
+if(HAVE_MONGOC_URI_SERVERSELECTIONTIMEOUTMS)
+  add_compile_definitions(HAVE_MONGOC_URI_SERVERSELECTIONTIMEOUTMS=1)
 endif()
+
+set(AFMONGODB_SOURCES
+  "afmongodb.h"
+  "afmongodb.c"
+  "afmongodb-worker.h"
+  "afmongodb-worker.c"
+  "afmongodb-parser.h"
+  "afmongodb-parser.c"
+  "afmongodb-private.h"
+)
+
+add_module(
+  TARGET afmongodb
+  GRAMMAR afmongodb-grammar
+  DEPENDS ${LIBMONGO_LDFLAGS}
+  SOURCES ${AFMONGODB_SOURCES}
+)
+
+add_test_subdirectory(tests)
--- a/syslog-ng-config.h.in
+++ b/syslog-ng-config.h.in
@@ -109,3 +109,5 @@
 #cmakedefine01 SYSLOG_NG_ENABLE_AFSOCKET_MEMINFO_METRICS
 #cmakedefine01 SYSLOG_NG_HAVE_IV_WORK_POOL_SUBMIT_CONTINUATION
 #cmakedefine01 SYSLOG_NG_HAVE_DECL_CURLUE_LAST
+#cmakedefine01 SYSLOG_NG_HAVE_MEMDUP2
+#cmakedefine01 SYSLOG_NG_HAVE_MONGOC_V2
