xref: /netbsd-src/external/mpl/dhcp/bind/dist/lib/isc/unix/os.c (revision 4afad4b7fa6d4a0d3dedf41d1587a7250710ae54)
1*4afad4b7Schristos /*	$NetBSD: os.c,v 1.1 2024/02/18 20:57:57 christos Exp $	*/
2*4afad4b7Schristos 
3*4afad4b7Schristos /*
4*4afad4b7Schristos  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5*4afad4b7Schristos  *
6*4afad4b7Schristos  * SPDX-License-Identifier: MPL-2.0
7*4afad4b7Schristos  *
8*4afad4b7Schristos  * This Source Code Form is subject to the terms of the Mozilla Public
9*4afad4b7Schristos  * License, v. 2.0. If a copy of the MPL was not distributed with this
10*4afad4b7Schristos  * file, you can obtain one at https://mozilla.org/MPL/2.0/.
11*4afad4b7Schristos  *
12*4afad4b7Schristos  * See the COPYRIGHT file distributed with this work for additional
13*4afad4b7Schristos  * information regarding copyright ownership.
14*4afad4b7Schristos  */
15*4afad4b7Schristos 
16*4afad4b7Schristos #include <isc/os.h>
17*4afad4b7Schristos 
18*4afad4b7Schristos #ifdef HAVE_SYSCONF
19*4afad4b7Schristos 
20*4afad4b7Schristos #include <unistd.h>
21*4afad4b7Schristos 
22*4afad4b7Schristos static long
sysconf_ncpus(void)23*4afad4b7Schristos sysconf_ncpus(void) {
24*4afad4b7Schristos #if defined(_SC_NPROCESSORS_ONLN)
25*4afad4b7Schristos 	return (sysconf((_SC_NPROCESSORS_ONLN)));
26*4afad4b7Schristos #elif defined(_SC_NPROC_ONLN)
27*4afad4b7Schristos 	return (sysconf((_SC_NPROC_ONLN)));
28*4afad4b7Schristos #else  /* if defined(_SC_NPROCESSORS_ONLN) */
29*4afad4b7Schristos 	return (0);
30*4afad4b7Schristos #endif /* if defined(_SC_NPROCESSORS_ONLN) */
31*4afad4b7Schristos }
32*4afad4b7Schristos #endif /* HAVE_SYSCONF */
33*4afad4b7Schristos 
34*4afad4b7Schristos #if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME)
35*4afad4b7Schristos #include <sys/param.h> /* for NetBSD */
36*4afad4b7Schristos #include <sys/sysctl.h>
37*4afad4b7Schristos #include <sys/types.h> /* for FreeBSD */
38*4afad4b7Schristos 
39*4afad4b7Schristos static int
sysctl_ncpus(void)40*4afad4b7Schristos sysctl_ncpus(void) {
41*4afad4b7Schristos 	int ncpu, result;
42*4afad4b7Schristos 	size_t len;
43*4afad4b7Schristos 
44*4afad4b7Schristos 	len = sizeof(ncpu);
45*4afad4b7Schristos 	result = sysctlbyname("hw.ncpu", &ncpu, &len, 0, 0);
46*4afad4b7Schristos 	if (result != -1) {
47*4afad4b7Schristos 		return (ncpu);
48*4afad4b7Schristos 	}
49*4afad4b7Schristos 	return (0);
50*4afad4b7Schristos }
51*4afad4b7Schristos #endif /* if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME) */
52*4afad4b7Schristos 
53*4afad4b7Schristos unsigned int
isc_os_ncpus(void)54*4afad4b7Schristos isc_os_ncpus(void) {
55*4afad4b7Schristos 	long ncpus = 0;
56*4afad4b7Schristos 
57*4afad4b7Schristos #if defined(HAVE_SYSCONF)
58*4afad4b7Schristos 	ncpus = sysconf_ncpus();
59*4afad4b7Schristos #endif /* if defined(HAVE_SYSCONF) */
60*4afad4b7Schristos #if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME)
61*4afad4b7Schristos 	if (ncpus <= 0) {
62*4afad4b7Schristos 		ncpus = sysctl_ncpus();
63*4afad4b7Schristos 	}
64*4afad4b7Schristos #endif /* if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTLBYNAME) */
65*4afad4b7Schristos 	if (ncpus <= 0) {
66*4afad4b7Schristos 		ncpus = 1;
67*4afad4b7Schristos 	}
68*4afad4b7Schristos 
69*4afad4b7Schristos 	return ((unsigned int)ncpus);
70*4afad4b7Schristos }
71