1 /* Copyright (C) 1991, 93, 95, 96, 97, 2000 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB. If not,
16 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 Boston, MA 02111-1307, USA. */
19 #define _XOPEN_SOURCE 500
30 #include <sys/sysinfo.h>
31 #include <sys/types.h>
34 #ifndef __UCLIBC_CLK_TCK_CONST
35 #error __UCLIBC_CLK_TCK_CONST not defined!
38 extern int getpagesize (void);
39 extern int getdtablesize (void);
41 /***********************************************************************/
43 * Manuel Novoa III Jan 2001
45 * On i386, the switch-based implementation generates 796 bytes of code.
46 * However, many of the return values are repeats. By collecting these
47 * repeats and moving to a table-based implementation, we generate 283
48 * bytes on i386 (-Os -fomit-frame-pointer).
50 #ifndef _UCLIBC_GENERATE_SYSCONF_MAIN
52 #ifdef _UCLIBC_GENERATE_SYSCONF_ARCH
54 * Set some errno's so the auto-gen code knows what it is dealing with.
55 * 1) ENOSYS signifies that we're returning a default value.
56 * This is just extra info for development.
57 * 2) EISNAM signifies that the value returned varies at runtime.
59 * Option: GETPAGESIZE_IS_DYNAMIC
60 * The current implementation of getpagesize in uClibc returns
61 * a constant. The pagesize on the target arch should not vary,
62 * so it should be safe to set this as 0.
64 #define RETURN_NEG_1 __set_errno(ENOSYS); return -1
65 #define RETURN_FUNCTION(f) __set_errno(EISNAM); return (long int) #f
66 #define GETPAGESIZE_IS_DYNAMIC 0
68 #define RETURN_NEG_1 return -1
69 #define RETURN_FUNCTION(f) return f;
70 #endif /* _UCLIBC_GENERATE_SYSCONF_ARCH */
72 /* Get the value of the system variable NAME. */
73 long int __sysconf(int name)
96 /* Can't use CLK_TCK here since that calls __sysconf(_SC_CLK_TCK) */
97 return __UCLIBC_CLK_TCK_CONST;
108 RETURN_FUNCTION(getdtablesize());
122 RETURN_FUNCTION(tzname_max ());
125 return _POSIX_TZNAME_MAX;
128 case _SC_JOB_CONTROL:
129 #ifdef _POSIX_JOB_CONTROL
136 #ifdef _POSIX_SAVED_IDS
142 case _SC_REALTIME_SIGNALS:
143 #ifdef _POSIX_REALTIME_SIGNALS
149 case _SC_PRIORITY_SCHEDULING:
150 #ifdef _POSIX_PRIORITY_SCHEDULING
163 case _SC_ASYNCHRONOUS_IO:
164 #ifdef _POSIX_ASYNCHRONOUS_IO
170 case _SC_PRIORITIZED_IO:
171 #ifdef _POSIX_PRIORITIZED_IO
177 case _SC_SYNCHRONIZED_IO:
178 #ifdef _POSIX_SYNCHRONIZED_IO
191 case _SC_MAPPED_FILES:
192 #ifdef _POSIX_MAPPED_FILES
199 #ifdef _POSIX_MEMLOCK
205 case _SC_MEMLOCK_RANGE:
206 #ifdef _POSIX_MEMLOCK_RANGE
212 case _SC_MEMORY_PROTECTION:
213 #ifdef _POSIX_MEMORY_PROTECTION
219 case _SC_MESSAGE_PASSING:
220 #ifdef _POSIX_MESSAGE_PASSING
227 #ifdef _POSIX_SEMAPHORES
233 case _SC_SHARED_MEMORY_OBJECTS:
234 #ifdef _POSIX_SHARED_MEMORY_OBJECTS
241 return _POSIX_VERSION;
244 #if defined(GETPAGESIZE_IS_DYNAMIC) && (GETPAGESIZE_IS_DYNAMIC == 1)
245 RETURN_FUNCTION(getpagesize());
247 return getpagesize(); /* note: currently this is not dynamic */
250 case _SC_AIO_LISTIO_MAX:
251 #ifdef AIO_LISTIO_MAX
252 return AIO_LISTIO_MAX;
264 case _SC_AIO_PRIO_DELTA_MAX:
265 #ifdef AIO_PRIO_DELTA_MAX
266 return AIO_PRIO_DELTA_MAX;
271 case _SC_DELAYTIMER_MAX:
272 #ifdef DELAYTIMER_MAX
273 return DELAYTIMER_MAX;
278 case _SC_MQ_OPEN_MAX:
285 case _SC_MQ_PRIO_MAX:
299 case _SC_SEM_NSEMS_MAX:
301 return SEM_NSEMS_MAX;
306 case _SC_SEM_VALUE_MAX:
308 return SEM_VALUE_MAX;
313 case _SC_SIGQUEUE_MAX:
327 case _SC_BC_BASE_MAX:
341 case _SC_BC_SCALE_MAX:
348 case _SC_BC_STRING_MAX:
350 return BC_STRING_MAX;
355 case _SC_COLL_WEIGHTS_MAX:
356 #ifdef COLL_WEIGHTS_MAX
357 return COLL_WEIGHTS_MAX;
362 case _SC_EQUIV_CLASS_MAX:
363 #ifdef EQUIV_CLASS_MAX
364 return EQUIV_CLASS_MAX;
369 case _SC_EXPR_NEST_MAX:
371 return EXPR_NEST_MAX;
390 case _SC_CHARCLASS_NAME_MAX:
391 #ifdef CHARCLASS_NAME_MAX
392 return CHARCLASS_NAME_MAX;
405 #ifdef _POSIX_PII_XTI
412 #ifdef _POSIX_PII_SOCKET
418 case _SC_PII_INTERNET:
419 #ifdef _POSIX_PII_INTERNET
426 #ifdef _POSIX_PII_OSI
453 case _SC_PII_INTERNET_STREAM:
454 #ifdef _POSIX_PII_INTERNET_STREAM
460 case _SC_PII_INTERNET_DGRAM:
461 #ifdef _POSIX_PII_INTERNET_DGRAM
467 case _SC_PII_OSI_COTS:
468 #ifdef _POSIX_PII_OSI_COTS
474 case _SC_PII_OSI_CLTS:
475 #ifdef _POSIX_PII_OSI_CLTS
482 #ifdef _POSIX_PII_OSI_M
496 return _POSIX2_VERSION;
499 #ifdef _POSIX2_C_BIND
500 return _POSIX2_C_BIND;
507 return _POSIX2_C_DEV;
512 case _SC_2_C_VERSION:
513 #ifdef _POSIX2_C_VERSION
514 return _POSIX2_C_VERSION;
520 #ifdef _POSIX2_FORT_DEV
521 return _POSIX2_FORT_DEV;
527 #ifdef _POSIX2_FORT_RUN
528 return _POSIX2_FORT_RUN;
533 case _SC_2_LOCALEDEF:
534 #ifdef _POSIX2_LOCALEDEF
535 return _POSIX2_LOCALEDEF;
541 #ifdef _POSIX2_SW_DEV
542 return _POSIX2_SW_DEV;
547 case _SC_2_CHAR_TERM:
548 #ifdef _POSIX2_CHAR_TERM
549 return _POSIX2_CHAR_TERM;
561 /* POSIX 1003.1c (POSIX Threads). */
563 #ifdef _POSIX_THREADS
569 case _SC_THREAD_SAFE_FUNCTIONS:
570 #ifdef _POSIX_THREAD_SAFE_FUNCTIONS
576 case _SC_GETGR_R_SIZE_MAX:
577 #ifdef NSS_BUFLEN_GROUP
578 return NSS_BUFLEN_GROUP;
583 case _SC_GETPW_R_SIZE_MAX:
584 #ifdef NSS_BUFLEN_PASSWD
585 return NSS_BUFLEN_PASSWD;
590 case _SC_LOGIN_NAME_MAX:
591 #ifdef _POSIX_LOGIN_NAME_MAX
592 return _POSIX_LOGIN_NAME_MAX;
597 case _SC_TTY_NAME_MAX:
598 #ifdef _POSIX_TTY_NAME_MAX
599 return _POSIX_TTY_NAME_MAX;
604 case _SC_THREAD_DESTRUCTOR_ITERATIONS:
605 #ifdef _POSIX_THREAD_DESTRUCTOR_ITERATIONS
606 return _POSIX_THREAD_DESTRUCTOR_ITERATIONS;
611 case _SC_THREAD_KEYS_MAX:
612 #ifdef PTHREAD_KEYS_MAX
613 return PTHREAD_KEYS_MAX;
618 case _SC_THREAD_STACK_MIN:
619 #ifdef PTHREAD_STACK_MIN
620 return PTHREAD_STACK_MIN;
625 case _SC_THREAD_THREADS_MAX:
626 #ifdef PTHREAD_THREADS_MAX
627 return PTHREAD_THREADS_MAX;
632 case _SC_THREAD_ATTR_STACKADDR:
633 #ifdef _POSIX_THREAD_ATTR_STACKADDR
639 case _SC_THREAD_ATTR_STACKSIZE:
640 #ifdef _POSIX_THREAD_ATTR_STACKSIZE
646 case _SC_THREAD_PRIORITY_SCHEDULING:
647 #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
653 case _SC_THREAD_PRIO_INHERIT:
654 #ifdef _POSIX_THREAD_PRIO_INHERIT
660 case _SC_THREAD_PRIO_PROTECT:
661 #ifdef _POSIX_THREAD_PRIO_PROTECT
667 case _SC_THREAD_PROCESS_SHARED:
668 #ifdef _POSIX_THREAD_PROCESS_SHARED
674 case _SC_NPROCESSORS_CONF:
676 RETURN_FUNCTION(get_nprocs_conf());
678 /* this is a hack. for now always claim we have exactly one cpu */
682 case _SC_NPROCESSORS_ONLN:
684 RETURN_FUNCTION(get_nprocs());
686 /* this is a hack. for now always claim we have exactly one cpu */
692 RETURN_FUNCTION(get_phys_pages());
697 case _SC_AVPHYS_PAGES:
699 RETURN_FUNCTION(get_avphys_pages());
705 return __UCLIBC_MAX_ATEXIT;
708 /* We have no limit but since the return value might be used to
709 allocate a buffer we restrict the value. */
712 case _SC_XOPEN_VERSION:
713 return _XOPEN_VERSION;
715 case _SC_XOPEN_XCU_VERSION:
716 return _XOPEN_XCU_VERSION;
721 case _SC_XOPEN_CRYPT:
728 case _SC_XOPEN_ENH_I18N:
729 #ifdef _XOPEN_ENH_I18N
730 return _XOPEN_ENH_I18N;
779 return sizeof (long int) * CHAR_BIT;
782 return sizeof (int) * CHAR_BIT;
791 return _POSIX_SSIZE_MAX;
859 case _SC_XBS5_ILP32_OFF32:
860 #ifdef _XBS5_ILP32_OFF32
861 return _XBS5_ILP32_OFF32;
865 case _SC_XBS5_ILP32_OFFBIG:
866 #ifdef _XBS5_ILP32_OFFBIG
867 return _XBS5_ILP32_OFFBIG;
871 case _SC_XBS5_LP64_OFF64:
872 #ifdef _XBS5_LP64_OFF64
873 return _XBS5_LP64_OFF64;
877 case _SC_XBS5_LPBIG_OFFBIG:
878 #ifdef _XBS5_LPBIG_OFFBIG
879 return _XBS5_LPBIG_OFFBIG;
884 case _SC_XOPEN_LEGACY:
885 return _XOPEN_LEGACY;
887 case _SC_XOPEN_REALTIME:
888 #ifdef _XOPEN_REALTIME
889 return _XOPEN_REALTIME;
893 case _SC_XOPEN_REALTIME_THREADS:
894 #ifdef _XOPEN_REALTIME_THREADS
895 return _XOPEN_REALTIME_THREADS;
901 weak_alias(__sysconf, sysconf);
903 #endif /* _UCLIBC_GENERATE_SYSCONF_MAIN */
904 /***********************************************************************/
905 #ifdef _UCLIBC_GENERATE_SYSCONF_MAIN
907 static long int ret_vals[_UCLIBC_SYSCONF_NUM_VALID_ARGS];
909 static const char *type_str[] = {
910 "char", "short", "int", "long"
913 static const char *type_fmt[] = { " %4ld", " %6ld", " %8ld", " %8ld" };
914 static const int type_mod[] = { 13, 9, 6, 6 };
916 static int find_or_add_in_table(int index, long int val, int *table,
917 int *num_in_table, int add_flag)
921 for (i=0 ; i<*num_in_table ; i++) {
922 if (ret_vals[table[i]] == val) {
927 table[(*num_in_table)++] = index;
938 int type_table[5][_UCLIBC_SYSCONF_NUM_VALID_ARGS];
939 int ret_type[_UCLIBC_SYSCONF_NUM_VALID_ARGS];
943 for (i=0 ; i<5 ; i++) {
947 for (i=0; i<_UCLIBC_SYSCONF_NUM_VALID_ARGS ; i++) {
949 r = ret_vals[i] = sysconf(i);
951 case EINVAL: /* we're missing a case! */
952 fprintf(stderr,"sysconf.c is broken! case %d missing!\n", i);
954 case EISNAM: /* function */
955 find_or_add_in_table(i,r,type_table[4],num_type+4,1);
958 case ENOSYS: /* defaults to -1 */
959 /* why does this break for shared???? */
960 fprintf(stderr,"gen_sysconf advisory --"
961 "case %d defaults to -1\n", i);
964 if ((r>=CHAR_MIN) && (r<=CHAR_MAX)) {
966 find_or_add_in_table(i,r,type_table[0],num_type+0,1);
967 } else if ((r>=SHRT_MIN) && (r<=SHRT_MAX)) {
969 find_or_add_in_table(i,r,type_table[1],num_type+1,1);
970 } else if ((r>=INT_MIN) && (r<=INT_MAX)) {
972 find_or_add_in_table(i,r,type_table[2],num_type+2,1);
975 find_or_add_in_table(i,r,type_table[3],num_type+3,1);
979 fprintf(stderr,"sysconf.c is broken! errno = %d!\n", errno);
984 printf("#include <errno.h>\n#include <unistd.h>\n#include <limits.h>\n\n");
986 printf("static const unsigned char index[%d] = {",
987 _UCLIBC_SYSCONF_NUM_VALID_ARGS);
988 for (i=0 ; i<_UCLIBC_SYSCONF_NUM_VALID_ARGS ; i++) {
990 if (i%15 == 0) printf("\n");
992 for (j=0 ; j<4 ; j++) {
993 k = find_or_add_in_table(i,ret_vals[i],type_table[j],num_type+j,0);
1000 printf(" %3d", code);
1004 for (j=0 ; j < 4 ; j++) {
1006 printf("static const %s %s_vals[%d] = {",
1007 type_str[j], type_str[j], num_type[j]);
1008 for (i = 0 ; i<num_type[j] ; i++) {
1010 if (i%13 == 0) printf("\n");
1011 if (ret_vals[type_table[j][i]] == INT_MIN) {
1012 printf("%12s","INT_MIN");
1014 printf(type_fmt[j], ret_vals[type_table[j][i]]);
1022 printf("long int sysconf(int name)\n{\n\tint i;\n\n"
1023 "\tif ((name < 0) || (name >= %d)) {\n"
1024 "\t\terrno=EINVAL;\n"
1026 "\t}\n\n", _UCLIBC_SYSCONF_NUM_VALID_ARGS);
1028 printf("\ti = index[name];\n\n");
1030 for (i=0 ; i<4 ; i++) {
1033 printf("\ti -= %d;\n", k);
1035 printf("\tif (i < %d) {\n"
1036 "\t\treturn %s_vals[i];\n"
1038 num_type[i], type_str[i]);
1045 printf("\ti -= %d;\n", k);
1047 printf("\tswitch(i) {\n");
1048 for (i = 0 ; i<num_type[4] ; i++) {
1049 printf("\t\tcase %d:\n"
1050 "\t\t\treturn %s;\n",
1051 i, (const char *)ret_vals[type_table[4][i]]);
1056 printf("\treturn -1;\n"
1060 return EXIT_SUCCESS;
1062 /***********************************************************************/