cubefs

Форк
0
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

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
	// NetBSD does not define all _POSIX_* values used in sysconf_posix.go
35
	// The supported ones are handled in sysconf below.
36
	return -1, errInvalid
37
}
38

39
func 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

44
	switch name {
45

46
	// 1003.1
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
		// sysctl("user.stream_max")
77
		return _FOPEN_MAX, nil
78
	case SC_TZNAME_MAX:
79
		// sysctl("user.tzname_max")
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
	// 1003.1b
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
	// 1003.1c
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
	// 1003.1j
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
	// 1003.2
121
	case SC_2_VERSION:
122
		// sysctl user.posix2_version
123
		return _POSIX2_VERSION, nil
124
	case SC_2_C_BIND:
125
		// sysctl user.posix2_c_bind
126
		return _POSIX2_C_BIND, nil
127
	case SC_2_C_DEV:
128
		// sysctl user.posix2_c_dev
129
		return _POSIX2_C_DEV, nil
130
	case SC_2_CHAR_TERM:
131
		// sysctl user.posix2_char_term
132
		return _POSIX2_CHAR_TERM, nil
133
	case SC_2_FORT_DEV:
134
		// sysctl user.posix2_fort_dev
135
		return _POSIX2_FORT_DEV, nil
136
	case SC_2_FORT_RUN:
137
		// sysctl user.posix2_fort_run
138
		return _POSIX2_FORT_RUN, nil
139
	case SC_2_LOCALEDEF:
140
		// sysctl user.posix2_localedef
141
		return _POSIX2_LOCALEDEF, nil
142
	case SC_2_SW_DEV:
143
		// sysctl user.posix2_sw_dev
144
		return _POSIX2_SW_DEV, nil
145
	case SC_2_UPE:
146
		// sysctl user.posix2_upe
147
		return _POSIX2_UPE, nil
148

149
	// XPG 4.2
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
	// 1003.1-2001, XSI Option Group
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
		// sysctl("user.atexit_max")
172
		return -1, nil // TODO
173

174
	// 1003.1-2001, TSF
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
	// Unsorted
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
	// Extensions
195
	case SC_NPROCESSORS_CONF:
196
		return sysctl32("hw.ncpu"), nil
197
	case SC_NPROCESSORS_ONLN:
198
		return sysctl32("hw.ncpuonline"), nil
199

200
	// Linux/Solaris
201
	case SC_PHYS_PAGES:
202
		return sysctl64("hw.physmem64") / int64(unix.Getpagesize()), nil
203

204
	// Native
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

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.