From 2a79a943de417679c562cd4a917e1d1bc19b0d25 Mon Sep 17 00:00:00 2001
From: Martin Lucina <mato@kotelna.sk>
Date: Thu, 18 Feb 2010 19:38:15 +0100
Subject: Add NetBSD support

---
 configure.in           | 13 +++++++++++++
 src/atomic_bitmap.hpp  | 16 ++++++++--------
 src/atomic_counter.hpp | 14 +++++++-------
 src/atomic_ptr.hpp     | 14 +++++++-------
 src/ip.cpp             | 11 ++---------
 src/ip.hpp             | 10 ++++++++++
 src/kqueue.cpp         | 17 ++++++++++++++---
 src/kqueue.hpp         |  3 ++-
 src/poll.cpp           |  3 ++-
 src/poll.hpp           |  3 ++-
 src/poller.hpp         |  2 ++
 src/tcp_listener.cpp   |  2 +-
 src/uuid.cpp           |  2 +-
 src/uuid.hpp           |  4 ++--
 src/zmq.cpp            |  6 ++++--
 15 files changed, 77 insertions(+), 43 deletions(-)

diff --git a/configure.in b/configure.in
index 314372a..20cd8c5 100644
--- a/configure.in
+++ b/configure.in
@@ -154,6 +154,19 @@ case "${host_os}" in
         AC_DEFINE(ZMQ_HAVE_OSX, 1, [Have DarwinOSX OS])
         LIBZMQ_EXTRA_CXXFLAGS+="-Wno-uninitialized"
         ;;
+    *netbsd*)
+        # Define on NetBSD to enable all library features
+        CPPFLAGS="-D_NETBSD_SOURCE $CPPFLAGS"
+        AC_DEFINE(ZMQ_HAVE_NETBSD, 1, [Have NetBSD OS])
+        # NetBSD 5.0 and newer provides atomic operations
+        netbsd_has_atomic=no
+        # XXX As of 5.0.1 the functions declared in atomic.h are
+        # missing "extern C", disable this until upstream fixes it.
+        # AC_CHECK_HEADERS(atomic.h, [netbsd_has_atomic=yes])
+        if test "x$netbsd_has_atomic" = "xno"; then
+            AC_DEFINE(ZMQ_FORCE_MUTEXES, 1, [Force to use mutexes])
+        fi
+        ;;
     *openbsd*)
         # Define on OpenBSD to enable all library features
         CPPFLAGS="-D_BSD_SOURCE $CPPFLAGS"
diff --git a/src/atomic_bitmap.hpp b/src/atomic_bitmap.hpp
index 6620f06..1aefd27 100644
--- a/src/atomic_bitmap.hpp
+++ b/src/atomic_bitmap.hpp
@@ -34,8 +34,8 @@
 #define ZMQ_ATOMIC_BITMAP_SPARC
 #elif defined ZMQ_HAVE_WINDOWS
 #define ZMQ_ATOMIC_BITMAP_WINDOWS
-#elif defined ZMQ_HAVE_SOLARIS
-#define ZMQ_ATOMIC_BITMAP_SOLARIS
+#elif (defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_NETBSD)
+#define ZMQ_ATOMIC_BITMAP_SYSTEM
 #else
 #define ZMQ_ATOMIC_BITMAP_MUTEX
 #endif
@@ -44,7 +44,7 @@
 #include "mutex.hpp"
 #elif defined ZMQ_ATOMIC_BITMAP_WINDOWS
 #include "windows.hpp"
-#elif defined ZMQ_ATOMIC_BITMAP_SOLARIS
+#elif defined ZMQ_ATOMIC_BITMAP_SYSTEM
 #include <atomic.h>
 #endif
 
@@ -89,7 +89,7 @@ namespace zmq
                     return (oldval & (bitmap_t (1) << reset_index_)) ?
                         true : false;
             }
-#elif defined ZMQ_ATOMIC_BITMAP_SOLARIS
+#elif defined ZMQ_ATOMIC_BITMAP_SYSTEM
             while (true) {
                 bitmap_t oldval = value;
                 bitmap_t newval = (oldval | (bitmap_t (1) << set_index_)) &
@@ -150,7 +150,7 @@ namespace zmq
             bitmap_t oldval;
 #if defined ZMQ_ATOMIC_BITMAP_WINDOWS
             oldval = InterlockedExchange ((volatile LONG*) &value, newval_);
-#elif defined ZMQ_ATOMIC_BITMAP_SOLARIS
+#elif defined ZMQ_ATOMIC_BITMAP_SYSTEM
             oldval = atomic_swap_32 (&value, newval_);
 #elif defined ZMQ_ATOMIC_BITMAP_X86
             oldval = newval_;
@@ -201,7 +201,7 @@ namespace zmq
                       newval, oldval) == (LONG) oldval)
                     return oldval;
             }
