sysconf_netbsd.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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 (
  23. clktck int64
  24. clktckOnce sync.Once
  25. )
  26. func sysconfPOSIX(name int) (int64, error) {
  27. // NetBSD does not define all _POSIX_* values used in sysconf_posix.go
  28. // The supported ones are handled in sysconf below.
  29. return -1, errInvalid
  30. }
  31. func sysconf(name int) (int64, error) {
  32. // NetBSD uses sysctl to get some of these values. For the user.* namespace,
  33. // calls get handled by user_sysctl in /usr/src/lib/libc/gen/sysctl.c
  34. // Duplicate the relevant values here.
  35. switch name {
  36. // 1003.1
  37. case SC_ARG_MAX:
  38. return sysctl32("kern.argmax"), nil
  39. case SC_CHILD_MAX:
  40. var rlim unix.Rlimit
  41. if err := unix.Getrlimit(unix.RLIMIT_NPROC, &rlim); err == nil {
  42. if rlim.Cur != unix.RLIM_INFINITY {
  43. return int64(rlim.Cur), nil
  44. }
  45. }
  46. return -1, nil
  47. case SC_CLK_TCK:
  48. clktckOnce.Do(func() {
  49. clktck = -1
  50. if ci, err := unix.SysctlClockinfo("kern.clockrate"); err == nil {
  51. clktck = int64(ci.Hz)
  52. }
  53. })
  54. return clktck, nil
  55. case SC_NGROUPS_MAX:
  56. return sysctl32("kern.ngroups"), nil
  57. case SC_JOB_CONTROL:
  58. return sysctl32("kern.job_control"), nil
  59. case SC_OPEN_MAX:
  60. var rlim unix.Rlimit
  61. if err := unix.Getrlimit(unix.RLIMIT_NOFILE, &rlim); err == nil {
  62. return int64(rlim.Cur), nil
  63. }
  64. return -1, nil
  65. case SC_STREAM_MAX:
  66. // sysctl("user.stream_max")
  67. return _FOPEN_MAX, nil
  68. case SC_TZNAME_MAX:
  69. // sysctl("user.tzname_max")
  70. return _NAME_MAX, nil
  71. case SC_SAVED_IDS:
  72. return yesno(sysctl32("kern.saved_ids")), nil
  73. case SC_VERSION:
  74. return sysctl32("kern.posix1version"), nil
  75. // 1003.1b
  76. case SC_FSYNC:
  77. return sysctl32("kern.fsync"), nil
  78. case SC_SYNCHRONIZED_IO:
  79. return sysctl32("kern.synchronized_io"), nil
  80. case SC_MAPPED_FILES:
  81. return sysctl32("kern.mapped_files"), nil
  82. case SC_MEMLOCK:
  83. return sysctl32("kern.memlock"), nil
  84. case SC_MEMLOCK_RANGE:
  85. return sysctl32("kern.memlock_range"), nil
  86. case SC_MEMORY_PROTECTION:
  87. return sysctl32("kern.memory_protection"), nil
  88. case SC_MONOTONIC_CLOCK:
  89. return sysctl32("kern.monotonic_clock"), nil
  90. case SC_SEMAPHORES:
  91. return sysctl32("kern.posix_semaphores"), nil
  92. case SC_TIMERS:
  93. return sysctl32("kern.posix_timers"), nil
  94. // 1003.1c
  95. case SC_LOGIN_NAME_MAX:
  96. return sysctl32("kern.login_name_max"), nil
  97. case SC_THREADS:
  98. return sysctl32("kern.posix_threads"), nil
  99. // 1003.1j
  100. case SC_BARRIERS:
  101. return yesno(sysctl32("kern.posix_barriers")), nil
  102. case SC_SPIN_LOCKS:
  103. return yesno(sysctl32("kern.posix_spin_locks")), nil
  104. case SC_READER_WRITER_LOCKS:
  105. return yesno(sysctl32("kern.posix_reader_writer_locks")), nil
  106. // 1003.2
  107. case SC_2_VERSION:
  108. // sysctl user.posix2_version
  109. return _POSIX2_VERSION, nil
  110. case SC_2_C_BIND:
  111. // sysctl user.posix2_c_bind
  112. return _POSIX2_C_BIND, nil
  113. case SC_2_C_DEV:
  114. // sysctl user.posix2_c_dev
  115. return _POSIX2_C_DEV, nil
  116. case SC_2_CHAR_TERM:
  117. // sysctl user.posix2_char_term
  118. return _POSIX2_CHAR_TERM, nil
  119. case SC_2_FORT_DEV:
  120. // sysctl user.posix2_fort_dev
  121. return _POSIX2_FORT_DEV, nil
  122. case SC_2_FORT_RUN:
  123. // sysctl user.posix2_fort_run
  124. return _POSIX2_FORT_RUN, nil
  125. case SC_2_LOCALEDEF:
  126. // sysctl user.posix2_localedef
  127. return _POSIX2_LOCALEDEF, nil
  128. case SC_2_SW_DEV:
  129. // sysctl user.posix2_sw_dev
  130. return _POSIX2_SW_DEV, nil
  131. case SC_2_UPE:
  132. // sysctl user.posix2_upe
  133. return _POSIX2_UPE, nil
  134. // XPG 4.2
  135. case SC_IOV_MAX:
  136. return sysctl32("kern.iov_max"), nil
  137. case SC_XOPEN_SHM:
  138. return yesno(sysctl32("kern.ipc.sysvshm")), nil
  139. // 1003.1-2001, XSI Option Group
  140. case SC_AIO_LISTIO_MAX:
  141. return sysctl32("kern.aio_listio_max"), nil
  142. case SC_AIO_MAX:
  143. return sysctl32("kern.aio_max"), nil
  144. case SC_ASYNCHRONOUS_IO:
  145. return yesno(sysctl32("kern.posix_aio")), nil
  146. case SC_MESSAGE_PASSING:
  147. return yesno(sysctl32("kern.posix_msg")), nil
  148. case SC_MQ_OPEN_MAX:
  149. return sysctl32("kern.mqueue.mq_open_max"), nil
  150. case SC_MQ_PRIO_MAX:
  151. return sysctl32("kern.mqueue.mq_prio_max"), nil
  152. case SC_PRIORITY_SCHEDULING:
  153. return yesno(sysctl32("kern.posix_sched")), nil
  154. case SC_ATEXIT_MAX:
  155. // sysctl("user.atexit_max")
  156. return -1, nil // TODO
  157. // 1003.1-2001, TSF
  158. case SC_GETGR_R_SIZE_MAX:
  159. return _GETGR_R_SIZE_MAX, nil
  160. case SC_GETPW_R_SIZE_MAX:
  161. return _GETPW_R_SIZE_MAX, nil
  162. // Unsorted
  163. case SC_HOST_NAME_MAX:
  164. return _MAXHOSTNAMELEN, nil
  165. case SC_PASS_MAX:
  166. return _PASSWORD_LEN, nil
  167. case SC_REGEXP:
  168. return _POSIX_REGEXP, nil
  169. case SC_SHARED_MEMORY_OBJECTS:
  170. return _POSIX_SHARED_MEMORY_OBJECTS, nil
  171. case SC_SHELL:
  172. return _POSIX_SHELL, nil
  173. case SC_SPAWN:
  174. return _POSIX_SPAWN, nil
  175. // Extensions
  176. case SC_NPROCESSORS_CONF:
  177. return sysctl32("hw.ncpu"), nil
  178. case SC_NPROCESSORS_ONLN:
  179. return sysctl32("hw.ncpuonline"), nil
  180. // Linux/Solaris
  181. case SC_PHYS_PAGES:
  182. return sysctl64("hw.physmem64") / int64(unix.Getpagesize()), 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. }