PageRenderTime 54ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/src/freebsd/lib/libc/gen/sysconf.c

https://bitbucket.org/killerpenguinassassins/open_distrib_devel
C | 617 lines | 532 code | 16 blank | 69 comment | 75 complexity | 055c5d2187237b1b97a7d9807ce8fee7 MD5 | raw file
Possible License(s): CC0-1.0, MIT, LGPL-2.0, LGPL-3.0, WTFPL, GPL-2.0, BSD-2-Clause, AGPL-3.0, CC-BY-SA-3.0, MPL-2.0, JSON, BSD-3-Clause-No-Nuclear-License-2014, LGPL-2.1, CPL-1.0, AGPL-1.0, 0BSD, ISC, Apache-2.0, GPL-3.0, IPL-1.0, MPL-2.0-no-copyleft-exception, BSD-3-Clause
  1. /*-
  2. * Copyright (c) 1993
  3. * The Regents of the University of California. All rights reserved.
  4. *
  5. * This code is derived from software contributed to Berkeley by
  6. * Sean Eric Fagan of Cygnus Support.
  7. *
  8. * Redistribution and use in source and binary forms, with or without
  9. * modification, are permitted provided that the following conditions
  10. * are met:
  11. * 1. Redistributions of source code must retain the above copyright
  12. * notice, this list of conditions and the following disclaimer.
  13. * 2. Redistributions in binary form must reproduce the above copyright
  14. * notice, this list of conditions and the following disclaimer in the
  15. * documentation and/or other materials provided with the distribution.
  16. * 4. Neither the name of the University nor the names of its contributors
  17. * may be used to endorse or promote products derived from this software
  18. * without specific prior written permission.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  21. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  24. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  26. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  27. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  28. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  29. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30. * SUCH DAMAGE.
  31. */
  32. #if defined(LIBC_SCCS) && !defined(lint)
  33. static char sccsid[] = "@(#)sysconf.c 8.2 (Berkeley) 3/20/94";
  34. #endif /* LIBC_SCCS and not lint */
  35. #include <sys/cdefs.h>
  36. __FBSDID("$FreeBSD$");
  37. #include <sys/param.h>
  38. #include <sys/time.h>
  39. #include <sys/sysctl.h>
  40. #include <sys/resource.h>
  41. #include <sys/socket.h>
  42. #include <errno.h>
  43. #include <limits.h>
  44. #include <paths.h>
  45. #include <pthread.h> /* we just need the limits */
  46. #include <time.h>
  47. #include <unistd.h>
  48. #include "../stdlib/atexit.h"
  49. #include "tzfile.h" /* from ../../../contrib/tzcode/stdtime */
  50. #define _PATH_ZONEINFO TZDIR /* from tzfile.h */
  51. /*
  52. * sysconf --
  53. * get configurable system variables.
  54. *
  55. * XXX
  56. * POSIX 1003.1 (ISO/IEC 9945-1, 4.8.1.3) states that the variable values
  57. * not change during the lifetime of the calling process. This would seem
  58. * to require that any change to system limits kill all running processes.
  59. * A workaround might be to cache the values when they are first retrieved
  60. * and then simply return the cached value on subsequent calls. This is
  61. * less useful than returning up-to-date values, however.
  62. */
  63. long
  64. sysconf(name)
  65. int name;
  66. {
  67. struct rlimit rl;
  68. size_t len;
  69. int mib[2], sverrno, value;
  70. long lvalue, defaultresult;
  71. const char *path;
  72. defaultresult = -1;
  73. switch (name) {
  74. case _SC_ARG_MAX:
  75. mib[0] = CTL_KERN;
  76. mib[1] = KERN_ARGMAX;
  77. break;
  78. case _SC_CHILD_MAX:
  79. if (getrlimit(RLIMIT_NPROC, &rl) != 0)
  80. return (-1);
  81. if (rl.rlim_cur == RLIM_INFINITY)
  82. return (-1);
  83. if (rl.rlim_cur > LONG_MAX) {
  84. errno = EOVERFLOW;
  85. return (-1);
  86. }
  87. return ((long)rl.rlim_cur);
  88. case _SC_CLK_TCK:
  89. return (CLK_TCK);
  90. case _SC_NGROUPS_MAX:
  91. mib[0] = CTL_KERN;
  92. mib[1] = KERN_NGROUPS;
  93. break;
  94. case _SC_OPEN_MAX:
  95. if (getrlimit(RLIMIT_NOFILE, &rl) != 0)
  96. return (-1);
  97. if (rl.rlim_cur == RLIM_INFINITY)
  98. return (-1);
  99. if (rl.rlim_cur > LONG_MAX) {
  100. errno = EOVERFLOW;
  101. return (-1);
  102. }
  103. return ((long)rl.rlim_cur);
  104. case _SC_STREAM_MAX:
  105. if (getrlimit(RLIMIT_NOFILE, &rl) != 0)
  106. return (-1);
  107. if (rl.rlim_cur == RLIM_INFINITY)
  108. return (-1);
  109. if (rl.rlim_cur > LONG_MAX) {
  110. errno = EOVERFLOW;
  111. return (-1);
  112. }
  113. /*
  114. * struct __sFILE currently has a limitation that
  115. * file descriptors must fit in a signed short.
  116. * This doesn't precisely capture the letter of POSIX
  117. * but approximates the spirit.
  118. */
  119. if (rl.rlim_cur > SHRT_MAX)
  120. return (SHRT_MAX);
  121. return ((long)rl.rlim_cur);
  122. case _SC_JOB_CONTROL:
  123. return (_POSIX_JOB_CONTROL);
  124. case _SC_SAVED_IDS:
  125. /* XXX - must be 1 */
  126. mib[0] = CTL_KERN;
  127. mib[1] = KERN_SAVED_IDS;
  128. goto yesno;
  129. case _SC_VERSION:
  130. mib[0] = CTL_KERN;
  131. mib[1] = KERN_POSIX1;
  132. break;
  133. case _SC_BC_BASE_MAX:
  134. return (BC_BASE_MAX);
  135. case _SC_BC_DIM_MAX:
  136. return (BC_DIM_MAX);
  137. case _SC_BC_SCALE_MAX:
  138. return (BC_SCALE_MAX);
  139. case _SC_BC_STRING_MAX:
  140. return (BC_STRING_MAX);
  141. case _SC_COLL_WEIGHTS_MAX:
  142. return (COLL_WEIGHTS_MAX);
  143. case _SC_EXPR_NEST_MAX:
  144. return (EXPR_NEST_MAX);
  145. case _SC_LINE_MAX:
  146. return (LINE_MAX);
  147. case _SC_RE_DUP_MAX:
  148. return (RE_DUP_MAX);
  149. case _SC_2_VERSION:
  150. /*
  151. * This is something of a lie, but it would be silly at
  152. * this point to try to deduce this from the contents
  153. * of the filesystem.
  154. */
  155. return (_POSIX2_VERSION);
  156. case _SC_2_C_BIND:
  157. return (_POSIX2_C_BIND);
  158. case _SC_2_C_DEV:
  159. return (_POSIX2_C_DEV);
  160. case _SC_2_CHAR_TERM:
  161. return (_POSIX2_CHAR_TERM);
  162. case _SC_2_FORT_DEV:
  163. return (_POSIX2_FORT_DEV);
  164. case _SC_2_FORT_RUN:
  165. return (_POSIX2_FORT_RUN);
  166. case _SC_2_LOCALEDEF:
  167. return (_POSIX2_LOCALEDEF);
  168. case _SC_2_SW_DEV:
  169. return (_POSIX2_SW_DEV);
  170. case _SC_2_UPE:
  171. return (_POSIX2_UPE);
  172. case _SC_TZNAME_MAX:
  173. path = _PATH_ZONEINFO;
  174. do_NAME_MAX:
  175. sverrno = errno;
  176. errno = 0;
  177. lvalue = pathconf(path, _PC_NAME_MAX);
  178. if (lvalue == -1 && errno != 0)
  179. return (-1);
  180. errno = sverrno;
  181. return (lvalue);
  182. case _SC_ASYNCHRONOUS_IO:
  183. #if _POSIX_ASYNCHRONOUS_IO == 0
  184. mib[0] = CTL_P1003_1B;
  185. mib[1] = CTL_P1003_1B_ASYNCHRONOUS_IO;
  186. break;
  187. #else
  188. return (_POSIX_ASYNCHRONOUS_IO);
  189. #endif
  190. case _SC_MAPPED_FILES:
  191. return (_POSIX_MAPPED_FILES);
  192. case _SC_MEMLOCK:
  193. return (_POSIX_MEMLOCK);
  194. case _SC_MEMLOCK_RANGE:
  195. return (_POSIX_MEMLOCK_RANGE);
  196. case _SC_MEMORY_PROTECTION:
  197. return (_POSIX_MEMORY_PROTECTION);
  198. case _SC_MESSAGE_PASSING:
  199. #if _POSIX_MESSAGE_PASSING == 0
  200. mib[0] = CTL_P1003_1B;
  201. mib[1] = CTL_P1003_1B_MESSAGE_PASSING;
  202. goto yesno;
  203. #else
  204. return (_POSIX_MESSAGE_PASSING);
  205. #endif
  206. case _SC_PRIORITIZED_IO:
  207. #if _POSIX_PRIORITIZED_IO == 0
  208. mib[0] = CTL_P1003_1B;
  209. mib[1] = CTL_P1003_1B_PRIORITIZED_IO;
  210. goto yesno;
  211. #else
  212. return (_POSIX_PRIORITIZED_IO);
  213. #endif
  214. case _SC_PRIORITY_SCHEDULING:
  215. #if _POSIX_PRIORITY_SCHEDULING == 0
  216. mib[0] = CTL_P1003_1B;
  217. mib[1] = CTL_P1003_1B_PRIORITY_SCHEDULING;
  218. goto yesno;
  219. #else
  220. return (_POSIX_PRIORITY_SCHEDULING);
  221. #endif
  222. case _SC_REALTIME_SIGNALS:
  223. #if _POSIX_REALTIME_SIGNALS == 0
  224. mib[0] = CTL_P1003_1B;
  225. mib[1] = CTL_P1003_1B_REALTIME_SIGNALS;
  226. goto yesno;
  227. #else
  228. return (_POSIX_REALTIME_SIGNALS);
  229. #endif
  230. case _SC_SEMAPHORES:
  231. #if _POSIX_SEMAPHORES == 0
  232. mib[0] = CTL_P1003_1B;
  233. mib[1] = CTL_P1003_1B_SEMAPHORES;
  234. goto yesno;
  235. #else
  236. return (_POSIX_SEMAPHORES);
  237. #endif
  238. case _SC_FSYNC:
  239. return (_POSIX_FSYNC);
  240. case _SC_SHARED_MEMORY_OBJECTS:
  241. return (_POSIX_SHARED_MEMORY_OBJECTS);
  242. case _SC_SYNCHRONIZED_IO:
  243. #if _POSIX_SYNCHRONIZED_IO == 0
  244. mib[0] = CTL_P1003_1B;
  245. mib[1] = CTL_P1003_1B_SYNCHRONIZED_IO;
  246. goto yesno;
  247. #else
  248. return (_POSIX_SYNCHRONIZED_IO);
  249. #endif
  250. case _SC_TIMERS:
  251. #if _POSIX_TIMERS == 0
  252. mib[0] = CTL_P1003_1B;
  253. mib[1] = CTL_P1003_1B_TIMERS;
  254. goto yesno;
  255. #else
  256. return (_POSIX_TIMERS);
  257. #endif
  258. case _SC_AIO_LISTIO_MAX:
  259. mib[0] = CTL_P1003_1B;
  260. mib[1] = CTL_P1003_1B_AIO_LISTIO_MAX;
  261. break;
  262. case _SC_AIO_MAX:
  263. mib[0] = CTL_P1003_1B;
  264. mib[1] = CTL_P1003_1B_AIO_MAX;
  265. break;
  266. case _SC_AIO_PRIO_DELTA_MAX:
  267. mib[0] = CTL_P1003_1B;
  268. mib[1] = CTL_P1003_1B_AIO_PRIO_DELTA_MAX;
  269. break;
  270. case _SC_DELAYTIMER_MAX:
  271. mib[0] = CTL_P1003_1B;
  272. mib[1] = CTL_P1003_1B_DELAYTIMER_MAX;
  273. goto yesno;
  274. case _SC_MQ_OPEN_MAX:
  275. mib[0] = CTL_P1003_1B;
  276. mib[1] = CTL_P1003_1B_MQ_OPEN_MAX;
  277. goto yesno;
  278. case _SC_PAGESIZE:
  279. defaultresult = getpagesize();
  280. mib[0] = CTL_P1003_1B;
  281. mib[1] = CTL_P1003_1B_PAGESIZE;
  282. goto yesno;
  283. case _SC_RTSIG_MAX:
  284. mib[0] = CTL_P1003_1B;
  285. mib[1] = CTL_P1003_1B_RTSIG_MAX;
  286. goto yesno;
  287. case _SC_SEM_NSEMS_MAX:
  288. mib[0] = CTL_P1003_1B;
  289. mib[1] = CTL_P1003_1B_SEM_NSEMS_MAX;
  290. goto yesno;
  291. case _SC_SEM_VALUE_MAX:
  292. mib[0] = CTL_P1003_1B;
  293. mib[1] = CTL_P1003_1B_SEM_VALUE_MAX;
  294. goto yesno;
  295. case _SC_SIGQUEUE_MAX:
  296. mib[0] = CTL_P1003_1B;
  297. mib[1] = CTL_P1003_1B_SIGQUEUE_MAX;
  298. goto yesno;
  299. case _SC_TIMER_MAX:
  300. mib[0] = CTL_P1003_1B;
  301. mib[1] = CTL_P1003_1B_TIMER_MAX;
  302. yesno:
  303. len = sizeof(value);
  304. if (sysctl(mib, 2, &value, &len, NULL, 0) == -1)
  305. return (-1);
  306. if (value == 0)
  307. return (defaultresult);
  308. return ((long)value);
  309. case _SC_2_PBS:
  310. case _SC_2_PBS_ACCOUNTING:
  311. case _SC_2_PBS_CHECKPOINT:
  312. case _SC_2_PBS_LOCATE:
  313. case _SC_2_PBS_MESSAGE:
  314. case _SC_2_PBS_TRACK:
  315. #if _POSIX2_PBS == 0
  316. #error "don't know how to determine _SC_2_PBS"
  317. /*
  318. * This probably requires digging through the filesystem
  319. * to see if the appropriate package has been installed.
  320. * Since we don't currently support this option at all,
  321. * it's not worth the effort to write the code now.
  322. * Figuring out which of the sub-options are supported
  323. * would be even more difficult, so it's probably easier
  324. * to always say ``no''.
  325. */
  326. #else
  327. return (_POSIX2_PBS);
  328. #endif
  329. case _SC_ADVISORY_INFO:
  330. #if _POSIX_ADVISORY_INFO == 0
  331. #error "_POSIX_ADVISORY_INFO"
  332. #else
  333. return (_POSIX_ADVISORY_INFO);
  334. #endif
  335. case _SC_BARRIERS:
  336. #if _POSIX_BARRIERS == 0
  337. #error "_POSIX_BARRIERS"
  338. #else
  339. return (_POSIX_BARRIERS);
  340. #endif
  341. case _SC_CLOCK_SELECTION:
  342. #if _POSIX_CLOCK_SELECTION == 0
  343. #error "_POSIX_CLOCK_SELECTION"
  344. #else
  345. return (_POSIX_CLOCK_SELECTION);
  346. #endif
  347. case _SC_CPUTIME:
  348. #if _POSIX_CPUTIME == 0
  349. #error "_POSIX_CPUTIME"
  350. #else
  351. return (_POSIX_CPUTIME);
  352. #endif
  353. #ifdef notdef
  354. case _SC_FILE_LOCKING:
  355. /*
  356. * XXX - The standard doesn't tell us how to define
  357. * _POSIX_FILE_LOCKING, so we can't answer this one.
  358. */
  359. #endif
  360. #if _POSIX_THREAD_SAFE_FUNCTIONS > -1
  361. case _SC_GETGR_R_SIZE_MAX:
  362. case _SC_GETPW_R_SIZE_MAX:
  363. #error "somebody needs to implement this"
  364. #endif
  365. case _SC_HOST_NAME_MAX:
  366. return (MAXHOSTNAMELEN - 1); /* does not include \0 */
  367. case _SC_LOGIN_NAME_MAX:
  368. return (MAXLOGNAME);
  369. case _SC_MONOTONIC_CLOCK:
  370. #if _POSIX_MONOTONIC_CLOCK == 0
  371. #error "_POSIX_MONOTONIC_CLOCK"
  372. #else
  373. return (_POSIX_MONOTONIC_CLOCK);
  374. #endif
  375. #if _POSIX_MESSAGE_PASSING > -1
  376. case _SC_MQ_PRIO_MAX:
  377. return (MQ_PRIO_MAX);
  378. #endif
  379. case _SC_READER_WRITER_LOCKS:
  380. return (_POSIX_READER_WRITER_LOCKS);
  381. case _SC_REGEXP:
  382. return (_POSIX_REGEXP);
  383. case _SC_SHELL:
  384. return (_POSIX_SHELL);
  385. case _SC_SPAWN:
  386. return (_POSIX_SPAWN);
  387. case _SC_SPIN_LOCKS:
  388. return (_POSIX_SPIN_LOCKS);
  389. case _SC_SPORADIC_SERVER:
  390. #if _POSIX_SPORADIC_SERVER == 0
  391. #error "_POSIX_SPORADIC_SERVER"
  392. #else
  393. return (_POSIX_SPORADIC_SERVER);
  394. #endif
  395. case _SC_THREAD_ATTR_STACKADDR:
  396. return (_POSIX_THREAD_ATTR_STACKADDR);
  397. case _SC_THREAD_ATTR_STACKSIZE:
  398. return (_POSIX_THREAD_ATTR_STACKSIZE);
  399. case _SC_THREAD_CPUTIME:
  400. return (_POSIX_THREAD_CPUTIME);
  401. case _SC_THREAD_DESTRUCTOR_ITERATIONS:
  402. return (PTHREAD_DESTRUCTOR_ITERATIONS);
  403. case _SC_THREAD_KEYS_MAX:
  404. return (PTHREAD_KEYS_MAX);
  405. case _SC_THREAD_PRIO_INHERIT:
  406. return (_POSIX_THREAD_PRIO_INHERIT);
  407. case _SC_THREAD_PRIO_PROTECT:
  408. return (_POSIX_THREAD_PRIO_PROTECT);
  409. case _SC_THREAD_PRIORITY_SCHEDULING:
  410. return (_POSIX_THREAD_PRIORITY_SCHEDULING);
  411. case _SC_THREAD_PROCESS_SHARED:
  412. return (_POSIX_THREAD_PROCESS_SHARED);
  413. case _SC_THREAD_SAFE_FUNCTIONS:
  414. return (_POSIX_THREAD_SAFE_FUNCTIONS);
  415. case _SC_THREAD_STACK_MIN:
  416. return (PTHREAD_STACK_MIN);
  417. case _SC_THREAD_THREADS_MAX:
  418. return (PTHREAD_THREADS_MAX); /* XXX wrong type! */
  419. case _SC_TIMEOUTS:
  420. return (_POSIX_TIMEOUTS);
  421. case _SC_THREADS:
  422. return (_POSIX_THREADS);
  423. case _SC_TRACE:
  424. #if _POSIX_TRACE == 0
  425. #error "_POSIX_TRACE"
  426. /* While you're implementing this, also do the ones below. */
  427. #else
  428. return (_POSIX_TRACE);
  429. #endif
  430. #if _POSIX_TRACE > -1
  431. case _SC_TRACE_EVENT_FILTER:
  432. return (_POSIX_TRACE_EVENT_FILTER);
  433. case _SC_TRACE_INHERIT:
  434. return (_POSIX_TRACE_INHERIT);
  435. case _SC_TRACE_LOG:
  436. return (_POSIX_TRACE_LOG);
  437. #endif
  438. case _SC_TTY_NAME_MAX:
  439. path = _PATH_DEV;
  440. goto do_NAME_MAX;
  441. case _SC_TYPED_MEMORY_OBJECTS:
  442. #if _POSIX_TYPED_MEMORY_OBJECTS == 0
  443. #error "_POSIX_TYPED_MEMORY_OBJECTS"
  444. #else
  445. return (_POSIX_TYPED_MEMORY_OBJECTS);
  446. #endif
  447. case _SC_V6_ILP32_OFF32:
  448. #if _V6_ILP32_OFF32 == 0
  449. if (sizeof(int) * CHAR_BIT == 32 &&
  450. sizeof(int) == sizeof(long) &&
  451. sizeof(long) == sizeof(void *) &&
  452. sizeof(void *) == sizeof(off_t))
  453. return 1;
  454. else
  455. return -1;
  456. #else
  457. return (_V6_ILP32_OFF32);
  458. #endif
  459. case _SC_V6_ILP32_OFFBIG:
  460. #if _V6_ILP32_OFFBIG == 0
  461. if (sizeof(int) * CHAR_BIT == 32 &&
  462. sizeof(int) == sizeof(long) &&
  463. sizeof(long) == sizeof(void *) &&
  464. sizeof(off_t) * CHAR_BIT >= 64)
  465. return 1;
  466. else
  467. return -1;
  468. #else
  469. return (_V6_ILP32_OFFBIG);
  470. #endif
  471. case _SC_V6_LP64_OFF64:
  472. #if _V6_LP64_OFF64 == 0
  473. if (sizeof(int) * CHAR_BIT == 32 &&
  474. sizeof(long) * CHAR_BIT == 64 &&
  475. sizeof(long) == sizeof(void *) &&
  476. sizeof(void *) == sizeof(off_t))
  477. return 1;
  478. else
  479. return -1;
  480. #else
  481. return (_V6_LP64_OFF64);
  482. #endif
  483. case _SC_V6_LPBIG_OFFBIG:
  484. #if _V6_LPBIG_OFFBIG == 0
  485. if (sizeof(int) * CHAR_BIT >= 32 &&
  486. sizeof(long) * CHAR_BIT >= 64 &&
  487. sizeof(void *) * CHAR_BIT >= 64 &&
  488. sizeof(off_t) * CHAR_BIT >= 64)
  489. return 1;
  490. else
  491. return -1;
  492. #else
  493. return (_V6_LPBIG_OFFBIG);
  494. #endif
  495. case _SC_ATEXIT_MAX:
  496. return (ATEXIT_SIZE);
  497. case _SC_IOV_MAX:
  498. mib[0] = CTL_KERN;
  499. mib[1] = KERN_IOV_MAX;
  500. break;
  501. case _SC_XOPEN_CRYPT:
  502. return (_XOPEN_CRYPT);
  503. case _SC_XOPEN_ENH_I18N:
  504. return (_XOPEN_ENH_I18N);
  505. case _SC_XOPEN_LEGACY:
  506. return (_XOPEN_LEGACY);
  507. case _SC_XOPEN_REALTIME:
  508. #if _XOPEN_REALTIME == 0
  509. sverrno = errno;
  510. value = sysconf(_SC_ASYNCHRONOUS_IO) > 0 &&
  511. sysconf(_SC_MEMLOCK) > 0 &&
  512. sysconf(_SC_MEMLOCK_RANGE) > 0 &&
  513. sysconf(_SC_MESSAGE_PASSING) > 0 &&
  514. sysconf(_SC_PRIORITY_SCHEDULING) > 0 &&
  515. sysconf(_SC_REALTIME_SIGNALS) > 0 &&
  516. sysconf(_SC_SEMAPHORES) > 0 &&
  517. sysconf(_SC_SHARED_MEMORY_OBJECTS) > 0 &&
  518. sysconf(_SC_SYNCHRONIZED_IO) > 0 &&
  519. sysconf(_SC_TIMERS) > 0;
  520. errno = sverrno;
  521. if (value)
  522. return (200112L);
  523. else
  524. return (-1);
  525. #else
  526. return (_XOPEN_REALTIME);
  527. #endif
  528. case _SC_XOPEN_REALTIME_THREADS:
  529. #if _XOPEN_REALTIME_THREADS == 0
  530. #error "_XOPEN_REALTIME_THREADS"
  531. #else
  532. return (_XOPEN_REALTIME_THREADS);
  533. #endif
  534. case _SC_XOPEN_SHM:
  535. len = sizeof(lvalue);
  536. sverrno = errno;
  537. if (sysctlbyname("kern.ipc.shmmin", &lvalue, &len, NULL,
  538. 0) == -1) {
  539. errno = sverrno;
  540. return (-1);
  541. }
  542. errno = sverrno;
  543. return (1);
  544. case _SC_XOPEN_STREAMS:
  545. return (_XOPEN_STREAMS);
  546. case _SC_XOPEN_UNIX:
  547. return (_XOPEN_UNIX);
  548. #ifdef _XOPEN_VERSION
  549. case _SC_XOPEN_VERSION:
  550. return (_XOPEN_VERSION);
  551. #endif
  552. #ifdef _XOPEN_XCU_VERSION
  553. case _SC_XOPEN_XCU_VERSION:
  554. return (_XOPEN_XCU_VERSION);
  555. #endif
  556. case _SC_SYMLOOP_MAX:
  557. return (MAXSYMLINKS);
  558. case _SC_RAW_SOCKETS:
  559. return (_POSIX_RAW_SOCKETS);
  560. case _SC_IPV6:
  561. #if _POSIX_IPV6 == 0
  562. sverrno = errno;
  563. value = socket(PF_INET6, SOCK_DGRAM, 0);
  564. errno = sverrno;
  565. if (value >= 0) {
  566. close(value);
  567. return (200112L);
  568. } else
  569. return (0);
  570. #else
  571. return (_POSIX_IPV6);
  572. #endif
  573. case _SC_NPROCESSORS_CONF:
  574. case _SC_NPROCESSORS_ONLN:
  575. mib[0] = CTL_HW;
  576. mib[1] = HW_NCPU;
  577. break;
  578. #ifdef _SC_PHYS_PAGES
  579. case _SC_PHYS_PAGES:
  580. len = sizeof(lvalue);
  581. if (sysctlbyname("hw.availpages", &lvalue, &len, NULL, 0) == -1)
  582. return (-1);
  583. return (lvalue);
  584. #endif
  585. #ifdef _SC_CPUSET_SIZE
  586. case _SC_CPUSET_SIZE:
  587. len = sizeof(value);
  588. if (sysctlbyname("kern.sched.cpusetsize", &value, &len, NULL,
  589. 0) == -1)
  590. return (-1);
  591. return ((long)value);
  592. #endif
  593. default:
  594. errno = EINVAL;
  595. return (-1);
  596. }
  597. len = sizeof(value);
  598. if (sysctl(mib, 2, &value, &len, NULL, 0) == -1)
  599. value = -1;
  600. return ((long)value);
  601. }