/* $NetBSD: uv.c,v 1.2 2025/01/26 16:25:39 christos Exp $ */ /* * Copyright (C) Internet Systems Consortium, Inc. ("ISC") * * SPDX-License-Identifier: MPL-2.0 * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, you can obtain one at https://mozilla.org/MPL/2.0/. * * See the COPYRIGHT file distributed with this work for additional * information regarding copyright ownership. */ #include #include #include #include /*% * Convert a libuv error value into an isc_result_t. The * list of supported error values is not complete; new users * of this function should add any expected errors that are * not already there. */ isc_result_t isc__uverr2result(int uverr, bool dolog, const char *file, unsigned int line, const char *func) { switch (uverr) { case 0: return ISC_R_SUCCESS; case UV_ENOTDIR: case UV_ELOOP: case UV_EINVAL: /* XXX sometimes this is not for files */ case UV_ENAMETOOLONG: case UV_EBADF: return ISC_R_INVALIDFILE; case UV_ENOENT: return ISC_R_FILENOTFOUND; case UV_EAGAIN: return ISC_R_NOCONN; case UV_EACCES: case UV_EPERM: return ISC_R_NOPERM; case UV_EEXIST: return ISC_R_FILEEXISTS; case UV_EIO: return ISC_R_IOERROR; case UV_ENOMEM: return ISC_R_NOMEMORY; case UV_ENFILE: case UV_EMFILE: return ISC_R_TOOMANYOPENFILES; case UV_ENOSPC: return ISC_R_DISCFULL; case UV_EPIPE: case UV_ECONNRESET: case UV_ECONNABORTED: return ISC_R_CONNECTIONRESET; case UV_ENOTCONN: return ISC_R_NOTCONNECTED; case UV_ETIMEDOUT: return ISC_R_TIMEDOUT; case UV_ENOBUFS: return ISC_R_NORESOURCES; case UV_EAFNOSUPPORT: return ISC_R_FAMILYNOSUPPORT; case UV_ENETDOWN: return ISC_R_NETDOWN; case UV_EHOSTDOWN: return ISC_R_HOSTDOWN; case UV_ENETUNREACH: return ISC_R_NETUNREACH; case UV_EHOSTUNREACH: return ISC_R_HOSTUNREACH; case UV_EADDRINUSE: return ISC_R_ADDRINUSE; case UV_EADDRNOTAVAIL: return ISC_R_ADDRNOTAVAIL; case UV_ECONNREFUSED: return ISC_R_CONNREFUSED; case UV_ECANCELED: return ISC_R_CANCELED; case UV_EOF: return ISC_R_EOF; case UV_EMSGSIZE: return ISC_R_MAXSIZE; case UV_ENOTSUP: return ISC_R_FAMILYNOSUPPORT; case UV_ENOPROTOOPT: case UV_EPROTONOSUPPORT: return ISC_R_INVALIDPROTO; default: if (dolog) { UNEXPECTED_ERROR("unable to convert libuv error code " "in %s (%s:%d) to isc_result: %d: %s", func, file, line, uverr, uv_strerror(uverr)); } return ISC_R_UNEXPECTED; } } #if UV_VERSION_HEX >= UV_VERSION(1, 38, 0) static isc_mem_t *isc__uv_mctx = NULL; static void * isc__uv_malloc(size_t size) { return isc_mem_allocate(isc__uv_mctx, size); } static void * isc__uv_realloc(void *ptr, size_t size) { return isc_mem_reallocate(isc__uv_mctx, ptr, size); } static void * isc__uv_calloc(size_t count, size_t size) { return isc_mem_callocate(isc__uv_mctx, count, size); } static void isc__uv_free(void *ptr) { if (ptr == NULL) { return; } isc_mem_free(isc__uv_mctx, ptr); } #endif /* UV_VERSION_HEX >= UV_VERSION(1, 38, 0) */ void isc__uv_initialize(void) { #if UV_VERSION_HEX >= UV_VERSION(1, 38, 0) int r; isc_mem_create(&isc__uv_mctx); isc_mem_setname(isc__uv_mctx, "uv"); isc_mem_setdestroycheck(isc__uv_mctx, false); r = uv_replace_allocator(isc__uv_malloc, isc__uv_realloc, isc__uv_calloc, isc__uv_free); UV_RUNTIME_CHECK(uv_replace_allocator, r); #endif /* UV_VERSION_HEX >= UV_VERSION(1, 38, 0) */ } void isc__uv_shutdown(void) { #if UV_VERSION_HEX >= UV_VERSION(1, 38, 0) uv_library_shutdown(); isc_mem_destroy(&isc__uv_mctx); #endif /* UV_VERSION_HEX < UV_VERSION(1, 38, 0) */ } void isc__uv_setdestroycheck(bool check) { #if UV_VERSION_HEX >= UV_VERSION(1, 38, 0) isc_mem_setdestroycheck(isc__uv_mctx, check); #else UNUSED(check); #endif /* UV_VERSION_HEX >= UV_VERSION(1, 6, 0) */ }