# libuv
AC_MSG_CHECKING([for libuv])
-PKG_CHECK_MODULES([LIBUV], [libuv >= 1.0.0], [],
- [AC_MSG_ERROR([libuv not found])])
+PKG_CHECK_MODULES([LIBUV], [libuv >= 1.34.0], [],
+ [AC_MSG_ERROR([libuv >= 1.34.0 not found])])
AX_SAVE_FLAGS([libuv])
CFLAGS="$CFLAGS $LIBUV_CFLAGS"
- ``perl``
- ``pkg-config`` / ``pkgconfig`` / ``pkgconf``
-BIND 9.19 requires ``libuv`` 1.x or higher. On older systems, an updated
+BIND 9.19 requires ``libuv`` 1.34.0 or higher. On older systems, an updated
``libuv`` package needs to be installed from sources such as EPEL, PPA,
or other native sources. The other option is to build and install
``libuv`` from source.
- Platforms that do not support atomic operations (via compiler or
library)
- Linux without NPTL (Native POSIX Thread Library)
-- Platforms on which **libuv** cannot be compiled
+- Platforms on which **libuv >= 1.34** cannot be compiled or is not available
Installing BIND 9
-----------------
#include <isc/result.h>
#include <isc/tid.h>
-/*
- * These functions were introduced in newer libuv, but we still
- * want BIND9 compile on older ones so we emulate them.
- */
-
#define UV_VERSION(major, minor, patch) ((major << 16) | (minor << 8) | (patch))
/*
#define UV__ERR(x) (-(x))
#endif
-#if UV_VERSION_HEX < UV_VERSION(1, 12, 0)
-int
-uv_os_getenv(const char *name, char *buffer, size_t *size);
-
-#define uv_os_setenv(name, value) setenv(name, value, 0)
-#endif /* UV_VERSION_HEX < UV_VERSION(1, 12, 0) */
-
-#if UV_VERSION_HEX < UV_VERSION(1, 19, 0)
-static inline void *
-uv_handle_get_data(const uv_handle_t *handle) {
- return (handle->data);
-}
-
-static inline void
-uv_handle_set_data(uv_handle_t *handle, void *data) {
- handle->data = data;
-}
-
-static inline void *
-uv_req_get_data(const uv_req_t *req) {
- return (req->data);
-}
-
-static inline void
-uv_req_set_data(uv_req_t *req, void *data) {
- req->data = data;
-}
-#endif /* UV_VERSION_HEX < UV_VERSION(1, 19, 0) */
-
-#if UV_VERSION_HEX < UV_VERSION(1, 32, 0)
-int
-uv_tcp_close_reset(uv_tcp_t *handle, uv_close_cb close_cb);
-#endif
-
-#if UV_VERSION_HEX < UV_VERSION(1, 34, 0)
-#define uv_sleep(msec) usleep(msec * 1000)
-#endif /* UV_VERSION_HEX < UV_VERSION(1, 34, 0) */
-
-#if UV_VERSION_HEX < UV_VERSION(1, 27, 0)
-int
-isc_uv_udp_connect(uv_udp_t *handle, const struct sockaddr *addr);
-/*%<
- * Associate the UDP handle to a remote address and port, so every message sent
- * by this handle is automatically sent to that destination.
- *
- * NOTE: This is just a limited shim for uv_udp_connect() as it requires the
- * handle to be bound.
- */
-#else /* UV_VERSION_HEX < UV_VERSION(1, 27, 0) */
-#define isc_uv_udp_connect uv_udp_connect
-#endif /* UV_VERSION_HEX < UV_VERSION(1, 27, 0) */
-
/*
* These are used with all versions of libuv:
*/
uvreq->cb.send = cb;
uvreq->cbarg = cbarg;
-#if UV_VERSION_HEX >= UV_VERSION(1, 27, 0)
/*
- * If we used uv_udp_connect() (and not the shim version for
- * older versions of libuv), then the peer address has to be
+ * We used uv_udp_connect(), so the peer address has to be
* set to NULL or else uv_udp_send() could fail or assert,
* depending on the libuv version.
*/
if (atomic_load(&sock->connected)) {
sa = NULL;
}
-#endif
r = uv_udp_send(&uvreq->uv_req.udp_send, &sock->uv_handle.udp,
&uvreq->uvbuf, 1, sa, udp_send_cb);
* giving up.
*/
do {
- r = isc_uv_udp_connect(&sock->uv_handle.udp,
- &req->peer.type.sa);
+ r = uv_udp_connect(&sock->uv_handle.udp, &req->peer.type.sa);
} while (r == UV_EADDRINUSE && --req->connect_tries > 0);
if (r != 0) {
isc__nm_incstats(sock, STATID_CONNECTFAIL);
#include <isc/util.h>
#include <isc/uv.h>
-#if UV_VERSION_HEX < UV_VERSION(1, 12, 0)
-#include <stdlib.h>
-#include <string.h>
-
-int
-uv_os_getenv(const char *name, char *buffer, size_t *size) {
- size_t len;
- char *buf = getenv(name);
- if (buf == NULL) {
- return (UV_ENOENT);
- }
- len = strlen(buf) + 1;
- if (len > *size) {
- *size = len;
- return (UV_ENOBUFS);
- }
- *size = len;
- memmove(buffer, buf, len);
- return (0);
-}
-
-#endif
-
-#if UV_VERSION_HEX < UV_VERSION(1, 27, 0)
-int
-isc_uv_udp_connect(uv_udp_t *handle, const struct sockaddr *addr) {
- int err = 0;
-
- do {
- int addrlen = (addr->sa_family == AF_INET)
- ? sizeof(struct sockaddr_in)
- : sizeof(struct sockaddr_in6);
- err = connect(handle->io_watcher.fd, addr, addrlen);
- } while (err == -1 && errno == EINTR);
-
- if (err) {
-#if UV_VERSION_HEX >= UV_VERSION(1, 10, 0)
- return (uv_translate_sys_error(errno));
-#else
- return (-errno);
-#endif /* UV_VERSION_HEX >= UV_VERSION(1, 10, 0) */
- }
-
- return (0);
-}
-#endif /* UV_VERSION_HEX < UV_VERSION(1, 27, 0) */
-
-#if UV_VERSION_HEX < UV_VERSION(1, 32, 0)
-int
-uv_tcp_close_reset(uv_tcp_t *handle, uv_close_cb close_cb) {
- if (setsockopt(handle->io_watcher.fd, SOL_SOCKET, SO_LINGER,
- &(struct linger){ 1, 0 }, sizeof(struct linger)) == -1)
- {
-#if UV_VERSION_HEX >= UV_VERSION(1, 10, 0)
- return (uv_translate_sys_error(errno));
-#else
- return (-errno);
-#endif /* UV_VERSION_HEX >= UV_VERSION(1, 10, 0) */
- }
-
- INSIST(!uv_is_closing((uv_handle_t *)handle));
- uv_close((uv_handle_t *)handle, close_cb);
- return (0);
-}
-#endif /* UV_VERSION_HEX < UV_VERSION(1, 32, 0) */
-
-#define setsockopt_on(socket, level, name) \
- setsockopt(socket, level, name, &(int){ 1 }, sizeof(int))
-
/*%
* Convert a libuv error value into an isc_result_t. The
* list of supported error values is not complete; new users
RESET_RETURN;
}
-#if UV_VERSION_HEX >= UV_VERSION(1, 27, 0)
ISC_LOOP_TEST_IMPL(mock_udpconnect_uv_udp_connect) {
WILL_RETURN(uv_udp_connect, UV_ENOMEM);
RESET_RETURN;
}
-#endif
-
ISC_LOOP_TEST_IMPL(mock_udpconnect_uv_recv_buffer_size) {
WILL_RETURN(uv_recv_buffer_size, UV_ENOMEM);
teardown_test)
ISC_TEST_ENTRY_CUSTOM(mock_udpconnect_uv_udp_open, setup_test, teardown_test)
ISC_TEST_ENTRY_CUSTOM(mock_udpconnect_uv_udp_bind, setup_test, teardown_test)
-#if UV_VERSION_HEX >= UV_VERSION(1, 27, 0)
ISC_TEST_ENTRY_CUSTOM(mock_udpconnect_uv_udp_connect, setup_test, teardown_test)
-#endif
ISC_TEST_ENTRY_CUSTOM(mock_udpconnect_uv_recv_buffer_size, setup_test,
teardown_test)
ISC_TEST_ENTRY_CUSTOM(mock_udpconnect_uv_send_buffer_size, setup_test,
int
__wrap_uv_udp_bind(uv_udp_t *handle, const struct sockaddr *addr,
unsigned int flags);
-#if UV_VERSION_HEX >= UV_VERSION(1, 27, 0)
int
__wrap_uv_udp_connect(uv_udp_t *handle, const struct sockaddr *addr);
int
__wrap_uv_udp_getpeername(const uv_udp_t *handle, struct sockaddr *name,
int *namelen);
-#endif /* UV_VERSION_HEX >= UV_VERSION(1, 27, 0) */
int
__wrap_uv_udp_getsockname(const uv_udp_t *handle, struct sockaddr *name,
int *namelen);
static atomic_int __state_uv_udp_connect __attribute__((unused)) = 0;
-#if UV_VERSION_HEX >= UV_VERSION(1, 27, 0)
int
__wrap_uv_udp_connect(uv_udp_t *handle, const struct sockaddr *addr) {
if (atomic_load(&__state_uv_udp_connect) == 0) {
}
return (atomic_load(&__state_uv_udp_connect));
}
-#endif /* UV_VERSION_HEX >= UV_VERSION(1, 27, 0) */
static atomic_int __state_uv_udp_getpeername __attribute__((unused)) = 0;
-#if UV_VERSION_HEX >= UV_VERSION(1, 27, 0)
int
__wrap_uv_udp_getpeername(const uv_udp_t *handle, struct sockaddr *name,
int *namelen) {
}
return (atomic_load(&__state_uv_udp_getpeername));
}
-#endif /* UV_VERSION_HEX >= UV_VERSION(1, 27, 0) */
static atomic_int __state_uv_udp_getsockname = 0;
int
return (atomic_load(&__state_uv_fileno));
}
-#define uv_udp_open(...) __wrap_uv_udp_open(__VA_ARGS__)
-#define uv_udp_bind(...) __wrap_uv_udp_bind(__VA_ARGS__)
-#if UV_VERSION_HEX >= UV_VERSION(1, 27, 0)
+#define uv_udp_open(...) __wrap_uv_udp_open(__VA_ARGS__)
+#define uv_udp_bind(...) __wrap_uv_udp_bind(__VA_ARGS__)
#define uv_udp_connect(...) __wrap_uv_udp_connect(__VA_ARGS__)
#define uv_udp_getpeername(...) __wrap_uv_udp_getpeername(__VA_ARGS__)
-#endif /* UV_VERSION_HEX >= UV_VERSION(1, 27, 0) */
#define uv_udp_getsockname(...) __wrap_uv_udp_getsockname(__VA_ARGS__)
#define uv_udp_send(...) __wrap_uv_udp_send(__VA_ARGS__)
#define uv_udp_recv_start(...) __wrap_uv_udp_recv_start(__VA_ARGS__)