-#elif defined ZMQ_ATOMIC_BITMAP_SOLARIS
+#elif defined ZMQ_ATOMIC_BITMAP_SYSTEM
             while (true) {
                 bitmap_t oldval = value;
                 bitmap_t newval = oldval == 0 ? thenval_ : elseval_;
@@ -270,8 +270,8 @@ namespace zmq
 #if defined ZMQ_ATOMIC_BITMAP_WINDOWS
 #undef ZMQ_ATOMIC_BITMAP_WINDOWS
 #endif
-#if defined ZMQ_ATOMIC_BITMAP_SOLARIS
-#undef ZMQ_ATOMIC_BITMAP_SOLARIS
+#if defined ZMQ_ATOMIC_BITMAP_SYSTEM
+#undef ZMQ_ATOMIC_BITMAP_SYSTEM
 #endif
 #if defined ZMQ_ATOMIC_BITMAP_X86
 #undef ZMQ_ATOMIC_BITMAP_X86
diff --git a/src/atomic_counter.hpp b/src/atomic_counter.hpp
index 649fdbf..4a77928 100644
--- a/src/atomic_counter.hpp
+++ b/src/atomic_counter.hpp
@@ -31,8 +31,8 @@
 #define ZMQ_ATOMIC_COUNTER_SPARC
 #elif defined ZMQ_HAVE_WINDOWS
 #define ZMQ_ATOMIC_COUNTER_WINDOWS
-#elif defined ZMQ_HAVE_SOLARIS
-#define ZMQ_ATOMIC_COUNTER_SOLARIS
+#elif (defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_NETBSD)
+#define ZMQ_ATOMIC_COUNTER_SYSTEM
 #else
 #define ZMQ_ATOMIC_COUNTER_MUTEX
 #endif
@@ -41,7 +41,7 @@
 #include "mutex.hpp"
 #elif defined ZMQ_ATOMIC_COUNTER_WINDOWS
 #include "windows.hpp"
-#elif defined ZMQ_ATOMIC_COUNTER_SOLARIS
+#elif defined ZMQ_ATOMIC_COUNTER_SYSTEM
 #include <atomic.h>
 #endif
 
@@ -79,7 +79,7 @@ namespace zmq
 
 #if defined ZMQ_ATOMIC_COUNTER_WINDOWS
             old_value = InterlockedExchangeAdd ((LONG*) &value, increment_);
-#elif defined ZMQ_ATOMIC_COUNTER_SOLARIS
+#elif defined ZMQ_ATOMIC_COUNTER_SYSTEM
             integer_t new_value = atomic_add_32_nv (&value, increment_);
             old_value = new_value - increment_;
 #elif defined ZMQ_ATOMIC_COUNTER_X86
@@ -119,7 +119,7 @@ namespace zmq
             LONG delta = - ((LONG) decrement);
             integer_t old = InterlockedExchangeAdd ((LONG*) &value, delta);
             return old - decrement != 0;
-#elif defined ZMQ_ATOMIC_COUNTER_SOLARIS
+#elif defined ZMQ_ATOMIC_COUNTER_SYSTEM
             int32_t delta = - ((int32_t) decrement);
             integer_t nv = atomic_add_32_nv (&value, delta);
             return nv != 0;
@@ -180,8 +180,8 @@ namespace zmq
 #if defined ZMQ_ATOMIC_COUNTER_WINDOWS
 #undef ZMQ_ATOMIC_COUNTER_WINDOWS
 #endif
-#if defined ZMQ_ATOMIC_COUNTER_SOLARIS
-#undef ZMQ_ATOMIC_COUNTER_SOLARIS
+#if defined ZMQ_ATOMIC_COUNTER_SYSTEM
+#undef ZMQ_ATOMIC_COUNTER_SYSTEM
 #endif
 #if defined ZMQ_ATOMIC_COUNTER_X86
 #undef ZMQ_ATOMIC_COUNTER_X86
diff --git a/src/atomic_ptr.hpp b/src/atomic_ptr.hpp
index 3735e99..e4a7491 100644
--- a/src/atomic_ptr.hpp
+++ b/src/atomic_ptr.hpp
@@ -31,8 +31,8 @@
 #define ZMQ_ATOMIC_PTR_SPARC
 #elif defined ZMQ_HAVE_WINDOWS
 #define ZMQ_ATOMIC_PTR_WINDOWS
-#elif defined ZMQ_HAVE_SOLARIS
-#define ZMQ_ATOMIC_PTR_SOLARIS
+#elif (defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_NETBSD)
+#define ZMQ_ATOMIC_PTR_SYSTEM
 #else
 #define ZMQ_ATOMIC_PTR_MUTEX
 #endif
@@ -41,7 +41,7 @@
 #include "mutex.hpp"
 #elif defined ZMQ_ATOMIC_PTR_WINDOWS
 #include "windows.hpp"
-#elif defined ZMQ_ATOMIC_PTR_SOLARIS
+#elif defined ZMQ_ATOMIC_PTR_SYSTEM
 #include <atomic.h>
 #endif
 
@@ -79,7 +79,7 @@ namespace zmq
         {
 #if defined ZMQ_ATOMIC_PTR_WINDOWS
             return (T*) InterlockedExchangePointer (&ptr, val_);
-#elif defined ZMQ_ATOMIC_PTR_SOLARIS
+#elif defined ZMQ_ATOMIC_PTR_SYSTEM
             return (T*) atomic_swap_ptr (&ptr, val_);
 #elif defined ZMQ_ATOMIC_PTR_X86
             T *old;
@@ -125,7 +125,7 @@ namespace zmq
 #if defined ZMQ_ATOMIC_PTR_WINDOWS
             return (T*) InterlockedCompareExchangePointer (
                 (volatile PVOID*) &ptr, val_, cmp_);
-#elif defined ZMQ_ATOMIC_PTR_SOLARIS
+#elif defined ZMQ_ATOMIC_PTR_SYSTEM
             return (T*) atomic_cas_ptr (&ptr, cmp_, val_);
 #elif defined ZMQ_ATOMIC_PTR_X86
             T *old;
@@ -173,8 +173,8 @@ namespace zmq
 #if defined ZMQ_ATOMIC_PTR_WINDOWS
 #undef ZMQ_ATOMIC_PTR_WINDOWS
 #endif
-#if defined ZMQ_ATOMIC_PTR_SOLARIS
-#undef ZMQ_ATOMIC_PTR_SOLARIS
+#if defined ZMQ_ATOMIC_PTR_SYSTEM
+#undef ZMQ_ATOMIC_PTR_SYSTEM
 #endif
 #if defined ZMQ_ATOMIC_PTR_X86
 #undef ZMQ_ATOMIC_PTR_X86
diff --git a/src/ip.cpp b/src/ip.cpp
index 822e359..b3ad610 100644
--- a/src/ip.cpp
+++ b/src/ip.cpp
@@ -125,7 +125,8 @@ static int resolve_nic_name (in_addr* addr_, char const *interface_)
 
 #elif ((defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_FREEBSD ||\
     defined ZMQ_HAVE_OSX || defined ZMQ_HAVE_OPENBSD ||\
-    defined ZMQ_HAVE_QNXNTO) && defined ZMQ_HAVE_IFADDRS)
+    defined ZMQ_HAVE_QNXNTO || defined ZMQ_HAVE_NETBSD)\
+    && defined ZMQ_HAVE_IFADDRS)
 
 #include <ifaddrs.h>
 
