/* * 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. */ /*! \file */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include unsigned int workers = 0; bool debug = false; static void adjustnofile(void) { struct rlimit rl; if (getrlimit(RLIMIT_NOFILE, &rl) == 0) { if (rl.rlim_cur != rl.rlim_max) { rl.rlim_cur = rl.rlim_max; setrlimit(RLIMIT_NOFILE, &rl); } } } int setup_workers(void **state ISC_ATTR_UNUSED) { char *env_workers = getenv("ISC_TASK_WORKERS"); if (env_workers != NULL) { workers = atoi(env_workers); } else { workers = isc_os_ncpus(); /* We always need at least two loops for some of the tests */ if (workers < 2) { workers = 2; } } INSIST(workers != 0); return 0; } int setup_mctx(void **state ISC_ATTR_UNUSED) { isc_mem_debugon(ISC_MEM_DEBUGRECORD); return 0; } int teardown_mctx(void **state ISC_ATTR_UNUSED) { return 0; } int setup_loopmgr(void **state ISC_ATTR_UNUSED) { REQUIRE(isc_g_mctx != NULL); setup_workers(state); isc_loopmgr_create(isc_g_mctx, workers); return 0; } int teardown_loopmgr(void **state ISC_ATTR_UNUSED) { isc_loopmgr_destroy(); return 0; } int setup_netmgr(void **state ISC_ATTR_UNUSED) { adjustnofile(); isc_netmgr_create(isc_g_mctx); return 0; } int teardown_netmgr(void **state ISC_ATTR_UNUSED) { isc_netmgr_destroy(); return 0; } int setup_managers(void **state) { setup_loopmgr(state); setup_netmgr(state); return 0; } int teardown_managers(void **state) { teardown_netmgr(state); teardown_loopmgr(state); return 0; } isc_result_t file_path_to_groupname(const char *path, char *out, size_t outlen) { char *dir = NULL; const char *base = NULL; const char *parent_basename; const char *file_basename; REQUIRE(path != NULL); REQUIRE(out != NULL); RETERR(isc_file_splitpath(isc_g_mctx, path, &dir, &base)); parent_basename = isc_file_basename(dir); file_basename = isc_file_basename(base); if (strlen(parent_basename) + 1 + strlen(file_basename) + 1 > outlen) { isc_mem_free(isc_g_mctx, dir); return ISC_R_NOSPACE; } snprintf(out, outlen, "%s_%s", parent_basename, file_basename); isc_mem_free(isc_g_mctx, dir); return ISC_R_SUCCESS; }