155 lines
3.7 KiB
Go
155 lines
3.7 KiB
Go
|
// Copyright 2018 Tobias Klauser. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package sysconf
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
|
||
|
"golang.org/x/sys/unix"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
_HOST_NAME_MAX = _MAXHOSTNAMELEN
|
||
|
_LOGIN_NAME_MAX = _MAXLOGNAME + 1
|
||
|
_SYMLOOP_MAX = _MAXSYMLINKS
|
||
|
|
||
|
_POSIX2_C_DEV = -1
|
||
|
_POSIX2_UPE = -1
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
clktck int64
|
||
|
clktckOnce sync.Once
|
||
|
)
|
||
|
|
||
|
func sysconfPOSIX(name int) (int64, error) {
|
||
|
// NetBSD does not define all _POSIX_* values used in sysconf_posix.go
|
||
|
// Handle the supported ones here.
|
||
|
switch name {
|
||
|
case SC_SHELL:
|
||
|
return _POSIX_SHELL, nil
|
||
|
case SC_VERSION:
|
||
|
return _POSIX_VERSION, nil
|
||
|
}
|
||
|
|
||
|
return -1, errInvalid
|
||
|
}
|
||
|
|
||
|
func sysconf(name int) (int64, error) {
|
||
|
// NetBSD uses sysctl to get some of these values. For the user.* namespace,
|
||
|
// calls get handled by user_sysctl in /usr/src/lib/libc/gen/sysctl.c
|
||
|
// Duplicate the relevant values here.
|
||
|
|
||
|
switch name {
|
||
|
case SC_ARG_MAX:
|
||
|
return sysctl32("kern.argmax"), nil
|
||
|
case SC_CHILD_MAX:
|
||
|
var rlim unix.Rlimit
|
||
|
if err := unix.Getrlimit(unix.RLIMIT_NPROC, &rlim); err == nil {
|
||
|
if rlim.Cur != unix.RLIM_INFINITY {
|
||
|
return int64(rlim.Cur), nil
|
||
|
}
|
||
|
}
|
||
|
return -1, nil
|
||
|
case SC_STREAM_MAX:
|
||
|
// sysctl("user.stream_max")
|
||
|
return _FOPEN_MAX, nil
|
||
|
case SC_TTY_NAME_MAX:
|
||
|
return pathconf(_PATH_DEV, _PC_NAME_MAX), nil
|
||
|
case SC_CLK_TCK:
|
||
|
clktckOnce.Do(func() {
|
||
|
clktck = -1
|
||
|
if ci, err := unix.SysctlClockinfo("kern.clockrate"); err == nil {
|
||
|
clktck = int64(ci.Hz)
|
||
|
}
|
||
|
})
|
||
|
return clktck, nil
|
||
|
case SC_NGROUPS_MAX:
|
||
|
return sysctl32("kern.ngroups"), nil
|
||
|
case SC_JOB_CONTROL:
|
||
|
return sysctl32("kern.job_control"), nil
|
||
|
case SC_OPEN_MAX:
|
||
|
var rlim unix.Rlimit
|
||
|
if err := unix.Getrlimit(unix.RLIMIT_NOFILE, &rlim); err == nil {
|
||
|
return int64(rlim.Cur), nil
|
||
|
}
|
||
|
return -1, nil
|
||
|
case SC_TZNAME_MAX:
|
||
|
// sysctl("user.tzname_max")
|
||
|
return _NAME_MAX, nil
|
||
|
|
||
|
// 1003.1b
|
||
|
case SC_FSYNC:
|
||
|
return sysctl32("kern.fsync"), nil
|
||
|
case SC_MAPPED_FILES:
|
||
|
return sysctl32("kern.mapped_files"), nil
|
||
|
case SC_MONOTONIC_CLOCK:
|
||
|
return sysctl32("kern.monotonic_clock"), nil
|
||
|
case SC_SEMAPHORES:
|
||
|
return sysctl32("kern.posix_semaphores"), nil
|
||
|
case SC_TIMERS:
|
||
|
return sysctl32("kern.posix_timers"), nil
|
||
|
|
||
|
// 1003.1c
|
||
|
case SC_LOGIN_NAME_MAX:
|
||
|
return sysctl32("kern.login_name_max"), nil
|
||
|
case SC_THREADS:
|
||
|
return sysctl32("kern.posix_threads"), nil
|
||
|
|
||
|
// 1003.1j
|
||
|
case SC_BARRIERS:
|
||
|
return sysctl32("kern.posix_barriers"), nil
|
||
|
|
||
|
// 1003.2
|
||
|
case SC_2_VERSION:
|
||
|
// sysctl("user.posix2_version")
|
||
|
return _POSIX2_VERSION, nil
|
||
|
case SC_2_UPE:
|
||
|
// sysctl("user.posix2_upe")
|
||
|
return _POSIX2_UPE, nil
|
||
|
|
||
|
// XPG 4.2
|
||
|
case SC_IOV_MAX:
|
||
|
return sysctl32("kern.iov_max"), nil
|
||
|
|
||
|
// 1003.1-2001, XSI Option Group
|
||
|
case SC_AIO_LISTIO_MAX:
|
||
|
return sysctl32("kern.aio_listio_max"), nil
|
||
|
case SC_AIO_MAX:
|
||
|
return sysctl32("kern.aio_max"), nil
|
||
|
case SC_ASYNCHRONOUS_IO:
|
||
|
return sysctl32("kern.posix_aio"), nil
|
||
|
case SC_MQ_OPEN_MAX:
|
||
|
return sysctl32("kern.mqueue.mq_open_max"), nil
|
||
|
case SC_MQ_PRIO_MAX:
|
||
|
return sysctl32("kern.mqueue.mq_prio_max"), nil
|
||
|
case SC_ATEXIT_MAX:
|
||
|
// sysctl("user.atexit_max")
|
||
|
return -1, nil // TODO
|
||
|
|
||
|
// Extensions
|
||
|
case SC_NPROCESSORS_CONF:
|
||
|
return sysctl32("hw.ncpu"), nil
|
||
|
case SC_NPROCESSORS_ONLN:
|
||
|
return sysctl32("hw.ncpuonline"), nil
|
||
|
|
||
|
// Linux/Solaris
|
||
|
case SC_PHYS_PAGES:
|
||
|
return sysctl64("hw.physmem64") / int64(unix.Getpagesize()), nil
|
||
|
|
||
|
// Native
|
||
|
case SC_THREAD_DESTRUCTOR_ITERATIONS:
|
||
|
return _POSIX_THREAD_DESTRUCTOR_ITERATIONS, nil
|
||
|
case SC_THREAD_KEYS_MAX:
|
||
|
return _POSIX_THREAD_KEYS_MAX, nil
|
||
|
case SC_THREAD_STACK_MIN:
|
||
|
return int64(unix.Getpagesize()), nil
|
||
|
case SC_THREAD_THREADS_MAX:
|
||
|
return sysctl32("kern.maxproc"), nil
|
||
|
}
|
||
|
|
||
|
return sysconfGeneric(name)
|
||
|
}
|