@@ -239,11 +240,7 @@ int zmq::resolve_ip_interface (sockaddr_storage* addr_, socklen_t *addr_len_,
 
     //  Restrict hostname/service to literals to avoid any DNS lookups or
     //  service-name irregularity due to indeterminate socktype.
-#if defined ZMQ_HAVE_OSX
-   req.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
-#else
    req.ai_flags = AI_PASSIVE | AI_NUMERICHOST | AI_NUMERICSERV;
-#endif 
 
     //  Resolve the literal address. Some of the error info is lost in case
     //  of error, however, there's no way to report EAI errors via errno.
@@ -292,11 +289,7 @@ int zmq::resolve_ip_hostname (sockaddr_storage *addr_, socklen_t *addr_len_,
     
     //  Avoid named services due to unclear socktype, and don't pick IPv6
     //  addresses if we don't have a local IPv6 address configured.
-#if defined ZMQ_HAVE_OSX
-   req.ai_flags = AI_ADDRCONFIG;
-#else
    req.ai_flags = AI_NUMERICSERV | AI_ADDRCONFIG;
-#endif 
 
     //  Resolve host name. Some of the error info is lost in case of error,
     //  however, there's no way to report EAI errors via errno.
diff --git a/src/ip.hpp b/src/ip.hpp
index 9d9f5c0..ffab2f2 100644
--- a/src/ip.hpp
+++ b/src/ip.hpp
@@ -30,6 +30,16 @@
 #include <arpa/inet.h>
 #include <netinet/in.h>
 #include <netdb.h>
+
+//  Some platforms (notably Darwin/OSX and NetBSD) do not define all AI_
+//  flags for getaddrinfo(). This can be worked around safely by defining
+//  these to 0.
+#ifndef AI_ADDRCONFIG
+#define AI_ADDRCONFIG 0
+#endif
+#ifndef AI_NUMERICSERV
+#define AI_NUMERICSERV 0
+#endif
 #endif
 
 #if !defined ZMQ_HAVE_WINDOWS && !defined ZMQ_HAVE_OPENVMS
diff --git a/src/kqueue.cpp b/src/kqueue.cpp
index bf9c8a2..e1fe2fa 100644
--- a/src/kqueue.cpp
+++ b/src/kqueue.cpp
@@ -19,7 +19,8 @@
 
 #include "platform.hpp"
 
-#if defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_OPENBSD || defined ZMQ_HAVE_OSX
+#if defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_OPENBSD ||\
+    defined ZMQ_HAVE_OSX || defined ZMQ_HAVE_NETBSD
 
 #include <sys/time.h>
 #include <sys/types.h>
@@ -34,6 +35,14 @@
 #include "config.hpp"
 #include "i_poll_events.hpp"
 
+//  NetBSD defines (struct kevent).udata as intptr_t, everyone else
+//  as void *.
+#if defined ZMQ_HAVE_NETBSD
+#define kevent_udata_t intptr_t
+#else
+#define kevent_udata_t void *
+#endif
+
 zmq::kqueue_t::kqueue_t () :
     stopping (false)
 {
@@ -56,7 +65,7 @@ void zmq::kqueue_t::kevent_add (fd_t fd_, short filter_, void *udata_)
 {
     struct kevent ev;
 
-    EV_SET (&ev, fd_, filter_, EV_ADD, 0, 0, udata_);
+    EV_SET (&ev, fd_, filter_, EV_ADD, 0, 0, (kevent_udata_t)udata_);
     int rc = kevent (kqueue_fd, &ev, 1, NULL, 0, NULL);
     errno_assert (rc != -1);
 }
@@ -65,7 +74,7 @@ void zmq::kqueue_t::kevent_delete (fd_t fd_, short filter_)
 {
     struct kevent ev;
 
-    EV_SET (&ev, fd_, filter_, EV_DELETE, 0, 0, NULL);
+    EV_SET (&ev, fd_, filter_, EV_DELETE, 0, 0, (kevent_udata_t)NULL);
     int rc = kevent (kqueue_fd, &ev, 1, NULL, 0, NULL);
     errno_assert (rc != -1);
 }
@@ -212,4 +221,6 @@ void zmq::kqueue_t::worker_routine (void *arg_)
     ((kqueue_t*) arg_)->loop ();
 }
 
+//  Don't pollute namespace with defines local to this file
+#undef kevent_udata_t
 #endif
diff --git a/src/kqueue.hpp b/src/kqueue.hpp
index d2dd09a..ac28a7d 100644
--- a/src/kqueue.hpp
+++ b/src/kqueue.hpp
@@ -22,7 +22,8 @@
 
 #include "platform.hpp"
 
-#if defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_OPENBSD || defined ZMQ_HAVE_OSX
+#if defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_OPENBSD ||\
+    defined ZMQ_HAVE_OSX || defined ZMQ_HAVE_NETBSD
 
 #include <vector>
 
diff --git a/src/poll.cpp b/src/poll.cpp
index 889ea4a..4214195 100644
--- a/src/poll.cpp
+++ b/src/poll.cpp
@@ -22,7 +22,8 @@
 #if defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_FREEBSD ||\
     defined ZMQ_HAVE_OPENBSD || defined ZMQ_HAVE_SOLARIS ||\
     defined ZMQ_HAVE_OSX || defined ZMQ_HAVE_QNXNTO ||\
-    defined ZMQ_HAVE_HPUX || defined ZMQ_HAVE_AIX
+    defined ZMQ_HAVE_HPUX || defined ZMQ_HAVE_AIX ||\
+    defined ZMQ_HAVE_NETBSD
 
 #include <sys/types.h>
 #include <sys/time.h>
diff --git a/src/poll.hpp b/src/poll.hpp
index 5b8e745..f4ae35a 100644
--- a/src/poll.hpp
+++ b/src/poll.hpp
@@ -25,7 +25,8 @@
 #if defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_FREEBSD ||\
     defined ZMQ_HAVE_OPENBSD || defined ZMQ_HAVE_SOLARIS ||\
     defined ZMQ_HAVE_OSX || defined ZMQ_HAVE_QNXNTO ||\
-    defined ZMQ_HAVE_HPUX || defined ZMQ_HAVE_AIX
+    defined ZMQ_HAVE_HPUX || defined ZMQ_HAVE_AIX ||\
+    defined ZMQ_HAVE_NETBSD
 
 #include <poll.h>
 #include <stddef.h>
diff --git a/src/poller.hpp b/src/poller.hpp
index b769283..49d466b 100644
--- a/src/poller.hpp
+++ b/src/poller.hpp
@@ -47,6 +47,8 @@ namespace zmq
     typedef kqueue_t poller_t;
 #elif defined ZMQ_HAVE_OPENBSD
     typedef kqueue_t poller_t;
+#elif defined ZMQ_HAVE_NETBSD
+    typedef kqueue_t poller_t;
 #elif defined ZMQ_HAVE_SOLARIS
     typedef devpoll_t poller_t;
 #elif defined ZMQ_HAVE_OSX
diff --git a/src/tcp_listener.cpp b/src/tcp_listener.cpp
index 3d15abe..cb84715 100644
--- a/src/tcp_listener.cpp
+++ b/src/tcp_listener.cpp
@@ -275,7 +275,7 @@ zmq::fd_t zmq::tcp_listener_t::accept ()
 
 #if (defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_FREEBSD || \
      defined ZMQ_HAVE_OPENBSD || defined ZMQ_HAVE_OSX || \
-     defined ZMQ_HAVE_OPENVMS)
+     defined ZMQ_HAVE_OPENVMS || defined ZMQ_HAVE_NETBSD)
     if (sock == -1 && 
         (errno == EAGAIN || errno == EWOULDBLOCK || 
          errno == EINTR || errno == ECONNABORTED))
