sysconf.c 19 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058
  1. /* Copyright (C) 1991, 93, 95, 96, 97, 2000 Free Software Foundation, Inc.
  2. This file is part of the GNU C Library.
  3. The GNU C Library is free software; you can redistribute it and/or
  4. modify it under the terms of the GNU Library General Public License as
  5. published by the Free Software Foundation; either version 2 of the
  6. License, or (at your option) any later version.
  7. The GNU C Library is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  10. Library General Public License for more details.
  11. You should have received a copy of the GNU Library General Public
  12. License along with the GNU C Library; see the file COPYING.LIB. If not,
  13. write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14. Boston, MA 02111-1307, USA. */
  15. #include <features.h>
  16. #include <errno.h>
  17. #include <limits.h>
  18. #include <grp.h>
  19. #include <pwd.h>
  20. #include <stddef.h>
  21. #include <stdio.h>
  22. #include <time.h>
  23. #include <unistd.h>
  24. #include <sys/sysinfo.h>
  25. #include <sys/types.h>
  26. #include <regex.h>
  27. #ifndef SYSTEM_CLK_TCK
  28. # define SYSTEM_CLK_TCK 100
  29. #endif
  30. extern int getpagesize (void);
  31. extern int getdtablesize (void);
  32. /***********************************************************************/
  33. /*
  34. * Manuel Novoa III Jan 2001
  35. *
  36. * On i386, the switch-based implementation generates 796 bytes of code.
  37. * However, many of the return values are repeats. By collecting these
  38. * repeats and moving to a table-based implementation, we generate 283
  39. * bytes on i386 (-Os -fomit-frame-pointer).
  40. */
  41. #ifndef _UCLIBC_GENERATE_SYSCONF_MAIN
  42. #ifdef _UCLIBC_GENERATE_SYSCONF_ARCH
  43. /*
  44. * Set some errno's so the auto-gen code knows what it is dealing with.
  45. * 1) ENOSYS signifies that we're returning a default value.
  46. * This is just extra info for development.
  47. * 2) EISNAM signifies that the value returned varies at runtime.
  48. *
  49. * Option: GETPAGESIZE_IS_DYNAMIC
  50. * The current implementation of getpagesize in uClibc returns
  51. * a constant. The pagesize on the target arch should not vary,
  52. * so it should be safe to set this as 0.
  53. */
  54. #define RETURN_NEG_1 __set_errno(ENOSYS); return -1
  55. #define RETURN_FUNCTION(f) __set_errno(EISNAM); return (long int) #f
  56. #define GETPAGESIZE_IS_DYNAMIC 0
  57. #else
  58. #define RETURN_NEG_1 return -1
  59. #define RETURN_FUNCTION(f) return f;
  60. #endif /* _UCLIBC_GENERATE_SYSCONF_ARCH */
  61. /* Get the value of the system variable NAME. */
  62. long int __sysconf(int name)
  63. {
  64. switch (name)
  65. {
  66. default:
  67. __set_errno(EINVAL);
  68. return -1;
  69. case _SC_ARG_MAX:
  70. #ifdef ARG_MAX
  71. return ARG_MAX;
  72. #else
  73. RETURN_NEG_1;
  74. #endif
  75. case _SC_CHILD_MAX:
  76. #ifdef CHILD_MAX
  77. return CHILD_MAX;
  78. #else
  79. RETURN_NEG_1;
  80. #endif
  81. case _SC_CLK_TCK:
  82. /* Can't use CLK_TCK here since that calls __sysconf(_SC_CLK_TCK) */
  83. return SYSTEM_CLK_TCK;
  84. case _SC_NGROUPS_MAX:
  85. #ifdef NGROUPS_MAX
  86. return NGROUPS_MAX;
  87. #else
  88. RETURN_NEG_1;
  89. #endif
  90. case _SC_OPEN_MAX:
  91. #if 1
  92. RETURN_FUNCTION(getdtablesize());
  93. #else
  94. RETURN_NEG_1;
  95. #endif
  96. case _SC_STREAM_MAX:
  97. #ifdef STREAM_MAX
  98. return STREAM_MAX;
  99. #else
  100. return FOPEN_MAX;
  101. #endif
  102. case _SC_TZNAME_MAX:
  103. #if 0
  104. RETURN_FUNCTION(tzname_max ());
  105. #else
  106. RETURN_NEG_1;
  107. #endif
  108. case _SC_JOB_CONTROL:
  109. #ifdef _POSIX_JOB_CONTROL
  110. return 1;
  111. #else
  112. RETURN_NEG_1;
  113. #endif
  114. case _SC_SAVED_IDS:
  115. #ifdef _POSIX_SAVED_IDS
  116. return 1;
  117. #else
  118. RETURN_NEG_1;
  119. #endif
  120. case _SC_REALTIME_SIGNALS:
  121. #ifdef _POSIX_REALTIME_SIGNALS
  122. return 1;
  123. #else
  124. RETURN_NEG_1;
  125. #endif
  126. case _SC_PRIORITY_SCHEDULING:
  127. #ifdef _POSIX_PRIORITY_SCHEDULING
  128. return 1;
  129. #else
  130. RETURN_NEG_1;
  131. #endif
  132. case _SC_TIMERS:
  133. #ifdef _POSIX_TIMERS
  134. return 1;
  135. #else
  136. RETURN_NEG_1;
  137. #endif
  138. case _SC_ASYNCHRONOUS_IO:
  139. #ifdef _POSIX_ASYNCHRONOUS_IO
  140. return 1;
  141. #else
  142. RETURN_NEG_1;
  143. #endif
  144. case _SC_PRIORITIZED_IO:
  145. #ifdef _POSIX_PRIORITIZED_IO
  146. return 1;
  147. #else
  148. RETURN_NEG_1;
  149. #endif
  150. case _SC_SYNCHRONIZED_IO:
  151. #ifdef _POSIX_SYNCHRONIZED_IO
  152. return 1;
  153. #else
  154. RETURN_NEG_1;
  155. #endif
  156. case _SC_FSYNC:
  157. #ifdef _POSIX_FSYNC
  158. return 1;
  159. #else
  160. RETURN_NEG_1;
  161. #endif
  162. case _SC_MAPPED_FILES:
  163. #ifdef _POSIX_MAPPED_FILES
  164. return 1;
  165. #else
  166. RETURN_NEG_1;
  167. #endif
  168. case _SC_MEMLOCK:
  169. #ifdef _POSIX_MEMLOCK
  170. return 1;
  171. #else
  172. RETURN_NEG_1;
  173. #endif
  174. case _SC_MEMLOCK_RANGE:
  175. #ifdef _POSIX_MEMLOCK_RANGE
  176. return 1;
  177. #else
  178. RETURN_NEG_1;
  179. #endif
  180. case _SC_MEMORY_PROTECTION:
  181. #ifdef _POSIX_MEMORY_PROTECTION
  182. return 1;
  183. #else
  184. RETURN_NEG_1;
  185. #endif
  186. case _SC_MESSAGE_PASSING:
  187. #ifdef _POSIX_MESSAGE_PASSING
  188. return 1;
  189. #else
  190. RETURN_NEG_1;
  191. #endif
  192. case _SC_SEMAPHORES:
  193. #ifdef _POSIX_SEMAPHORES
  194. return 1;
  195. #else
  196. RETURN_NEG_1;
  197. #endif
  198. case _SC_SHARED_MEMORY_OBJECTS:
  199. #ifdef _POSIX_SHARED_MEMORY_OBJECTS
  200. return 1;
  201. #else
  202. RETURN_NEG_1;
  203. #endif
  204. case _SC_VERSION:
  205. return _POSIX_VERSION;
  206. case _SC_PAGESIZE:
  207. #if defined(GETPAGESIZE_IS_DYNAMIC) && (GETPAGESIZE_IS_DYNAMIC == 1)
  208. RETURN_FUNCTION(getpagesize());
  209. #else
  210. return getpagesize(); /* note: currently this is not dynamic */
  211. #endif
  212. case _SC_AIO_LISTIO_MAX:
  213. #ifdef AIO_LISTIO_MAX
  214. return AIO_LISTIO_MAX;
  215. #else
  216. RETURN_NEG_1;
  217. #endif
  218. case _SC_AIO_MAX:
  219. #ifdef AIO_MAX
  220. return AIO_MAX;
  221. #else
  222. RETURN_NEG_1;
  223. #endif
  224. case _SC_AIO_PRIO_DELTA_MAX:
  225. #ifdef AIO_PRIO_DELTA_MAX
  226. return AIO_PRIO_DELTA_MAX;
  227. #else
  228. RETURN_NEG_1;
  229. #endif
  230. case _SC_DELAYTIMER_MAX:
  231. #ifdef DELAYTIMER_MAX
  232. return DELAYTIMER_MAX;
  233. #else
  234. RETURN_NEG_1;
  235. #endif
  236. case _SC_MQ_OPEN_MAX:
  237. #ifdef MQ_OPEN_MAX
  238. return MQ_OPEN_MAX;
  239. #else
  240. RETURN_NEG_1;
  241. #endif
  242. case _SC_MQ_PRIO_MAX:
  243. #ifdef MQ_PRIO_MAX
  244. return MQ_PRIO_MAX;
  245. #else
  246. RETURN_NEG_1;
  247. #endif
  248. case _SC_RTSIG_MAX:
  249. #ifdef RTSIG_MAX
  250. return RTSIG_MAX;
  251. #else
  252. RETURN_NEG_1;
  253. #endif
  254. case _SC_SEM_NSEMS_MAX:
  255. #ifdef SEM_NSEMS_MAX
  256. return SEM_NSEMS_MAX;
  257. #else
  258. RETURN_NEG_1;
  259. #endif
  260. case _SC_SEM_VALUE_MAX:
  261. #ifdef SEM_VALUE_MAX
  262. return SEM_VALUE_MAX;
  263. #else
  264. RETURN_NEG_1;
  265. #endif
  266. case _SC_SIGQUEUE_MAX:
  267. #ifdef SIGQUEUE_MAX
  268. return SIGQUEUE_MAX;
  269. #else
  270. RETURN_NEG_1;
  271. #endif
  272. case _SC_TIMER_MAX:
  273. #ifdef TIMER_MAX
  274. return TIMER_MAX;
  275. #else
  276. RETURN_NEG_1;
  277. #endif
  278. case _SC_BC_BASE_MAX:
  279. #ifdef BC_BASE_MAX
  280. return BC_BASE_MAX;
  281. #else
  282. RETURN_NEG_1;
  283. #endif
  284. case _SC_BC_DIM_MAX:
  285. #ifdef BC_DIM_MAX
  286. return BC_DIM_MAX;
  287. #else
  288. RETURN_NEG_1;
  289. #endif
  290. case _SC_BC_SCALE_MAX:
  291. #ifdef BC_SCALE_MAX
  292. return BC_SCALE_MAX;
  293. #else
  294. RETURN_NEG_1;
  295. #endif
  296. case _SC_BC_STRING_MAX:
  297. #ifdef BC_STRING_MAX
  298. return BC_STRING_MAX;
  299. #else
  300. RETURN_NEG_1;
  301. #endif
  302. case _SC_COLL_WEIGHTS_MAX:
  303. #ifdef COLL_WEIGHTS_MAX
  304. return COLL_WEIGHTS_MAX;
  305. #else
  306. RETURN_NEG_1;
  307. #endif
  308. case _SC_EQUIV_CLASS_MAX:
  309. #ifdef EQUIV_CLASS_MAX
  310. return EQUIV_CLASS_MAX;
  311. #else
  312. RETURN_NEG_1;
  313. #endif
  314. case _SC_EXPR_NEST_MAX:
  315. #ifdef EXPR_NEST_MAX
  316. return EXPR_NEST_MAX;
  317. #else
  318. RETURN_NEG_1;
  319. #endif
  320. case _SC_LINE_MAX:
  321. #ifdef LINE_MAX
  322. return LINE_MAX;
  323. #else
  324. RETURN_NEG_1;
  325. #endif
  326. case _SC_RE_DUP_MAX:
  327. #ifdef RE_DUP_MAX
  328. return RE_DUP_MAX;
  329. #else
  330. RETURN_NEG_1;
  331. #endif
  332. case _SC_CHARCLASS_NAME_MAX:
  333. #ifdef CHARCLASS_NAME_MAX
  334. return CHARCLASS_NAME_MAX;
  335. #else
  336. RETURN_NEG_1;
  337. #endif
  338. case _SC_PII:
  339. #ifdef _POSIX_PII
  340. return 1;
  341. #else
  342. RETURN_NEG_1;
  343. #endif
  344. case _SC_PII_XTI:
  345. #ifdef _POSIX_PII_XTI
  346. return 1;
  347. #else
  348. RETURN_NEG_1;
  349. #endif
  350. case _SC_PII_SOCKET:
  351. #ifdef _POSIX_PII_SOCKET
  352. return 1;
  353. #else
  354. RETURN_NEG_1;
  355. #endif
  356. case _SC_PII_INTERNET:
  357. #ifdef _POSIX_PII_INTERNET
  358. return 1;
  359. #else
  360. RETURN_NEG_1;
  361. #endif
  362. case _SC_PII_OSI:
  363. #ifdef _POSIX_PII_OSI
  364. return 1;
  365. #else
  366. RETURN_NEG_1;
  367. #endif
  368. case _SC_POLL:
  369. #ifdef _POSIX_POLL
  370. return 1;
  371. #else
  372. RETURN_NEG_1;
  373. #endif
  374. case _SC_SELECT:
  375. #ifdef _POSIX_SELECT
  376. return 1;
  377. #else
  378. RETURN_NEG_1;
  379. #endif
  380. case _SC_UIO_MAXIOV:
  381. #ifdef UIO_MAXIOV
  382. return UIO_MAXIOV;
  383. #else
  384. RETURN_NEG_1;
  385. #endif
  386. case _SC_PII_INTERNET_STREAM:
  387. #ifdef _POSIX_PII_INTERNET_STREAM
  388. return 1;
  389. #else
  390. RETURN_NEG_1;
  391. #endif
  392. case _SC_PII_INTERNET_DGRAM:
  393. #ifdef _POSIX_PII_INTERNET_DGRAM
  394. return 1;
  395. #else
  396. RETURN_NEG_1;
  397. #endif
  398. case _SC_PII_OSI_COTS:
  399. #ifdef _POSIX_PII_OSI_COTS
  400. return 1;
  401. #else
  402. RETURN_NEG_1;
  403. #endif
  404. case _SC_PII_OSI_CLTS:
  405. #ifdef _POSIX_PII_OSI_CLTS
  406. return 1;
  407. #else
  408. RETURN_NEG_1;
  409. #endif
  410. case _SC_PII_OSI_M:
  411. #ifdef _POSIX_PII_OSI_M
  412. return 1;
  413. #else
  414. RETURN_NEG_1;
  415. #endif
  416. case _SC_T_IOV_MAX:
  417. #ifdef _T_IOV_MAX
  418. return _T_IOV_MAX;
  419. #else
  420. RETURN_NEG_1;
  421. #endif
  422. case _SC_2_VERSION:
  423. return _POSIX2_VERSION;
  424. case _SC_2_C_BIND:
  425. #ifdef _POSIX2_C_BIND
  426. return _POSIX2_C_BIND;
  427. #else
  428. RETURN_NEG_1;
  429. #endif
  430. case _SC_2_C_DEV:
  431. #ifdef _POSIX2_C_DEV
  432. return _POSIX2_C_DEV;
  433. #else
  434. RETURN_NEG_1;
  435. #endif
  436. case _SC_2_C_VERSION:
  437. #ifdef _POSIX2_C_VERSION
  438. return _POSIX2_C_VERSION;
  439. #else
  440. RETURN_NEG_1;
  441. #endif
  442. case _SC_2_FORT_DEV:
  443. #ifdef _POSIX2_FORT_DEV
  444. return _POSIX2_FORT_DEV;
  445. #else
  446. RETURN_NEG_1;
  447. #endif
  448. case _SC_2_FORT_RUN:
  449. #ifdef _POSIX2_FORT_RUN
  450. return _POSIX2_FORT_RUN;
  451. #else
  452. RETURN_NEG_1;
  453. #endif
  454. case _SC_2_LOCALEDEF:
  455. #ifdef _POSIX2_LOCALEDEF
  456. return _POSIX2_LOCALEDEF;
  457. #else
  458. RETURN_NEG_1;
  459. #endif
  460. case _SC_2_SW_DEV:
  461. #ifdef _POSIX2_SW_DEV
  462. return _POSIX2_SW_DEV;
  463. #else
  464. RETURN_NEG_1;
  465. #endif
  466. case _SC_2_CHAR_TERM:
  467. #ifdef _POSIX2_CHAR_TERM
  468. return _POSIX2_CHAR_TERM;
  469. #else
  470. RETURN_NEG_1;
  471. #endif
  472. case _SC_2_UPE:
  473. #ifdef _POSIX2_UPE
  474. return _POSIX2_UPE;
  475. #else
  476. RETURN_NEG_1;
  477. #endif
  478. /* POSIX 1003.1c (POSIX Threads). */
  479. case _SC_THREADS:
  480. #ifdef _POSIX_THREADS
  481. return 1;
  482. #else
  483. RETURN_NEG_1;
  484. #endif
  485. case _SC_THREAD_SAFE_FUNCTIONS:
  486. #ifdef _POSIX_THREAD_SAFE_FUNCTIONS
  487. return 1;
  488. #else
  489. RETURN_NEG_1;
  490. #endif
  491. case _SC_GETGR_R_SIZE_MAX:
  492. #ifdef NSS_BUFLEN_GROUP
  493. return NSS_BUFLEN_GROUP;
  494. #else
  495. RETURN_NEG_1;
  496. #endif
  497. case _SC_GETPW_R_SIZE_MAX:
  498. #ifdef NSS_BUFLEN_PASSWD
  499. return NSS_BUFLEN_PASSWD;
  500. #else
  501. RETURN_NEG_1;
  502. #endif
  503. case _SC_LOGIN_NAME_MAX:
  504. #ifdef _POSIX_LOGIN_NAME_MAX
  505. return _POSIX_LOGIN_NAME_MAX;
  506. #else
  507. RETURN_NEG_1;
  508. #endif
  509. case _SC_TTY_NAME_MAX:
  510. #ifdef _POSIX_TTY_NAME_MAX
  511. return _POSIX_TTY_NAME_MAX;
  512. #else
  513. RETURN_NEG_1;
  514. #endif
  515. case _SC_THREAD_DESTRUCTOR_ITERATIONS:
  516. #ifdef _POSIX_THREAD_DESTRUCTOR_ITERATIONS
  517. return _POSIX_THREAD_DESTRUCTOR_ITERATIONS;
  518. #else
  519. RETURN_NEG_1;
  520. #endif
  521. case _SC_THREAD_KEYS_MAX:
  522. #ifdef PTHREAD_KEYS_MAX
  523. return PTHREAD_KEYS_MAX;
  524. #else
  525. RETURN_NEG_1;
  526. #endif
  527. case _SC_THREAD_STACK_MIN:
  528. #ifdef PTHREAD_STACK_MIN
  529. return PTHREAD_STACK_MIN;
  530. #else
  531. RETURN_NEG_1;
  532. #endif
  533. case _SC_THREAD_THREADS_MAX:
  534. #ifdef PTHREAD_THREADS_MAX
  535. return PTHREAD_THREADS_MAX;
  536. #else
  537. RETURN_NEG_1;
  538. #endif
  539. case _SC_THREAD_ATTR_STACKADDR:
  540. #ifdef _POSIX_THREAD_ATTR_STACKADDR
  541. return 1;
  542. #else
  543. RETURN_NEG_1;
  544. #endif
  545. case _SC_THREAD_ATTR_STACKSIZE:
  546. #ifdef _POSIX_THREAD_ATTR_STACKSIZE
  547. return 1;
  548. #else
  549. RETURN_NEG_1;
  550. #endif
  551. case _SC_THREAD_PRIORITY_SCHEDULING:
  552. #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
  553. return 1;
  554. #else
  555. RETURN_NEG_1;
  556. #endif
  557. case _SC_THREAD_PRIO_INHERIT:
  558. #ifdef _POSIX_THREAD_PRIO_INHERIT
  559. return 1;
  560. #else
  561. RETURN_NEG_1;
  562. #endif
  563. case _SC_THREAD_PRIO_PROTECT:
  564. #ifdef _POSIX_THREAD_PRIO_PROTECT
  565. return 1;
  566. #else
  567. RETURN_NEG_1;
  568. #endif
  569. case _SC_THREAD_PROCESS_SHARED:
  570. #ifdef _POSIX_THREAD_PROCESS_SHARED
  571. return 1;
  572. #else
  573. RETURN_NEG_1;
  574. #endif
  575. case _SC_NPROCESSORS_CONF:
  576. #if 0
  577. RETURN_FUNCTION(get_nprocs_conf());
  578. #else
  579. RETURN_NEG_1;
  580. #endif
  581. case _SC_NPROCESSORS_ONLN:
  582. #if 0
  583. RETURN_FUNCTION(get_nprocs());
  584. #else
  585. RETURN_NEG_1;
  586. #endif
  587. case _SC_PHYS_PAGES:
  588. #if 0
  589. RETURN_FUNCTION(get_phys_pages());
  590. #else
  591. RETURN_NEG_1;
  592. #endif
  593. case _SC_AVPHYS_PAGES:
  594. #if 0
  595. RETURN_FUNCTION(get_avphys_pages());
  596. #else
  597. RETURN_NEG_1;
  598. #endif
  599. case _SC_ATEXIT_MAX:
  600. return __UCLIBC_MAX_ATEXIT;
  601. case _SC_PASS_MAX:
  602. /* We have no limit but since the return value might be used to
  603. allocate a buffer we restrict the value. */
  604. return BUFSIZ;
  605. case _SC_XOPEN_VERSION:
  606. return _XOPEN_VERSION;
  607. case _SC_XOPEN_XCU_VERSION:
  608. return _XOPEN_XCU_VERSION;
  609. case _SC_XOPEN_UNIX:
  610. return _XOPEN_UNIX;
  611. case _SC_XOPEN_CRYPT:
  612. #ifdef _XOPEN_CRYPT
  613. return _XOPEN_CRYPT;
  614. #else
  615. RETURN_NEG_1;
  616. #endif
  617. case _SC_XOPEN_ENH_I18N:
  618. #ifdef _XOPEN_ENH_I18N
  619. return _XOPEN_ENH_I18N;
  620. #else
  621. RETURN_NEG_1;
  622. #endif
  623. case _SC_XOPEN_SHM:
  624. #ifdef _XOPEN_SHM
  625. return _XOPEN_SHM;
  626. #else
  627. RETURN_NEG_1;
  628. #endif
  629. case _SC_XOPEN_XPG2:
  630. #ifdef _XOPEN_XPG2
  631. return _XOPEN_XPG2;
  632. #else
  633. RETURN_NEG_1;
  634. #endif
  635. case _SC_XOPEN_XPG3:
  636. #ifdef _XOPEN_XPG3
  637. return _XOPEN_XPG3;
  638. #else
  639. RETURN_NEG_1;
  640. #endif
  641. case _SC_XOPEN_XPG4:
  642. #ifdef _XOPEN_XPG4
  643. return _XOPEN_XPG4;
  644. #else
  645. RETURN_NEG_1;
  646. #endif
  647. case _SC_CHAR_BIT:
  648. return CHAR_BIT;
  649. case _SC_CHAR_MAX:
  650. return CHAR_MAX;
  651. case _SC_CHAR_MIN:
  652. return CHAR_MIN;
  653. case _SC_INT_MAX:
  654. return INT_MAX;
  655. case _SC_INT_MIN:
  656. return INT_MIN;
  657. case _SC_LONG_BIT:
  658. return sizeof (long int) * CHAR_BIT;
  659. case _SC_WORD_BIT:
  660. return sizeof (int) * CHAR_BIT;
  661. case _SC_MB_LEN_MAX:
  662. return MB_LEN_MAX;
  663. case _SC_NZERO:
  664. return NZERO;
  665. case _SC_SSIZE_MAX:
  666. return _POSIX_SSIZE_MAX;
  667. case _SC_SCHAR_MAX:
  668. return SCHAR_MAX;
  669. case _SC_SCHAR_MIN:
  670. return SCHAR_MIN;
  671. case _SC_SHRT_MAX:
  672. return SHRT_MAX;
  673. case _SC_SHRT_MIN:
  674. return SHRT_MIN;
  675. case _SC_UCHAR_MAX:
  676. return UCHAR_MAX;
  677. case _SC_UINT_MAX:
  678. return UINT_MAX;
  679. case _SC_ULONG_MAX:
  680. return ULONG_MAX;
  681. case _SC_USHRT_MAX:
  682. return USHRT_MAX;
  683. case _SC_NL_ARGMAX:
  684. #ifdef NL_ARGMAX
  685. return NL_ARGMAX;
  686. #else
  687. RETURN_NEG_1;
  688. #endif
  689. case _SC_NL_LANGMAX:
  690. #ifdef NL_LANGMAX
  691. return NL_LANGMAX;
  692. #else
  693. RETURN_NEG_1;
  694. #endif
  695. case _SC_NL_MSGMAX:
  696. #ifdef NL_MSGMAX
  697. return NL_MSGMAX;
  698. #else
  699. RETURN_NEG_1;
  700. #endif
  701. case _SC_NL_NMAX:
  702. #ifdef NL_NMAX
  703. return NL_NMAX;
  704. #else
  705. RETURN_NEG_1;
  706. #endif
  707. case _SC_NL_SETMAX:
  708. #ifdef NL_SETMAX
  709. return NL_SETMAX;
  710. #else
  711. RETURN_NEG_1;
  712. #endif
  713. case _SC_NL_TEXTMAX:
  714. #ifdef NL_TEXTMAX
  715. return NL_TEXTMAX;
  716. #else
  717. RETURN_NEG_1;
  718. #endif
  719. case _SC_XBS5_ILP32_OFF32:
  720. #ifdef _XBS5_ILP32_OFF32
  721. return _XBS5_ILP32_OFF32;
  722. #else
  723. RETURN_NEG_1;
  724. #endif
  725. case _SC_XBS5_ILP32_OFFBIG:
  726. #ifdef _XBS5_ILP32_OFFBIG
  727. return _XBS5_ILP32_OFFBIG;
  728. #else
  729. RETURN_NEG_1;
  730. #endif
  731. case _SC_XBS5_LP64_OFF64:
  732. #ifdef _XBS5_LP64_OFF64
  733. return _XBS5_LP64_OFF64;
  734. #else
  735. RETURN_NEG_1;
  736. #endif
  737. case _SC_XBS5_LPBIG_OFFBIG:
  738. #ifdef _XBS5_LPBIG_OFFBIG
  739. return _XBS5_LPBIG_OFFBIG;
  740. #else
  741. RETURN_NEG_1;
  742. #endif
  743. case _SC_XOPEN_LEGACY:
  744. return _XOPEN_LEGACY;
  745. case _SC_XOPEN_REALTIME:
  746. #ifdef _XOPEN_REALTIME
  747. return _XOPEN_REALTIME;
  748. #else
  749. RETURN_NEG_1;
  750. #endif
  751. case _SC_XOPEN_REALTIME_THREADS:
  752. #ifdef _XOPEN_REALTIME_THREADS
  753. return _XOPEN_REALTIME_THREADS;
  754. #else
  755. RETURN_NEG_1;
  756. #endif
  757. }
  758. }
  759. weak_alias(__sysconf, sysconf);
  760. #endif /* _UCLIBC_GENERATE_SYSCONF_MAIN */
  761. /***********************************************************************/
  762. #ifdef _UCLIBC_GENERATE_SYSCONF_MAIN
  763. static long int ret_vals[_UCLIBC_SYSCONF_NUM_VALID_ARGS];
  764. static const char *type_str[] = {
  765. "char", "short", "int", "long"
  766. };
  767. static const char *type_fmt[] = { " %4ld", " %6ld", " %8ld", " %8ld" };
  768. static const int type_mod[] = { 13, 9, 6, 6 };
  769. static int find_or_add_in_table(int index, long int val, int *table,
  770. int *num_in_table, int add_flag)
  771. {
  772. int i;
  773. for (i=0 ; i<*num_in_table ; i++) {
  774. if (ret_vals[table[i]] == val) {
  775. return i;
  776. }
  777. }
  778. if (add_flag) {
  779. table[(*num_in_table)++] = index;
  780. return i;
  781. } else {
  782. return -1;
  783. }
  784. }
  785. int main(void)
  786. {
  787. long int r;
  788. int type_table[5][_UCLIBC_SYSCONF_NUM_VALID_ARGS];
  789. int ret_type[_UCLIBC_SYSCONF_NUM_VALID_ARGS];
  790. int num_type[5];
  791. int i, j, k, code;
  792. for (i=0 ; i<5 ; i++) {
  793. num_type[i] = 0;
  794. }
  795. for (i=0; i<_UCLIBC_SYSCONF_NUM_VALID_ARGS ; i++) {
  796. __set_errno(0);
  797. r = ret_vals[i] = sysconf(i);
  798. switch(errno) {
  799. case EINVAL: /* we're missing a case! */
  800. fprintf(stderr,"sysconf.c is broken! case %d missing!\n", i);
  801. return EXIT_FAILURE;
  802. case EISNAM: /* function */
  803. find_or_add_in_table(i,r,type_table[4],num_type+4,1);
  804. ret_type[i] = 4;
  805. break;
  806. case ENOSYS: /* defaults to -1 */
  807. /* why does this break for shared???? */
  808. fprintf(stderr,"gen_sysconf advisory --"
  809. "case %d defaults to -1\n", i);
  810. /* fall through */
  811. case 0:
  812. if ((r>=CHAR_MIN) && (r<=CHAR_MAX)) {
  813. ret_type[i] = 0;
  814. find_or_add_in_table(i,r,type_table[0],num_type+0,1);
  815. } else if ((r>=SHRT_MIN) && (r<=SHRT_MAX)) {
  816. ret_type[i] = 1;
  817. find_or_add_in_table(i,r,type_table[1],num_type+1,1);
  818. } else if ((r>=INT_MIN) && (r<=INT_MAX)) {
  819. ret_type[i] = 2;
  820. find_or_add_in_table(i,r,type_table[2],num_type+2,1);
  821. } else {
  822. ret_type[i] = 3;
  823. find_or_add_in_table(i,r,type_table[3],num_type+3,1);
  824. }
  825. break;
  826. default:
  827. fprintf(stderr,"sysconf.c is broken! errno = %d!\n", errno);
  828. break;
  829. }
  830. }
  831. printf("#include <errno.h>\n#include <unistd.h>\n#include <limits.h>\n\n");
  832. printf("static const unsigned char index[%d] = {",
  833. _UCLIBC_SYSCONF_NUM_VALID_ARGS);
  834. for (i=0 ; i<_UCLIBC_SYSCONF_NUM_VALID_ARGS ; i++) {
  835. if (i) printf(",");
  836. if (i%15 == 0) printf("\n");
  837. code = 0;
  838. for (j=0 ; j<4 ; j++) {
  839. k = find_or_add_in_table(i,ret_vals[i],type_table[j],num_type+j,0);
  840. if (k>=0) {
  841. code += k;
  842. break;
  843. }
  844. code += num_type[j];
  845. }
  846. printf(" %3d", code);
  847. }
  848. printf("\n};\n\n");
  849. for (j=0 ; j < 4 ; j++) {
  850. if (num_type[j]) {
  851. printf("static const %s %s_vals[%d] = {",
  852. type_str[j], type_str[j], num_type[j]);
  853. for (i = 0 ; i<num_type[j] ; i++) {
  854. if (i) printf(",");
  855. if (i%13 == 0) printf("\n");
  856. if (ret_vals[type_table[j][i]] == INT_MIN) {
  857. printf("%12s","INT_MIN");
  858. } else {
  859. printf(type_fmt[j], ret_vals[type_table[j][i]]);
  860. }
  861. }
  862. printf("\n};\n\n");
  863. }
  864. }
  865. printf("long int sysconf(int name)\n{\n\tint i;\n\n"
  866. "\tif ((name < 0) || (name >= %d)) {\n"
  867. "\t\terrno=EINVAL;\n"
  868. "\t\treturn -1;\n"
  869. "\t}\n\n", _UCLIBC_SYSCONF_NUM_VALID_ARGS);
  870. printf("\ti = index[name];\n\n");
  871. k = 0;
  872. for (i=0 ; i<4 ; i++) {
  873. if (num_type[i]) {
  874. if (k>0) {
  875. printf("\ti -= %d;\n", k);
  876. }
  877. printf("\tif (i < %d) {\n"
  878. "\t\treturn %s_vals[i];\n"
  879. "\t}\n\n",
  880. num_type[i], type_str[i]);
  881. k = num_type[i];
  882. }
  883. }
  884. if (num_type[4]) {
  885. if (k>0) {
  886. printf("\ti -= %d;\n", k);
  887. }
  888. printf("\tswitch(i) {\n");
  889. for (i = 0 ; i<num_type[4] ; i++) {
  890. printf("\t\tcase %d:\n"
  891. "\t\t\treturn %s;\n",
  892. i, (const char *)ret_vals[type_table[4][i]]);
  893. }
  894. printf("\t}\n\n");
  895. }
  896. printf("\treturn -1;\n"
  897. "}\n");
  898. return EXIT_SUCCESS;
  899. }
  900. /***********************************************************************/
  901. #endif