]> source.dussan.org Git - rspamd.git/commitdiff
[Project] Detect memrchr in systems that supports it
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 24 Jul 2020 12:34:10 +0000 (13:34 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 24 Jul 2020 19:33:33 +0000 (20:33 +0100)
CMakeLists.txt
cmake/OSDep.cmake
config.h.in
src/libutil/str_util.c
src/libutil/str_util.h

index 0af33f1fe3fb4c5db4e2a482aa8b032b28719f2a..b794b9dbdd050fef1857bf017bdfd1f33bf51c35 100644 (file)
@@ -345,6 +345,7 @@ CHECK_SYMBOL_EXISTS(getaddrinfo "sys/types.h;sys/socket.h;netdb.h" HAVE_GETADDRI
 CHECK_SYMBOL_EXISTS(sched_yield "sched.h" HAVE_SCHED_YIELD)
 CHECK_SYMBOL_EXISTS(__get_cpuid "cpuid.h" HAVE_GET_CPUID)
 CHECK_SYMBOL_EXISTS(nftw "sys/types.h;ftw.h" HAVE_NFTW)
+CHECK_SYMBOL_EXISTS(memrchr "string.h" HAVE_MEMRCHR)
 IF(ENABLE_PCRE2 MATCHES "ON")
        LIST(APPEND CMAKE_REQUIRED_INCLUDES "${PCRE_INCLUDE}")
        CHECK_SYMBOL_EXISTS(PCRE2_CONFIG_JIT "pcre2.h" HAVE_PCRE_JIT)
index a48f9d17b06305230bc79b17cc41efbea7ff3a63..ce90ebb02bfc0c06d27fbf88e5e51ebdd18ab6a8 100644 (file)
@@ -1,6 +1,7 @@
 # Platform specific configuration
 IF(CMAKE_SYSTEM_NAME MATCHES "^.*BSD$|DragonFly")
     ADD_COMPILE_OPTIONS(-DFREEBSD -D_BSD_SOURCE)
+    SET(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_BSD_SOURCE")
     CONFIGURE_FILE(freebsd/rspamd.sh.in freebsd/rspamd @ONLY)
     MESSAGE(STATUS "Configuring for BSD system")
     # Find util library
@@ -32,6 +33,7 @@ ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
 
 IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
     ADD_COMPILE_OPTIONS(-D_GNU_SOURCE -DLINUX)
+    SET(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_GNU_SOURCE")
     # Workaround with architecture specific includes
     #IF(IS_DIRECTORY "/usr/include/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/")
     #  INCLUDE_DIRECTORIES("/usr/include/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu/")
index b4e16ead99df604a74981d2da5481a716c0c40b4..85a1fe829eb8a760144b1d39eda6e9a41e7ce358 100644 (file)
@@ -52,6 +52,7 @@
 #cmakedefine HAVE_MACHINE_ENDIAN_H  1
 #cmakedefine HAVE_MAXPATHLEN     1
 #cmakedefine HAVE_FMEMOPEN       1
+#cmakedefine HAVE_MEMRCHR        1
 #cmakedefine HAVE_MEMSET_S       1
 #cmakedefine HAVE_MKSTEMP        1
 #cmakedefine HAVE_MMAP_ANON      1
index c503396a2c89dc847afe0612ad2b3bbe946e7ca7..88f7576592ba0c34f6d22d6dd65de7dc4da0c831 100644 (file)
@@ -2898,20 +2898,21 @@ rspamd_ucl_emit_fstring_comments (const ucl_object_t *obj,
        ucl_object_emit_full (obj, emit_type, &func, comments);
 }
 
-const void *
+#ifndef HAVE_MEMRCHR
+void *
 rspamd_memrchr (const void *m, gint c, gsize len)
 {
        const guint8 *p = m;
-       gsize i;
 
-       for (i = len; i > 0; i --) {
+       for (gsize i = len; i > 0; i --) {
                if (p[i - 1] == c) {
-                       return p + i - 1;
+                       return (void *)(p + i - 1);
                }
        }
 
        return NULL;
 }
+#endif
 
 struct UConverter *
 rspamd_get_utf8_converter (void)
index f6c2a13893a9e888a563d560e22cdb18c307a74d..bc7b4f4b5b47ee75044b1de78b77e9ea0c5a6418 100644 (file)
@@ -429,7 +429,11 @@ extern const guchar lc_map[256];
  * @param len
  * @return pointer to the last occurrence or NULL
  */
-const void *rspamd_memrchr (const void *m, gint c, gsize len);
+#ifdef HAVE_MEMRCHR
+#define rspamd_memrchr memrchr
+#else
+void *rspamd_memrchr (const void *m, gint c, gsize len);
+#endif
 
 /**
  * Return length of memory segment starting in `s` that contains no chars from `e`