diff --git a/src/uuid.cpp b/src/uuid.cpp
index 6fdb060..fa1cff4 100644
--- a/src/uuid.cpp
+++ b/src/uuid.cpp
@@ -47,7 +47,7 @@ const char *zmq::uuid_t::to_string ()
     return (char*) uuid_str;
 }
 
-#elif defined ZMQ_HAVE_FREEBSD
+#elif defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_NETBSD
 
 #include <stdlib.h>
 #include <uuid.h>
diff --git a/src/uuid.hpp b/src/uuid.hpp
index 001ea94..00424ed 100644
--- a/src/uuid.hpp
+++ b/src/uuid.hpp
@@ -23,7 +23,7 @@
 #include "platform.hpp"
 #include "stdint.hpp"
 
-#if defined ZMQ_HAVE_FREEBSD
+#if defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_NETBSD
 #include <uuid.h>
 #elif defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_OSX
 #include <uuid/uuid.h>
@@ -60,7 +60,7 @@ namespace zmq
 #endif
         ::UUID uuid;
         RPC_CSTR uuid_str;
-#elif defined ZMQ_HAVE_FREEBSD
+#elif defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_NETBSD
         ::uuid_t uuid;
         char *uuid_str;
 #elif defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_OSX
diff --git a/src/zmq.cpp b/src/zmq.cpp
index e6f1a61..4170b3f 100644
--- a/src/zmq.cpp
+++ b/src/zmq.cpp
@@ -37,7 +37,8 @@
 #if defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_FREEBSD ||\
     defined ZMQ_HAVE_OPENBSD || defined ZMQ_HAVE_SOLARIS ||\
     defined ZMQ_HAVE_OSX || defined ZMQ_HAVE_QNXNTO ||\
-    defined ZMQ_HAVE_HPUX || defined ZMQ_HAVE_AIX
+    defined ZMQ_HAVE_HPUX || defined ZMQ_HAVE_AIX ||\
+    defined ZMQ_HAVE_NETBSD
 #include <poll.h>
 #endif
 
@@ -325,7 +326,8 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_)
 #if defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_FREEBSD ||\
     defined ZMQ_HAVE_OPENBSD || defined ZMQ_HAVE_SOLARIS ||\
     defined ZMQ_HAVE_OSX || defined ZMQ_HAVE_QNXNTO ||\
-    defined ZMQ_HAVE_HPUX || defined ZMQ_HAVE_AIX
+    defined ZMQ_HAVE_HPUX || defined ZMQ_HAVE_AIX ||\
+    defined ZMQ_HAVE_NETBSD
 
     pollfd *pollfds = (pollfd*) malloc (nitems_ * sizeof (pollfd));
     zmq_assert (pollfds);
-- 
cgit v1.2.3