diff --git a/CMakeLists.txt b/CMakeLists.txt
index b41fb439..e92141d0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1001,6 +1001,7 @@ set(cxx-sources
client.hpp
clock.hpp
command.hpp
+ compat.hpp
condition_variable.hpp
config.hpp
ctx.hpp
diff --git a/Makefile.am b/Makefile.am
index 528df3f6..79255a85 100755
--- a/Makefile.am
+++ b/Makefile.am
@@ -33,6 +33,7 @@ src_libzmq_la_SOURCES = \
src/clock.cpp \
src/clock.hpp \
src/command.hpp \
+ src/compat.hpp \
src/condition_variable.hpp \
src/config.hpp \
src/ctx.cpp \
diff --git a/builds/gyp/project.gyp b/builds/gyp/project.gyp
index a89366c0..f06100e9 100644
--- a/builds/gyp/project.gyp
+++ b/builds/gyp/project.gyp
@@ -74,6 +74,7 @@
'../../src/clock.cpp',
'../../src/clock.hpp',
'../../src/command.hpp',
+ '../../src/compat.hpp',
'../../src/condition_variable.hpp',
'../../src/config.hpp',
'../../src/ctx.cpp',
diff --git a/src/compat.hpp b/src/compat.hpp
new file mode 100644
index 00000000..7c7a8927
--- /dev/null
+++ b/src/compat.hpp
@@ -0,0 +1,73 @@
+/*
+ Copyright (c) 2020 Contributors as noted in the AUTHORS file
+
+ This file is part of libzmq, the ZeroMQ core engine in C++.
+
+ libzmq is free software; you can redistribute it and/or modify it under
+ the terms of the GNU Lesser General Public License (LGPL) as published
+ by the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ As a special exception, the Contributors give you permission to link
+ this library with independent modules to produce an executable,
+ regardless of the license terms of these independent modules, and to
+ copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the
+ terms and conditions of the license of that module. An independent
+ module is a module which is not derived from or based on this library.
+ If you modify this library, you must extend this exception to your
+ version of the library.
+
+ libzmq is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see .
+*/
+
+#ifndef __ZMQ_COMPAT_HPP_INCLUDED__
+#define __ZMQ_COMPAT_HPP_INCLUDED__
+
+#include "precompiled.hpp"
+#include
+
+#ifdef ZMQ_HAVE_WINDOWS
+#define strcasecmp _stricmp
+#define strtok_r strtok_s
+#else
+#ifdef ZMQ_HAVE_LIBBSD
+#include
+#elif !defined(ZMQ_HAVE_STRLCPY)
+static inline size_t
+strlcpy (char *dest_, const char *src_, const size_t dest_size_)
+{
+ size_t remain = dest_size_;
+ for (; remain && *src_; --remain, ++src_, ++dest_) {
+ *dest_ = *src_;
+ }
+ return dest_size_ - remain;
+}
+#endif
+template
+static inline int strcpy_s (char (&dest_)[size], const char *const src_)
+{
+ const size_t res = strlcpy (dest_, src_, size);
+ return res >= size ? ERANGE : 0;
+}
+#endif
+
+#ifndef HAVE_STRNLEN
+static inline size_t strnlen (const char *s, size_t len)
+{
+ for (size_t i = 0; i < len; i++) {
+ if (s[i] == '\0')
+ return i + 1;
+ }
+
+ return len;
+}
+#endif
+
+#endif
diff --git a/src/ipc_address.cpp b/src/ipc_address.cpp
index 4325b439..f1f56516 100644
--- a/src/ipc_address.cpp
+++ b/src/ipc_address.cpp
@@ -28,6 +28,7 @@
*/
#include "precompiled.hpp"
+#include "compat.hpp"
#include "ipc_address.hpp"
#if defined ZMQ_HAVE_IPC
@@ -36,18 +37,6 @@
#include
-#ifndef HAVE_STRNLEN
-static size_t strnlen (const char *s, size_t len)
-{
- for (size_t i = 0; i < len; i++) {
- if (s[i] == '\0')
- return i + 1;
- }
-
- return len;
-}
-#endif
-
zmq::ipc_address_t::ipc_address_t ()
{
memset (&_address, 0, sizeof _address);
diff --git a/src/msg.cpp b/src/msg.cpp
index 23148523..2116d1e4 100644
--- a/src/msg.cpp
+++ b/src/msg.cpp
@@ -28,6 +28,7 @@
*/
#include "precompiled.hpp"
+#include "compat.hpp"
#include "macros.hpp"
#include "msg.hpp"
diff --git a/src/ws_engine.cpp b/src/ws_engine.cpp
index 07e4d1d7..b67dc35e 100644
--- a/src/ws_engine.cpp
+++ b/src/ws_engine.cpp
@@ -54,6 +54,7 @@ along with this program. If not, see .
#include
+#include "compat.hpp"
#include "tcp.hpp"
#include "ws_engine.hpp"
#include "session_base.hpp"
@@ -71,30 +72,6 @@ along with this program. If not, see .
#include "curve_server.hpp"
#endif
-#ifdef ZMQ_HAVE_WINDOWS
-#define strcasecmp _stricmp
-#define strtok_r strtok_s
-#else
-#ifdef ZMQ_HAVE_LIBBSD
-#include
-#elif !defined(ZMQ_HAVE_STRLCPY)
-static size_t strlcpy (char *dest_, const char *src_, const size_t dest_size_)
-{
- size_t remain = dest_size_;
- for (; remain && *src_; --remain, ++src_, ++dest_) {
- *dest_ = *src_;
- }
- return dest_size_ - remain;
-}
-#endif
-template
-static int strcpy_s (char (&dest_)[size], const char *const src_)
-{
- const size_t res = strlcpy (dest_, src_, size);
- return res >= size ? ERANGE : 0;
-}
-#endif
-
// OSX uses a different name for this socket option
#ifndef IPV6_ADD_MEMBERSHIP
#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP