1
2
3
4
5 package sysconf
6
7 import (
8 "sync"
9
10 "golang.org/x/sys/unix"
11 )
12
13 const (
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
28 var (
29 clktck int64
30 clktckOnce sync.Once
31 )
32
33 func sysconfPOSIX(name int) (int64, error) {
34
35
36 return -1, errInvalid
37 }
38
39 func sysconf(name int) (int64, error) {
40
41
42
43
44 switch name {
45
46
47 case SC_ARG_MAX:
48 return sysctl32("kern.argmax"), nil
49 case SC_CHILD_MAX:
50 var rlim unix.Rlimit
51 if err := unix.Getrlimit(unix.RLIMIT_NPROC, &rlim); err == nil {
52 if rlim.Cur != unix.RLIM_INFINITY {
53 return int64(rlim.Cur), nil
54 }
55 }
56 return -1, nil
57 case SC_CLK_TCK:
58 clktckOnce.Do(func() {
59 clktck = -1
60 if ci, err := unix.SysctlClockinfo("kern.clockrate"); err == nil {
61 clktck = int64(ci.Hz)
62 }
63 })
64 return clktck, nil
65 case SC_NGROUPS_MAX:
66 return sysctl32("kern.ngroups"), nil
67 case SC_JOB_CONTROL:
68 return sysctl32("kern.job_control"), nil
69 case SC_OPEN_MAX:
70 var rlim unix.Rlimit
71 if err := unix.Getrlimit(unix.RLIMIT_NOFILE, &rlim); err == nil {
72 return int64(rlim.Cur), nil
73 }
74 return -1, nil
75 case SC_STREAM_MAX:
76
77 return _FOPEN_MAX, nil
78 case SC_TZNAME_MAX:
79
80 return _NAME_MAX, nil
81 case SC_SAVED_IDS:
82 return yesno(sysctl32("kern.saved_ids")), nil
83 case SC_VERSION:
84 return sysctl32("kern.posix1version"), nil
85
86
87 case SC_FSYNC:
88 return sysctl32("kern.fsync"), nil
89 case SC_SYNCHRONIZED_IO:
90 return sysctl32("kern.synchronized_io"), nil
91 case SC_MAPPED_FILES:
92 return sysctl32("kern.mapped_files"), nil
93 case SC_MEMLOCK:
94 return sysctl32("kern.memlock"), nil
95 case SC_MEMLOCK_RANGE:
96 return sysctl32("kern.memlock_range"), nil
97 case SC_MEMORY_PROTECTION:
98 return sysctl32("kern.memory_protection"), nil
99 case SC_MONOTONIC_CLOCK:
100 return sysctl32("kern.monotonic_clock"), nil
101 case SC_SEMAPHORES:
102 return sysctl32("kern.posix_semaphores"), nil
103 case SC_TIMERS:
104 return sysctl32("kern.posix_timers"), nil
105
106
107 case SC_LOGIN_NAME_MAX:
108 return sysctl32("kern.login_name_max"), nil
109 case SC_THREADS:
110 return sysctl32("kern.posix_threads"), nil
111
112
113 case SC_BARRIERS:
114 return yesno(sysctl32("kern.posix_barriers")), nil
115 case SC_SPIN_LOCKS:
116 return yesno(sysctl32("kern.posix_spin_locks")), nil
117 case SC_READER_WRITER_LOCKS:
118 return yesno(sysctl32("kern.posix_reader_writer_locks")), nil
119
120
121 case SC_2_VERSION:
122
123 return _POSIX2_VERSION, nil
124 case SC_2_C_BIND:
125
126 return _POSIX2_C_BIND, nil
127 case SC_2_C_DEV:
128
129 return _POSIX2_C_DEV, nil
130 case SC_2_CHAR_TERM:
131
132 return _POSIX2_CHAR_TERM, nil
133 case SC_2_FORT_DEV:
134
135 return _POSIX2_FORT_DEV, nil
136 case SC_2_FORT_RUN:
137
138 return _POSIX2_FORT_RUN, nil
139 case SC_2_LOCALEDEF:
140
141 return _POSIX2_LOCALEDEF, nil
142 case SC_2_SW_DEV:
143
144 return _POSIX2_SW_DEV, nil
145 case SC_2_UPE:
146
147 return _POSIX2_UPE, nil
148
149
150 case SC_IOV_MAX:
151 return sysctl32("kern.iov_max"), nil
152 case SC_XOPEN_SHM:
153 return yesno(sysctl32("kern.ipc.sysvshm")), nil
154
155
156 case SC_AIO_LISTIO_MAX:
157 return sysctl32("kern.aio_listio_max"), nil
158 case SC_AIO_MAX:
159 return sysctl32("kern.aio_max"), nil
160 case SC_ASYNCHRONOUS_IO:
161 return yesno(sysctl32("kern.posix_aio")), nil
162 case SC_MESSAGE_PASSING:
163 return yesno(sysctl32("kern.posix_msg")), nil
164 case SC_MQ_OPEN_MAX:
165 return sysctl32("kern.mqueue.mq_open_max"), nil
166 case SC_MQ_PRIO_MAX:
167 return sysctl32("kern.mqueue.mq_prio_max"), nil
168 case SC_PRIORITY_SCHEDULING:
169 return yesno(sysctl32("kern.posix_sched")), nil
170 case SC_ATEXIT_MAX:
171
172 return -1, nil
173
174
175 case SC_GETGR_R_SIZE_MAX:
176 return _GETGR_R_SIZE_MAX, nil
177 case SC_GETPW_R_SIZE_MAX:
178 return _GETPW_R_SIZE_MAX, nil
179
180
181 case SC_HOST_NAME_MAX:
182 return _MAXHOSTNAMELEN, nil
183 case SC_PASS_MAX:
184 return _PASSWORD_LEN, nil
185 case SC_REGEXP:
186 return _POSIX_REGEXP, nil
187 case SC_SHARED_MEMORY_OBJECTS:
188 return _POSIX_SHARED_MEMORY_OBJECTS, nil
189 case SC_SHELL:
190 return _POSIX_SHELL, nil
191 case SC_SPAWN:
192 return _POSIX_SPAWN, nil
193
194
195 case SC_NPROCESSORS_CONF:
196 return sysctl32("hw.ncpu"), nil
197 case SC_NPROCESSORS_ONLN:
198 return sysctl32("hw.ncpuonline"), nil
199
200
201 case SC_PHYS_PAGES:
202 return sysctl64("hw.physmem64") / int64(unix.Getpagesize()), nil
203
204
205 case SC_SCHED_RT_TS:
206 return sysctl32("kern.sched.rtts"), nil
207 case SC_SCHED_PRI_MIN:
208 return sysctl32("kern.sched.pri_min"), nil
209 case SC_SCHED_PRI_MAX:
210 return sysctl32("kern.sched.pri_max"), nil
211 case SC_THREAD_DESTRUCTOR_ITERATIONS:
212 return _POSIX_THREAD_DESTRUCTOR_ITERATIONS, nil
213 case SC_THREAD_KEYS_MAX:
214 return _POSIX_THREAD_KEYS_MAX, nil
215 case SC_THREAD_STACK_MIN:
216 return int64(unix.Getpagesize()), nil
217 case SC_THREAD_THREADS_MAX:
218 return sysctl32("kern.maxproc"), nil
219 case SC_THREAD_ATTR_STACKADDR:
220 return _POSIX_THREAD_ATTR_STACKADDR, nil
221 case SC_THREAD_ATTR_STACKSIZE:
222 return _POSIX_THREAD_ATTR_STACKSIZE, nil
223 case SC_THREAD_SAFE_FUNCTIONS:
224 return _POSIX_THREAD_SAFE_FUNCTIONS, nil
225 case SC_THREAD_PRIO_PROTECT:
226 return _POSIX_THREAD_PRIO_PROTECT, nil
227 case SC_THREAD_PRIORITY_SCHEDULING,
228 SC_THREAD_PRIO_INHERIT,
229 SC_THREAD_PROCESS_SHARED:
230 return -1, nil
231 case SC_TTY_NAME_MAX:
232 return pathconf(_PATH_DEV, _PC_NAME_MAX), nil
233 case SC_TIMER_MAX:
234 return _POSIX_TIMER_MAX, nil
235 case SC_SEM_NSEMS_MAX:
236 return _LONG_MAX, nil
237 case SC_CPUTIME:
238 return _POSIX_CPUTIME, nil
239 case SC_THREAD_CPUTIME:
240 return _POSIX_THREAD_CPUTIME, nil
241 case SC_DELAYTIMER_MAX:
242 return _POSIX_DELAYTIMER_MAX, nil
243 case SC_SIGQUEUE_MAX:
244 return _POSIX_SIGQUEUE_MAX, nil
245 case SC_REALTIME_SIGNALS:
246 return 200112, nil
247 }
248
249 return sysconfGeneric(name)
250 }
251
View as plain text