| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- // 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_BIND = 1
- _POSIX2_C_DEV = -1
- _POSIX2_CHAR_TERM = -1
- _POSIX2_FORT_DEV = -1
- _POSIX2_FORT_RUN = -1
- _POSIX2_LOCALEDEF = -1
- _POSIX2_SW_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
- // The supported ones are handled in sysconf below.
- 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 {
- // 1003.1
- 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_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_STREAM_MAX:
- // sysctl("user.stream_max")
- return _FOPEN_MAX, nil
- case SC_TZNAME_MAX:
- // sysctl("user.tzname_max")
- return _NAME_MAX, nil
- case SC_SAVED_IDS:
- return yesno(sysctl32("kern.saved_ids")), nil
- case SC_VERSION:
- return sysctl32("kern.posix1version"), nil
- // 1003.1b
- case SC_FSYNC:
- return sysctl32("kern.fsync"), nil
- case SC_SYNCHRONIZED_IO:
- return sysctl32("kern.synchronized_io"), nil
- case SC_MAPPED_FILES:
- return sysctl32("kern.mapped_files"), nil
- case SC_MEMLOCK:
- return sysctl32("kern.memlock"), nil
- case SC_MEMLOCK_RANGE:
- return sysctl32("kern.memlock_range"), nil
- case SC_MEMORY_PROTECTION:
- return sysctl32("kern.memory_protection"), 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 yesno(sysctl32("kern.posix_barriers")), nil
- case SC_SPIN_LOCKS:
- return yesno(sysctl32("kern.posix_spin_locks")), nil
- case SC_READER_WRITER_LOCKS:
- return yesno(sysctl32("kern.posix_reader_writer_locks")), nil
- // 1003.2
- case SC_2_VERSION:
- // sysctl user.posix2_version
- return _POSIX2_VERSION, nil
- case SC_2_C_BIND:
- // sysctl user.posix2_c_bind
- return _POSIX2_C_BIND, nil
- case SC_2_C_DEV:
- // sysctl user.posix2_c_dev
- return _POSIX2_C_DEV, nil
- case SC_2_CHAR_TERM:
- // sysctl user.posix2_char_term
- return _POSIX2_CHAR_TERM, nil
- case SC_2_FORT_DEV:
- // sysctl user.posix2_fort_dev
- return _POSIX2_FORT_DEV, nil
- case SC_2_FORT_RUN:
- // sysctl user.posix2_fort_run
- return _POSIX2_FORT_RUN, nil
- case SC_2_LOCALEDEF:
- // sysctl user.posix2_localedef
- return _POSIX2_LOCALEDEF, nil
- case SC_2_SW_DEV:
- // sysctl user.posix2_sw_dev
- return _POSIX2_SW_DEV, 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
- case SC_XOPEN_SHM:
- return yesno(sysctl32("kern.ipc.sysvshm")), 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 yesno(sysctl32("kern.posix_aio")), nil
- case SC_MESSAGE_PASSING:
- return yesno(sysctl32("kern.posix_msg")), 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_PRIORITY_SCHEDULING:
- return yesno(sysctl32("kern.posix_sched")), nil
- case SC_ATEXIT_MAX:
- // sysctl("user.atexit_max")
- return -1, nil // TODO
- // 1003.1-2001, TSF
- case SC_GETGR_R_SIZE_MAX:
- return _GETGR_R_SIZE_MAX, nil
- case SC_GETPW_R_SIZE_MAX:
- return _GETPW_R_SIZE_MAX, nil
- // Unsorted
- case SC_HOST_NAME_MAX:
- return _MAXHOSTNAMELEN, nil
- case SC_PASS_MAX:
- return _PASSWORD_LEN, nil
- case SC_REGEXP:
- return _POSIX_REGEXP, nil
- case SC_SHARED_MEMORY_OBJECTS:
- return _POSIX_SHARED_MEMORY_OBJECTS, nil
- case SC_SHELL:
- return _POSIX_SHELL, nil
- case SC_SPAWN:
- return _POSIX_SPAWN, nil
- // 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_SCHED_RT_TS:
- return sysctl32("kern.sched.rtts"), nil
- case SC_SCHED_PRI_MIN:
- return sysctl32("kern.sched.pri_min"), nil
- case SC_SCHED_PRI_MAX:
- return sysctl32("kern.sched.pri_max"), nil
- 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
- case SC_THREAD_ATTR_STACKADDR:
- return _POSIX_THREAD_ATTR_STACKADDR, nil
- case SC_THREAD_ATTR_STACKSIZE:
- return _POSIX_THREAD_ATTR_STACKSIZE, nil
- case SC_THREAD_SAFE_FUNCTIONS:
- return _POSIX_THREAD_SAFE_FUNCTIONS, nil
- case SC_THREAD_PRIO_PROTECT:
- return _POSIX_THREAD_PRIO_PROTECT, nil
- case SC_THREAD_PRIORITY_SCHEDULING,
- SC_THREAD_PRIO_INHERIT,
- SC_THREAD_PROCESS_SHARED:
- return -1, nil
- case SC_TTY_NAME_MAX:
- return pathconf(_PATH_DEV, _PC_NAME_MAX), nil
- case SC_TIMER_MAX:
- return _POSIX_TIMER_MAX, nil
- case SC_SEM_NSEMS_MAX:
- return _LONG_MAX, nil
- case SC_CPUTIME:
- return _POSIX_CPUTIME, nil
- case SC_THREAD_CPUTIME:
- return _POSIX_THREAD_CPUTIME, nil
- case SC_DELAYTIMER_MAX:
- return _POSIX_DELAYTIMER_MAX, nil
- case SC_SIGQUEUE_MAX:
- return _POSIX_SIGQUEUE_MAX, nil
- case SC_REALTIME_SIGNALS:
- return 200112, nil
- }
- return sysconfGeneric(name)
- }
|