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

/lib/libc/gen/sysconf.c

https://bitbucket.org/gthummalapalle/project3
C | 415 lines | 326 code | 21 blank | 68 comment | 21 complexity | dfdf0e6ada5b52cd57f22e3b10712c04 MD5 | raw file
  1. /* $NetBSD: sysconf.c,v 1.34 2012/08/01 15:24:22 martin Exp $ */
  2. /*-
  3. * Copyright (c) 1993
  4. * The Regents of the University of California. All rights reserved.
  5. *
  6. * This code is derived from software contributed to Berkeley by
  7. * Sean Eric Fagan of Cygnus Support.
  8. *
  9. * Redistribution and use in source and binary forms, with or without
  10. * modification, are permitted provided that the following conditions
  11. * are met:
  12. * 1. Redistributions of source code must retain the above copyright
  13. * notice, this list of conditions and the following disclaimer.
  14. * 2. Redistributions in binary form must reproduce the above copyright
  15. * notice, this list of conditions and the following disclaimer in the
  16. * documentation and/or other materials provided with the distribution.
  17. * 3. Neither the name of the University nor the names of its contributors
  18. * may be used to endorse or promote products derived from this software
  19. * without specific prior written permission.
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31. * SUCH DAMAGE.
  32. */
  33. #include <sys/cdefs.h>
  34. #if defined(LIBC_SCCS) && !defined(lint)
  35. #if 0
  36. static char sccsid[] = "@(#)sysconf.c 8.2 (Berkeley) 3/20/94";
  37. #else
  38. __RCSID("$NetBSD: sysconf.c,v 1.34 2012/08/01 15:24:22 martin Exp $");
  39. #endif
  40. #endif /* LIBC_SCCS and not lint */
  41. #include "namespace.h"
  42. #include <sys/param.h>
  43. #include <sys/sysctl.h>
  44. #include <sys/time.h>
  45. #include <sys/resource.h>
  46. #include <errno.h>
  47. #include <limits.h>
  48. #include <time.h>
  49. #include <unistd.h>
  50. #include <paths.h>
  51. #include <pwd.h>
  52. #ifdef __weak_alias
  53. __weak_alias(sysconf,__sysconf)
  54. #endif
  55. /*
  56. * sysconf --
  57. * get configurable system variables.
  58. *
  59. * XXX
  60. * POSIX 1003.1 (ISO/IEC 9945-1, 4.8.1.3) states that the variable values
  61. * not change during the lifetime of the calling process. This would seem
  62. * to require that any change to system limits kill all running processes.
  63. * A workaround might be to cache the values when they are first retrieved
  64. * and then simply return the cached value on subsequent calls. This is
  65. * less useful than returning up-to-date values, however.
  66. */
  67. long
  68. sysconf(int name)
  69. {
  70. struct rlimit rl;
  71. size_t len;
  72. int mib[CTL_MAXNAME], value;
  73. unsigned int mib_len;
  74. struct clockinfo tmpclock;
  75. static int clk_tck;
  76. len = sizeof(value);
  77. /* Default length of the MIB */
  78. mib_len = 2;
  79. switch (name) {
  80. /* 1003.1 */
  81. case _SC_ARG_MAX:
  82. mib[0] = CTL_KERN;
  83. mib[1] = KERN_ARGMAX;
  84. break;
  85. case _SC_CHILD_MAX:
  86. return (getrlimit(RLIMIT_NPROC, &rl) ? -1 : (long)rl.rlim_cur);
  87. case _O_SC_CLK_TCK:
  88. /*
  89. * For applications compiled when CLK_TCK was a compile-time
  90. * constant.
  91. */
  92. return 100;
  93. case _SC_CLK_TCK:
  94. /*
  95. * Has to be handled specially because it returns a
  96. * struct clockinfo instead of an integer. Also, since
  97. * this might be called often by some things that
  98. * don't grok CLK_TCK can be a macro expanding to a
  99. * function, cache the value.
  100. */
  101. if (clk_tck == 0) {
  102. mib[0] = CTL_KERN;
  103. mib[1] = KERN_CLOCKRATE;
  104. len = sizeof(struct clockinfo);
  105. clk_tck = sysctl(mib, 2, &tmpclock, &len, NULL, 0)
  106. == -1 ? -1 : tmpclock.hz;
  107. }
  108. return(clk_tck);
  109. case _SC_JOB_CONTROL:
  110. mib[0] = CTL_KERN;
  111. mib[1] = KERN_JOB_CONTROL;
  112. goto yesno;
  113. case _SC_NGROUPS_MAX:
  114. mib[0] = CTL_KERN;
  115. mib[1] = KERN_NGROUPS;
  116. break;
  117. case _SC_OPEN_MAX:
  118. return (getrlimit(RLIMIT_NOFILE, &rl) ? -1 : (long)rl.rlim_cur);
  119. case _SC_STREAM_MAX:
  120. mib[0] = CTL_USER;
  121. mib[1] = USER_STREAM_MAX;
  122. break;
  123. case _SC_TZNAME_MAX:
  124. mib[0] = CTL_USER;
  125. mib[1] = USER_TZNAME_MAX;
  126. break;
  127. case _SC_SAVED_IDS:
  128. mib[0] = CTL_KERN;
  129. mib[1] = KERN_SAVED_IDS;
  130. goto yesno;
  131. case _SC_VERSION:
  132. mib[0] = CTL_KERN;
  133. mib[1] = KERN_POSIX1;
  134. break;
  135. /* 1003.1b */
  136. case _SC_PAGESIZE:
  137. return _getpagesize();
  138. case _SC_FSYNC:
  139. mib[0] = CTL_KERN;
  140. mib[1] = KERN_FSYNC;
  141. goto yesno;
  142. case _SC_SYNCHRONIZED_IO:
  143. mib[0] = CTL_KERN;
  144. mib[1] = KERN_SYNCHRONIZED_IO;
  145. goto yesno;
  146. case _SC_MAPPED_FILES:
  147. mib[0] = CTL_KERN;
  148. mib[1] = KERN_MAPPED_FILES;
  149. goto yesno;
  150. case _SC_MEMLOCK:
  151. mib[0] = CTL_KERN;
  152. mib[1] = KERN_MEMLOCK;
  153. goto yesno;
  154. case _SC_MEMLOCK_RANGE:
  155. mib[0] = CTL_KERN;
  156. mib[1] = KERN_MEMLOCK_RANGE;
  157. goto yesno;
  158. case _SC_MEMORY_PROTECTION:
  159. mib[0] = CTL_KERN;
  160. mib[1] = KERN_MEMORY_PROTECTION;
  161. goto yesno;
  162. case _SC_MONOTONIC_CLOCK:
  163. mib[0] = CTL_KERN;
  164. mib[1] = KERN_MONOTONIC_CLOCK;
  165. goto yesno;
  166. case _SC_SEMAPHORES:
  167. mib[0] = CTL_KERN;
  168. mib[1] = KERN_POSIX_SEMAPHORES;
  169. goto yesno;
  170. case _SC_TIMERS:
  171. mib[0] = CTL_KERN;
  172. mib[1] = KERN_POSIX_TIMERS;
  173. goto yesno;
  174. /* 1003.1c */
  175. case _SC_LOGIN_NAME_MAX:
  176. mib[0] = CTL_KERN;
  177. mib[1] = KERN_LOGIN_NAME_MAX;
  178. break;
  179. case _SC_THREADS:
  180. mib[0] = CTL_KERN;
  181. mib[1] = KERN_POSIX_THREADS;
  182. goto yesno;
  183. /* 1003.1j */
  184. case _SC_BARRIERS:
  185. mib[0] = CTL_KERN;
  186. mib[1] = KERN_POSIX_BARRIERS;
  187. goto yesno;
  188. case _SC_SPIN_LOCKS:
  189. mib[0] = CTL_KERN;
  190. mib[1] = KERN_POSIX_SPIN_LOCKS;
  191. goto yesno;
  192. /* Historical; Threads option in 1003.1-2001 */
  193. case _SC_READER_WRITER_LOCKS:
  194. mib[0] = CTL_KERN;
  195. mib[1] = KERN_POSIX_READER_WRITER_LOCKS;
  196. goto yesno;
  197. /* 1003.2 */
  198. case _SC_BC_BASE_MAX:
  199. mib[0] = CTL_USER;
  200. mib[1] = USER_BC_BASE_MAX;
  201. break;
  202. case _SC_BC_DIM_MAX:
  203. mib[0] = CTL_USER;
  204. mib[1] = USER_BC_DIM_MAX;
  205. break;
  206. case _SC_BC_SCALE_MAX:
  207. mib[0] = CTL_USER;
  208. mib[1] = USER_BC_SCALE_MAX;
  209. break;
  210. case _SC_BC_STRING_MAX:
  211. mib[0] = CTL_USER;
  212. mib[1] = USER_BC_STRING_MAX;
  213. break;
  214. case _SC_COLL_WEIGHTS_MAX:
  215. mib[0] = CTL_USER;
  216. mib[1] = USER_COLL_WEIGHTS_MAX;
  217. break;
  218. case _SC_EXPR_NEST_MAX:
  219. mib[0] = CTL_USER;
  220. mib[1] = USER_EXPR_NEST_MAX;
  221. break;
  222. case _SC_LINE_MAX:
  223. mib[0] = CTL_USER;
  224. mib[1] = USER_LINE_MAX;
  225. break;
  226. case _SC_RE_DUP_MAX:
  227. mib[0] = CTL_USER;
  228. mib[1] = USER_RE_DUP_MAX;
  229. break;
  230. case _SC_2_VERSION:
  231. mib[0] = CTL_USER;
  232. mib[1] = USER_POSIX2_VERSION;
  233. break;
  234. case _SC_2_C_BIND:
  235. mib[0] = CTL_USER;
  236. mib[1] = USER_POSIX2_C_BIND;
  237. goto yesno;
  238. case _SC_2_C_DEV:
  239. mib[0] = CTL_USER;
  240. mib[1] = USER_POSIX2_C_DEV;
  241. goto yesno;
  242. case _SC_2_CHAR_TERM:
  243. mib[0] = CTL_USER;
  244. mib[1] = USER_POSIX2_CHAR_TERM;
  245. goto yesno;
  246. case _SC_2_FORT_DEV:
  247. mib[0] = CTL_USER;
  248. mib[1] = USER_POSIX2_FORT_DEV;
  249. goto yesno;
  250. case _SC_2_FORT_RUN:
  251. mib[0] = CTL_USER;
  252. mib[1] = USER_POSIX2_FORT_RUN;
  253. goto yesno;
  254. case _SC_2_LOCALEDEF:
  255. mib[0] = CTL_USER;
  256. mib[1] = USER_POSIX2_LOCALEDEF;
  257. goto yesno;
  258. case _SC_2_SW_DEV:
  259. mib[0] = CTL_USER;
  260. mib[1] = USER_POSIX2_SW_DEV;
  261. goto yesno;
  262. case _SC_2_UPE:
  263. mib[0] = CTL_USER;
  264. mib[1] = USER_POSIX2_UPE;
  265. goto yesno;
  266. /* XPG 4.2 */
  267. case _SC_IOV_MAX:
  268. mib[0] = CTL_KERN;
  269. mib[1] = KERN_IOV_MAX;
  270. break;
  271. case _SC_XOPEN_SHM:
  272. mib[0] = CTL_KERN;
  273. mib[1] = KERN_SYSVIPC;
  274. mib[2] = KERN_SYSVIPC_SHM;
  275. mib_len = 3;
  276. goto yesno;
  277. /* 1003.1-2001, XSI Option Group */
  278. case _SC_AIO_LISTIO_MAX:
  279. if (sysctlgetmibinfo("kern.aio_listio_max", &mib[0], &mib_len,
  280. NULL, NULL, NULL, SYSCTL_VERSION))
  281. return -1;
  282. break;
  283. case _SC_AIO_MAX:
  284. if (sysctlgetmibinfo("kern.aio_max", &mib[0], &mib_len,
  285. NULL, NULL, NULL, SYSCTL_VERSION))
  286. return -1;
  287. break;
  288. case _SC_ASYNCHRONOUS_IO:
  289. if (sysctlgetmibinfo("kern.posix_aio", &mib[0], &mib_len,
  290. NULL, NULL, NULL, SYSCTL_VERSION))
  291. return -1;
  292. goto yesno;
  293. case _SC_MESSAGE_PASSING:
  294. if (sysctlgetmibinfo("kern.posix_msg", &mib[0], &mib_len,
  295. NULL, NULL, NULL, SYSCTL_VERSION))
  296. return -1;
  297. goto yesno;
  298. case _SC_MQ_OPEN_MAX:
  299. if (sysctlgetmibinfo("kern.mqueue.mq_open_max", &mib[0],
  300. &mib_len, NULL, NULL, NULL, SYSCTL_VERSION))
  301. return -1;
  302. break;
  303. case _SC_MQ_PRIO_MAX:
  304. if (sysctlgetmibinfo("kern.mqueue.mq_prio_max", &mib[0],
  305. &mib_len, NULL, NULL, NULL, SYSCTL_VERSION))
  306. return -1;
  307. break;
  308. case _SC_PRIORITY_SCHEDULING:
  309. if (sysctlgetmibinfo("kern.posix_sched", &mib[0], &mib_len,
  310. NULL, NULL, NULL, SYSCTL_VERSION))
  311. return -1;
  312. goto yesno;
  313. case _SC_ATEXIT_MAX:
  314. mib[0] = CTL_USER;
  315. mib[1] = USER_ATEXIT_MAX;
  316. break;
  317. /* 1003.1-2001, TSF */
  318. case _SC_GETGR_R_SIZE_MAX:
  319. return _GETGR_R_SIZE_MAX;
  320. case _SC_GETPW_R_SIZE_MAX:
  321. return _GETPW_R_SIZE_MAX;
  322. /* Unsorted */
  323. case _SC_HOST_NAME_MAX:
  324. return MAXHOSTNAMELEN;
  325. case _SC_PASS_MAX:
  326. return _PASSWORD_LEN;
  327. case _SC_REGEXP:
  328. return _POSIX_REGEXP;
  329. case _SC_SHELL:
  330. return _POSIX_SHELL;
  331. case _SC_SPAWN:
  332. return _POSIX_SPAWN;
  333. case _SC_SYMLOOP_MAX:
  334. return MAXSYMLINKS;
  335. yesno: if (sysctl(mib, mib_len, &value, &len, NULL, 0) == -1)
  336. return (-1);
  337. if (value == 0)
  338. return (-1);
  339. return (value);
  340. /* Extensions */
  341. case _SC_NPROCESSORS_CONF:
  342. mib[0] = CTL_HW;
  343. mib[1] = HW_NCPU;
  344. break;
  345. case _SC_NPROCESSORS_ONLN:
  346. mib[0] = CTL_HW;
  347. mib[1] = HW_NCPUONLINE;
  348. break;
  349. /* Native */
  350. case _SC_SCHED_RT_TS:
  351. if (sysctlgetmibinfo("kern.sched.rtts", &mib[0], &mib_len,
  352. NULL, NULL, NULL, SYSCTL_VERSION))
  353. return -1;
  354. break;
  355. case _SC_SCHED_PRI_MIN:
  356. if (sysctlgetmibinfo("kern.sched.pri_min", &mib[0], &mib_len,
  357. NULL, NULL, NULL, SYSCTL_VERSION))
  358. return -1;
  359. break;
  360. case _SC_SCHED_PRI_MAX:
  361. if (sysctlgetmibinfo("kern.sched.pri_max", &mib[0], &mib_len,
  362. NULL, NULL, NULL, SYSCTL_VERSION))
  363. return -1;
  364. break;
  365. case _SC_THREAD_DESTRUCTOR_ITERATIONS:
  366. return _POSIX_THREAD_DESTRUCTOR_ITERATIONS;
  367. case _SC_THREAD_KEYS_MAX:
  368. return _POSIX_THREAD_KEYS_MAX;
  369. case _SC_THREAD_STACK_MIN:
  370. return _getpagesize();
  371. case _SC_THREAD_THREADS_MAX:
  372. if (sysctlgetmibinfo("kern.maxproc", &mib[0], &mib_len,
  373. NULL, NULL, NULL, SYSCTL_VERSION)) /* XXX */
  374. return -1;
  375. goto yesno;
  376. case _SC_THREAD_ATTR_STACKADDR:
  377. return _POSIX_THREAD_ATTR_STACKADDR;
  378. case _SC_THREAD_ATTR_STACKSIZE:
  379. return _POSIX_THREAD_ATTR_STACKSIZE;
  380. case _SC_THREAD_SAFE_FUNCTIONS:
  381. return _POSIX_THREAD_SAFE_FUNCTIONS;
  382. case _SC_THREAD_PRIORITY_SCHEDULING:
  383. case _SC_THREAD_PRIO_INHERIT:
  384. case _SC_THREAD_PRIO_PROTECT:
  385. case _SC_THREAD_PROCESS_SHARED:
  386. return -1;
  387. case _SC_TTY_NAME_MAX:
  388. return pathconf(_PATH_DEV, _PC_NAME_MAX);
  389. default:
  390. errno = EINVAL;
  391. return (-1);
  392. }
  393. return (sysctl(mib, mib_len, &value, &len, NULL, 0) == -1 ? -1 : value);
  394. }