sysconf_netbsd.go 6.5 KB

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