cubefs
250 строк · 6.5 Кб
1// Copyright 2018 Tobias Klauser. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package sysconf
6
7import (
8"sync"
9
10"golang.org/x/sys/unix"
11)
12
13const (
14_HOST_NAME_MAX = _MAXHOSTNAMELEN
15_LOGIN_NAME_MAX = _MAXLOGNAME + 1
16_SYMLOOP_MAX = _MAXSYMLINKS
17
18_POSIX2_C_BIND = 1
19_POSIX2_C_DEV = -1
20_POSIX2_CHAR_TERM = -1
21_POSIX2_FORT_DEV = -1
22_POSIX2_FORT_RUN = -1
23_POSIX2_LOCALEDEF = -1
24_POSIX2_SW_DEV = -1
25_POSIX2_UPE = -1
26)
27
28var (
29clktck int64
30clktckOnce sync.Once
31)
32
33func sysconfPOSIX(name int) (int64, error) {
34// NetBSD does not define all _POSIX_* values used in sysconf_posix.go
35// The supported ones are handled in sysconf below.
36return -1, errInvalid
37}
38
39func sysconf(name int) (int64, error) {
40// NetBSD uses sysctl to get some of these values. For the user.* namespace,
41// calls get handled by user_sysctl in /usr/src/lib/libc/gen/sysctl.c
42// Duplicate the relevant values here.
43
44switch name {
45
46// 1003.1
47case SC_ARG_MAX:
48return sysctl32("kern.argmax"), nil
49case SC_CHILD_MAX:
50var rlim unix.Rlimit
51if err := unix.Getrlimit(unix.RLIMIT_NPROC, &rlim); err == nil {
52if rlim.Cur != unix.RLIM_INFINITY {
53return int64(rlim.Cur), nil
54}
55}
56return -1, nil
57case SC_CLK_TCK:
58clktckOnce.Do(func() {
59clktck = -1
60if ci, err := unix.SysctlClockinfo("kern.clockrate"); err == nil {
61clktck = int64(ci.Hz)
62}
63})
64return clktck, nil
65case SC_NGROUPS_MAX:
66return sysctl32("kern.ngroups"), nil
67case SC_JOB_CONTROL:
68return sysctl32("kern.job_control"), nil
69case SC_OPEN_MAX:
70var rlim unix.Rlimit
71if err := unix.Getrlimit(unix.RLIMIT_NOFILE, &rlim); err == nil {
72return int64(rlim.Cur), nil
73}
74return -1, nil
75case SC_STREAM_MAX:
76// sysctl("user.stream_max")
77return _FOPEN_MAX, nil
78case SC_TZNAME_MAX:
79// sysctl("user.tzname_max")
80return _NAME_MAX, nil
81case SC_SAVED_IDS:
82return yesno(sysctl32("kern.saved_ids")), nil
83case SC_VERSION:
84return sysctl32("kern.posix1version"), nil
85
86// 1003.1b
87case SC_FSYNC:
88return sysctl32("kern.fsync"), nil
89case SC_SYNCHRONIZED_IO:
90return sysctl32("kern.synchronized_io"), nil
91case SC_MAPPED_FILES:
92return sysctl32("kern.mapped_files"), nil
93case SC_MEMLOCK:
94return sysctl32("kern.memlock"), nil
95case SC_MEMLOCK_RANGE:
96return sysctl32("kern.memlock_range"), nil
97case SC_MEMORY_PROTECTION:
98return sysctl32("kern.memory_protection"), nil
99case SC_MONOTONIC_CLOCK:
100return sysctl32("kern.monotonic_clock"), nil
101case SC_SEMAPHORES:
102return sysctl32("kern.posix_semaphores"), nil
103case SC_TIMERS:
104return sysctl32("kern.posix_timers"), nil
105
106// 1003.1c
107case SC_LOGIN_NAME_MAX:
108return sysctl32("kern.login_name_max"), nil
109case SC_THREADS:
110return sysctl32("kern.posix_threads"), nil
111
112// 1003.1j
113case SC_BARRIERS:
114return yesno(sysctl32("kern.posix_barriers")), nil
115case SC_SPIN_LOCKS:
116return yesno(sysctl32("kern.posix_spin_locks")), nil
117case SC_READER_WRITER_LOCKS:
118return yesno(sysctl32("kern.posix_reader_writer_locks")), nil
119
120// 1003.2
121case SC_2_VERSION:
122// sysctl user.posix2_version
123return _POSIX2_VERSION, nil
124case SC_2_C_BIND:
125// sysctl user.posix2_c_bind
126return _POSIX2_C_BIND, nil
127case SC_2_C_DEV:
128// sysctl user.posix2_c_dev
129return _POSIX2_C_DEV, nil
130case SC_2_CHAR_TERM:
131// sysctl user.posix2_char_term
132return _POSIX2_CHAR_TERM, nil
133case SC_2_FORT_DEV:
134// sysctl user.posix2_fort_dev
135return _POSIX2_FORT_DEV, nil
136case SC_2_FORT_RUN:
137// sysctl user.posix2_fort_run
138return _POSIX2_FORT_RUN, nil
139case SC_2_LOCALEDEF:
140// sysctl user.posix2_localedef
141return _POSIX2_LOCALEDEF, nil
142case SC_2_SW_DEV:
143// sysctl user.posix2_sw_dev
144return _POSIX2_SW_DEV, nil
145case SC_2_UPE:
146// sysctl user.posix2_upe
147return _POSIX2_UPE, nil
148
149// XPG 4.2
150case SC_IOV_MAX:
151return sysctl32("kern.iov_max"), nil
152case SC_XOPEN_SHM:
153return yesno(sysctl32("kern.ipc.sysvshm")), nil
154
155// 1003.1-2001, XSI Option Group
156case SC_AIO_LISTIO_MAX:
157return sysctl32("kern.aio_listio_max"), nil
158case SC_AIO_MAX:
159return sysctl32("kern.aio_max"), nil
160case SC_ASYNCHRONOUS_IO:
161return yesno(sysctl32("kern.posix_aio")), nil
162case SC_MESSAGE_PASSING:
163return yesno(sysctl32("kern.posix_msg")), nil
164case SC_MQ_OPEN_MAX:
165return sysctl32("kern.mqueue.mq_open_max"), nil
166case SC_MQ_PRIO_MAX:
167return sysctl32("kern.mqueue.mq_prio_max"), nil
168case SC_PRIORITY_SCHEDULING:
169return yesno(sysctl32("kern.posix_sched")), nil
170case SC_ATEXIT_MAX:
171// sysctl("user.atexit_max")
172return -1, nil // TODO
173
174// 1003.1-2001, TSF
175case SC_GETGR_R_SIZE_MAX:
176return _GETGR_R_SIZE_MAX, nil
177case SC_GETPW_R_SIZE_MAX:
178return _GETPW_R_SIZE_MAX, nil
179
180// Unsorted
181case SC_HOST_NAME_MAX:
182return _MAXHOSTNAMELEN, nil
183case SC_PASS_MAX:
184return _PASSWORD_LEN, nil
185case SC_REGEXP:
186return _POSIX_REGEXP, nil
187case SC_SHARED_MEMORY_OBJECTS:
188return _POSIX_SHARED_MEMORY_OBJECTS, nil
189case SC_SHELL:
190return _POSIX_SHELL, nil
191case SC_SPAWN:
192return _POSIX_SPAWN, nil
193
194// Extensions
195case SC_NPROCESSORS_CONF:
196return sysctl32("hw.ncpu"), nil
197case SC_NPROCESSORS_ONLN:
198return sysctl32("hw.ncpuonline"), nil
199
200// Linux/Solaris
201case SC_PHYS_PAGES:
202return sysctl64("hw.physmem64") / int64(unix.Getpagesize()), nil
203
204// Native
205case SC_SCHED_RT_TS:
206return sysctl32("kern.sched.rtts"), nil
207case SC_SCHED_PRI_MIN:
208return sysctl32("kern.sched.pri_min"), nil
209case SC_SCHED_PRI_MAX:
210return sysctl32("kern.sched.pri_max"), nil
211case SC_THREAD_DESTRUCTOR_ITERATIONS:
212return _POSIX_THREAD_DESTRUCTOR_ITERATIONS, nil
213case SC_THREAD_KEYS_MAX:
214return _POSIX_THREAD_KEYS_MAX, nil
215case SC_THREAD_STACK_MIN:
216return int64(unix.Getpagesize()), nil
217case SC_THREAD_THREADS_MAX:
218return sysctl32("kern.maxproc"), nil
219case SC_THREAD_ATTR_STACKADDR:
220return _POSIX_THREAD_ATTR_STACKADDR, nil
221case SC_THREAD_ATTR_STACKSIZE:
222return _POSIX_THREAD_ATTR_STACKSIZE, nil
223case SC_THREAD_SAFE_FUNCTIONS:
224return _POSIX_THREAD_SAFE_FUNCTIONS, nil
225case SC_THREAD_PRIO_PROTECT:
226return _POSIX_THREAD_PRIO_PROTECT, nil
227case SC_THREAD_PRIORITY_SCHEDULING,
228SC_THREAD_PRIO_INHERIT,
229SC_THREAD_PROCESS_SHARED:
230return -1, nil
231case SC_TTY_NAME_MAX:
232return pathconf(_PATH_DEV, _PC_NAME_MAX), nil
233case SC_TIMER_MAX:
234return _POSIX_TIMER_MAX, nil
235case SC_SEM_NSEMS_MAX:
236return _LONG_MAX, nil
237case SC_CPUTIME:
238return _POSIX_CPUTIME, nil
239case SC_THREAD_CPUTIME:
240return _POSIX_THREAD_CPUTIME, nil
241case SC_DELAYTIMER_MAX:
242return _POSIX_DELAYTIMER_MAX, nil
243case SC_SIGQUEUE_MAX:
244return _POSIX_SIGQUEUE_MAX, nil
245case SC_REALTIME_SIGNALS:
246return 200112, nil
247}
248
249return sysconfGeneric(name)
250}
251