sysconf_freebsd.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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 "golang.org/x/sys/unix"
  6. const (
  7. _HOST_NAME_MAX = _MAXHOSTNAMELEN - 1
  8. _LOGIN_NAME_MAX = _MAXLOGNAME
  9. _SYMLOOP_MAX = _MAXSYMLINKS
  10. )
  11. // sysconf implements sysconf(3) as in the FreeBSD 12 libc.
  12. func sysconf(name int) (int64, error) {
  13. switch name {
  14. case SC_AIO_LISTIO_MAX:
  15. return sysctl32("p1003_1b.aio_listio_max"), nil
  16. case SC_AIO_MAX:
  17. return sysctl32("p1003_1b.aio_max"), nil
  18. case SC_AIO_PRIO_DELTA_MAX:
  19. return sysctl32("p1003_1b.aio_prio_delta_max"), nil
  20. case SC_ARG_MAX:
  21. return sysctl32("kern.argmax"), nil
  22. case SC_ATEXIT_MAX:
  23. return _ATEXIT_SIZE, nil
  24. case SC_CHILD_MAX:
  25. var rlim unix.Rlimit
  26. if err := unix.Getrlimit(unix.RLIMIT_NPROC, &rlim); err == nil {
  27. if rlim.Cur != unix.RLIM_INFINITY {
  28. return rlim.Cur, nil
  29. }
  30. }
  31. return -1, nil
  32. case SC_CLK_TCK:
  33. return _CLK_TCK, nil
  34. case SC_DELAYTIMER_MAX:
  35. return sysctl32("p1003_1b.delaytimer_max"), nil
  36. case SC_GETGR_R_SIZE_MAX, SC_GETPW_R_SIZE_MAX:
  37. return -1, nil
  38. case SC_IOV_MAX:
  39. return sysctl32("kern.iov_max"), nil
  40. case SC_MQ_OPEN_MAX:
  41. return yesno(sysctl32("p1003_1b.mq_open_max")), nil
  42. case SC_MQ_PRIO_MAX:
  43. return _MQ_PRIO_MAX, nil
  44. case SC_NGROUPS_MAX:
  45. return sysctl32("kern.ngroups"), nil
  46. case SC_OPEN_MAX:
  47. var rlim unix.Rlimit
  48. if err := unix.Getrlimit(unix.RLIMIT_NOFILE, &rlim); err == nil {
  49. if rlim.Cur != unix.RLIM_INFINITY {
  50. return rlim.Cur, nil
  51. }
  52. }
  53. return -1, nil
  54. case SC_RTSIG_MAX:
  55. return sysctl32("p1003_1b.rtsig_max"), nil
  56. case SC_SEM_NSEMS_MAX:
  57. return -1, nil
  58. case SC_SEM_VALUE_MAX:
  59. return _SEM_VALUE_MAX, nil
  60. case SC_SIGQUEUE_MAX:
  61. return sysctl32("p1003_1b.sigqueue_max"), nil
  62. case SC_STREAM_MAX:
  63. var rlim unix.Rlimit
  64. if err := unix.Getrlimit(unix.RLIMIT_NOFILE, &rlim); err != nil {
  65. return -1, nil
  66. }
  67. if rlim.Cur == unix.RLIM_INFINITY {
  68. return -1, nil
  69. }
  70. if rlim.Cur > _LONG_MAX {
  71. return -1, unix.EOVERFLOW
  72. }
  73. if rlim.Cur > _SHRT_MAX {
  74. return _SHRT_MAX, nil
  75. }
  76. return rlim.Cur, nil
  77. case SC_THREAD_DESTRUCTOR_ITERATIONS:
  78. return _PTHREAD_DESTRUCTOR_ITERATIONS, nil
  79. case SC_THREAD_KEYS_MAX:
  80. return _PTHREAD_KEYS_MAX, nil
  81. case SC_THREAD_PRIO_INHERIT:
  82. return _POSIX_THREAD_PRIO_INHERIT, nil
  83. case SC_THREAD_PRIO_PROTECT:
  84. return _POSIX_THREAD_PRIO_PROTECT, nil
  85. case SC_THREAD_STACK_MIN:
  86. return _PTHREAD_STACK_MIN, nil
  87. case SC_THREAD_THREADS_MAX:
  88. return -1, nil
  89. case SC_TIMER_MAX:
  90. return yesno(sysctl32("p1003_1b.timer_max")), nil
  91. case SC_TTY_NAME_MAX:
  92. return pathconf(_PATH_DEV, _PC_NAME_MAX), nil
  93. case SC_TZNAME_MAX:
  94. return pathconf(_PATH_ZONEINFO, _PC_NAME_MAX), nil
  95. case SC_IPV6:
  96. if _POSIX_IPV6 == 0 {
  97. fd, err := unix.Socket(unix.AF_INET6, unix.SOCK_DGRAM, 0)
  98. if err == nil && fd >= 0 {
  99. unix.Close(fd)
  100. return int64(200112), nil
  101. }
  102. return 0, nil
  103. }
  104. return _POSIX_IPV6, nil
  105. case SC_MESSAGE_PASSING:
  106. if _POSIX_MESSAGE_PASSING == 0 {
  107. return yesno(sysctl32("p1003_1b.message_passing")), nil
  108. }
  109. return _POSIX_MESSAGE_PASSING, nil
  110. case SC_PRIORITIZED_IO:
  111. if _POSIX_PRIORITIZED_IO == 0 {
  112. return yesno(sysctl32("p1003_1b.prioritized_io")), nil
  113. }
  114. return _POSIX_PRIORITIZED_IO, nil
  115. case SC_PRIORITY_SCHEDULING:
  116. if _POSIX_PRIORITY_SCHEDULING == 0 {
  117. return yesno(sysctl32("p1003_1b.priority_scheduling")), nil
  118. }
  119. return _POSIX_PRIORITY_SCHEDULING, nil
  120. case SC_REALTIME_SIGNALS:
  121. if _POSIX_REALTIME_SIGNALS == 0 {
  122. return yesno(sysctl32("p1003_1b.realtime_signals")), nil
  123. }
  124. return _POSIX_REALTIME_SIGNALS, nil
  125. case SC_SAVED_IDS:
  126. return yesno(sysctl32("kern.saved_ids")), nil
  127. case SC_SEMAPHORES:
  128. if _POSIX_SEMAPHORES == 0 {
  129. return yesno(sysctl32("p1003_1b.semaphores")), nil
  130. }
  131. return _POSIX_SEMAPHORES, nil
  132. case SC_SPAWN:
  133. return _POSIX_SPAWN, nil
  134. case SC_SPIN_LOCKS:
  135. return _POSIX_SPIN_LOCKS, nil
  136. case SC_SPORADIC_SERVER:
  137. return _POSIX_SPORADIC_SERVER, nil
  138. case SC_SYNCHRONIZED_IO:
  139. if _POSIX_SYNCHRONIZED_IO == 0 {
  140. return yesno(sysctl32("p1003_1b.synchronized_io")), nil
  141. }
  142. return _POSIX_SYNCHRONIZED_IO, nil
  143. case SC_THREAD_ATTR_STACKADDR:
  144. return _POSIX_THREAD_ATTR_STACKADDR, nil
  145. case SC_THREAD_ATTR_STACKSIZE:
  146. return _POSIX_THREAD_ATTR_STACKSIZE, nil
  147. case SC_THREAD_CPUTIME:
  148. return _POSIX_THREAD_CPUTIME, nil
  149. case SC_THREAD_PRIORITY_SCHEDULING:
  150. return _POSIX_THREAD_PRIORITY_SCHEDULING, nil
  151. case SC_THREAD_PROCESS_SHARED:
  152. return _POSIX_THREAD_PROCESS_SHARED, nil
  153. case SC_THREAD_SAFE_FUNCTIONS:
  154. return _POSIX_THREAD_SAFE_FUNCTIONS, nil
  155. case SC_TIMERS:
  156. if _POSIX_TIMERS == 0 {
  157. return yesno(sysctl32("p1003_1b.timers")), nil
  158. }
  159. return _POSIX_TIMERS, nil
  160. case SC_TRACE:
  161. return _POSIX_TRACE, nil
  162. case SC_TYPED_MEMORY_OBJECTS:
  163. return _POSIX_TYPED_MEMORY_OBJECTS, nil
  164. case SC_VERSION:
  165. // TODO(tk): FreeBSD libc uses sysctl(CTL_KERN, KERN_POSIX1)
  166. return _POSIX_VERSION, nil
  167. /* TODO(tk): these need GOARCH-dependent integer size checks
  168. case SC_V6_ILP32_OFF32:
  169. return _V6_ILP32_OFF32, nil
  170. case SC_V6_ILP32_OFFBIG:
  171. return _V6_ILP32_OFFBIG, nil
  172. case SC_V6_LP64_OFF64:
  173. return _V6_LP64_OFF64, nil
  174. case SC_V6_LPBIG_OFFBIG:
  175. return _V6_LPBIG_OFFBIG, nil
  176. */
  177. case SC_2_CHAR_TERM:
  178. return _POSIX2_CHAR_TERM, nil
  179. case SC_2_PBS,
  180. SC_2_PBS_ACCOUNTING,
  181. SC_2_PBS_CHECKPOINT,
  182. SC_2_PBS_LOCATE,
  183. SC_2_PBS_MESSAGE,
  184. SC_2_PBS_TRACK:
  185. return _POSIX2_PBS, nil
  186. case SC_2_UPE:
  187. return _POSIX2_UPE, nil
  188. case SC_XOPEN_CRYPT:
  189. return _XOPEN_CRYPT, nil
  190. case SC_XOPEN_ENH_I18N:
  191. return _XOPEN_ENH_I18N, nil
  192. case SC_XOPEN_REALTIME:
  193. return _XOPEN_REALTIME, nil
  194. case SC_XOPEN_REALTIME_THREADS:
  195. return _XOPEN_REALTIME_THREADS, nil
  196. case SC_XOPEN_SHM:
  197. return _XOPEN_SHM, nil
  198. case SC_XOPEN_STREAMS:
  199. return -1, nil
  200. case SC_XOPEN_UNIX:
  201. return _XOPEN_UNIX, nil
  202. case SC_PHYS_PAGES:
  203. if val, err := unix.SysctlUint64("hw.availpages"); err == nil {
  204. return int64(val), nil
  205. }
  206. return -1, nil
  207. case SC_NPROCESSORS_CONF:
  208. fallthrough
  209. case SC_NPROCESSORS_ONLN:
  210. if val, err := unix.SysctlUint32("hw.ncpu"); err == nil {
  211. return int64(val), nil
  212. }
  213. return -1, nil
  214. }
  215. return sysconfGeneric(name)
  216. }