1 /* Copyright (C) 1991,1993,1995-1997,2000
2 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB. If not,
17 see <http://www.gnu.org/licenses/>. */
19 #define _XOPEN_SOURCE 500
31 #include <sys/syscall.h>
32 #include <sys/sysinfo.h>
33 #include <sys/types.h>
34 #include <sys/param.h>
35 #ifdef __UCLIBC_HAS_REGEX__
38 #ifdef __UCLIBC_HAS_THREADS_NATIVE__
41 #include <sys/resource.h>
44 #include "internal/parse_config.h"
46 long int get_phys_pages(void)
49 int ps
= getpagesize();;
53 if (ps
>= si
.mem_unit
)
54 return si
.totalram
/ (ps
/ si
.mem_unit
);
56 return si
.totalram
* (si
.mem_unit
/ ps
);
59 long int get_avphys_pages(void)
62 int ps
= getpagesize();;
66 if (ps
>= si
.mem_unit
)
67 return si
.freeram
/ (ps
/ si
.mem_unit
);
69 return si
.freeram
* (si
.mem_unit
/ ps
);
72 static int nprocessors_onln(void)
75 parser_t
*p
= config_open("/proc/stat");
79 while (config_read(p
, &l
, 2, 1, " ", 0))
85 } else if ((p
= config_open("/proc/cpuinfo"))) {
87 while (config_read(p
, &l
, 2, 2, "\0:", PARSE_NORMAL
))
88 if (strncmp("ncpus active", l
[0], 12) == 0) {
93 while (config_read(p
, &l
, 2, 2, "\0:\t", PARSE_NORMAL
))
94 if (strcmp("processor", l
[0]) == 0)
99 return ret
!= 0 ? ret
: 1;
102 static int nprocessors_conf(void)
105 DIR *dir
= opendir("/sys/devices/system/cpu");
110 while ((dp
= readdir64(dir
))) {
111 if (dp
->d_type
== DT_DIR
112 && dp
->d_name
[0] == 'c'
113 && dp
->d_name
[1] == 'p'
114 && dp
->d_name
[2] == 'u'
115 && isdigit(dp
->d_name
[3]))
121 #if defined __sparc__
123 parser_t
*p
= config_open("/proc/stat");
124 while (config_read(p
, &l
, 2, 2, "\0:", PARSE_NORMAL
))
125 if (strncmp("ncpus probed", l
[0], 13) == 0) {
131 ret
= nprocessors_onln();
134 return ret
!= 0 ? ret
: 1;
138 #ifndef __UCLIBC_CLK_TCK_CONST
139 #error __UCLIBC_CLK_TCK_CONST not defined!
142 /***********************************************************************/
144 * Manuel Novoa III Jan 2001
146 * On i386, the switch-based implementation generates 796 bytes of code.
147 * However, many of the return values are repeats. By collecting these
148 * repeats and moving to a table-based implementation, we generate 283
149 * bytes on i386 (-Os -fomit-frame-pointer).
152 #ifdef _UCLIBC_GENERATE_SYSCONF_ARCH
154 * Set some errno's so the auto-gen code knows what it is dealing with.
155 * 1) ENOSYS signifies that we're returning a default value.
156 * This is just extra info for development.
157 * 2) EISNAM signifies that the value returned varies at runtime.
159 * Option: GETPAGESIZE_IS_DYNAMIC
160 * The current implementation of getpagesize in uClibc returns
161 * a constant. The pagesize on the target arch should not vary,
162 * so it should be safe to set this as 0.
164 #define RETURN_NEG_1 __set_errno(ENOSYS); return -1
165 #define RETURN_FUNCTION(f) __set_errno(EISNAM); return (long int) #f
166 #define GETPAGESIZE_IS_DYNAMIC 0
168 #define RETURN_NEG_1 return -1
169 #define RETURN_FUNCTION(f) return f;
170 #endif /* _UCLIBC_GENERATE_SYSCONF_ARCH */
172 /* Legacy value of ARG_MAX. The macro is now not defined since the
173 actual value varies based on the stack size. */
174 #define legacy_ARG_MAX 131072
176 /* Get the value of the system variable NAME. */
177 long int sysconf(int name
)
179 struct rlimit rlimit
;
188 /* Use getrlimit to get the stack limit. */
189 if (getrlimit (RLIMIT_STACK
, &rlimit
) == 0)
190 return MAX (legacy_ARG_MAX
, rlimit
.rlim_cur
/ 4);
194 return legacy_ARG_MAX
;
205 /* Can't use CLK_TCK here since that calls __sysconf(_SC_CLK_TCK) */
206 return __UCLIBC_CLK_TCK_CONST
;
208 case _SC_NGROUPS_MAX
:
216 RETURN_FUNCTION(getdtablesize());
226 return _POSIX_TZNAME_MAX
;
228 case _SC_JOB_CONTROL
:
229 #ifdef _POSIX_JOB_CONTROL
236 #ifdef _POSIX_SAVED_IDS
242 case _SC_REALTIME_SIGNALS
:
243 #ifdef _POSIX_REALTIME_SIGNALS
249 case _SC_PRIORITY_SCHEDULING
:
250 #ifdef _POSIX_PRIORITY_SCHEDULING
263 case _SC_ASYNCHRONOUS_IO
:
264 #ifdef _POSIX_ASYNCHRONOUS_IO
270 case _SC_PRIORITIZED_IO
:
271 #ifdef _POSIX_PRIORITIZED_IO
277 case _SC_SYNCHRONIZED_IO
:
278 #ifdef _POSIX_SYNCHRONIZED_IO
291 case _SC_MAPPED_FILES
:
292 #ifdef _POSIX_MAPPED_FILES
299 #ifdef _POSIX_MEMLOCK
305 case _SC_MEMLOCK_RANGE
:
306 #ifdef _POSIX_MEMLOCK_RANGE
312 case _SC_MEMORY_PROTECTION
:
313 #ifdef _POSIX_MEMORY_PROTECTION
319 case _SC_MESSAGE_PASSING
:
320 #ifdef _POSIX_MESSAGE_PASSING
327 #ifdef _POSIX_SEMAPHORES
333 case _SC_SHARED_MEMORY_OBJECTS
:
334 #ifdef _POSIX_SHARED_MEMORY_OBJECTS
341 return _POSIX_VERSION
;
344 #if defined(GETPAGESIZE_IS_DYNAMIC) && (GETPAGESIZE_IS_DYNAMIC == 1)
345 RETURN_FUNCTION(getpagesize());
347 return getpagesize(); /* note: currently this is not dynamic */
350 case _SC_AIO_LISTIO_MAX
:
351 #ifdef AIO_LISTIO_MAX
352 return AIO_LISTIO_MAX
;
364 case _SC_AIO_PRIO_DELTA_MAX
:
365 #ifdef AIO_PRIO_DELTA_MAX
366 return AIO_PRIO_DELTA_MAX
;
371 case _SC_DELAYTIMER_MAX
:
372 #ifdef DELAYTIMER_MAX
373 return DELAYTIMER_MAX
;
378 case _SC_MQ_OPEN_MAX
:
385 case _SC_MQ_PRIO_MAX
:
399 case _SC_SEM_NSEMS_MAX
:
401 return SEM_NSEMS_MAX
;
406 case _SC_SEM_VALUE_MAX
:
408 return SEM_VALUE_MAX
;
413 case _SC_SIGQUEUE_MAX
:
427 case _SC_BC_BASE_MAX
:
441 case _SC_BC_SCALE_MAX
:
448 case _SC_BC_STRING_MAX
:
450 return BC_STRING_MAX
;
455 case _SC_COLL_WEIGHTS_MAX
:
456 #ifdef COLL_WEIGHTS_MAX
457 return COLL_WEIGHTS_MAX
;
462 case _SC_EQUIV_CLASS_MAX
:
463 #ifdef EQUIV_CLASS_MAX
464 return EQUIV_CLASS_MAX
;
469 case _SC_EXPR_NEST_MAX
:
471 return EXPR_NEST_MAX
;
490 case _SC_CHARCLASS_NAME_MAX
:
491 #ifdef CHARCLASS_NAME_MAX
492 return CHARCLASS_NAME_MAX
;
505 #ifdef _POSIX_PII_XTI
512 #ifdef _POSIX_PII_SOCKET
518 case _SC_PII_INTERNET
:
519 #ifdef _POSIX_PII_INTERNET
526 #ifdef _POSIX_PII_OSI
553 case _SC_PII_INTERNET_STREAM
:
554 #ifdef _POSIX_PII_INTERNET_STREAM
560 case _SC_PII_INTERNET_DGRAM
:
561 #ifdef _POSIX_PII_INTERNET_DGRAM
567 case _SC_PII_OSI_COTS
:
568 #ifdef _POSIX_PII_OSI_COTS
574 case _SC_PII_OSI_CLTS
:
575 #ifdef _POSIX_PII_OSI_CLTS
582 #ifdef _POSIX_PII_OSI_M
596 return _POSIX2_VERSION
;
599 #ifdef _POSIX2_C_BIND
600 return _POSIX2_C_BIND
;
607 return _POSIX2_C_DEV
;
612 case _SC_2_C_VERSION
:
613 #ifdef _POSIX2_C_VERSION
614 return _POSIX2_C_VERSION
;
620 #ifdef _POSIX2_FORT_DEV
621 return _POSIX2_FORT_DEV
;
627 #ifdef _POSIX2_FORT_RUN
628 return _POSIX2_FORT_RUN
;
633 case _SC_2_LOCALEDEF
:
634 #ifdef _POSIX2_LOCALEDEF
635 return _POSIX2_LOCALEDEF
;
641 #ifdef _POSIX2_SW_DEV
642 return _POSIX2_SW_DEV
;
647 case _SC_2_CHAR_TERM
:
648 #ifdef _POSIX2_CHAR_TERM
649 return _POSIX2_CHAR_TERM
;
661 /* POSIX 1003.1c (POSIX Threads). */
663 #ifdef __UCLIBC_HAS_THREADS__
669 case _SC_THREAD_SAFE_FUNCTIONS
:
670 #ifdef __UCLIBC_HAS_THREADS__
676 /* If you change these, also change libc/pwd_grp/pwd_grp.c to match */
677 case _SC_GETGR_R_SIZE_MAX
:
678 return __UCLIBC_GRP_BUFFER_SIZE__
;
680 case _SC_GETPW_R_SIZE_MAX
:
681 return __UCLIBC_PWD_BUFFER_SIZE__
;
683 /* getlogin() is a worthless interface. In uClibc we let the user specify
684 * whatever they want via the LOGNAME environment variable, or we return NULL
685 * if getenv() fails to find anything. So this is merely how large a env
686 * variable can be. Lets use 256 */
687 case _SC_LOGIN_NAME_MAX
:
690 /* If you change this, also change _SC_TTY_NAME_MAX in libc/unistd/sysconf.c */
691 #define TTYNAME_BUFLEN 32
692 case _SC_TTY_NAME_MAX
:
693 return TTYNAME_BUFLEN
;
695 case _SC_THREAD_DESTRUCTOR_ITERATIONS
:
696 #ifdef _POSIX_THREAD_DESTRUCTOR_ITERATIONS
697 return _POSIX_THREAD_DESTRUCTOR_ITERATIONS
;
702 case _SC_THREAD_KEYS_MAX
:
703 #ifdef PTHREAD_KEYS_MAX
704 return PTHREAD_KEYS_MAX
;
709 case _SC_THREAD_STACK_MIN
:
710 #ifdef PTHREAD_STACK_MIN
711 return PTHREAD_STACK_MIN
;
716 case _SC_THREAD_THREADS_MAX
:
717 #ifdef PTHREAD_THREADS_MAX
718 return PTHREAD_THREADS_MAX
;
723 case _SC_THREAD_ATTR_STACKADDR
:
724 #ifdef _POSIX_THREAD_ATTR_STACKADDR
730 case _SC_THREAD_ATTR_STACKSIZE
:
731 #ifdef _POSIX_THREAD_ATTR_STACKSIZE
737 case _SC_THREAD_PRIORITY_SCHEDULING
:
738 #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
744 case _SC_THREAD_PRIO_INHERIT
:
745 #ifdef _POSIX_THREAD_PRIO_INHERIT
751 case _SC_THREAD_PRIO_PROTECT
:
752 #ifdef _POSIX_THREAD_PRIO_PROTECT
758 case _SC_THREAD_PROCESS_SHARED
:
759 #ifdef _POSIX_THREAD_PROCESS_SHARED
765 case _SC_NPROCESSORS_CONF
:
766 RETURN_FUNCTION(nprocessors_conf());
768 case _SC_NPROCESSORS_ONLN
:
769 RETURN_FUNCTION(nprocessors_onln());
772 RETURN_FUNCTION(get_phys_pages());
774 case _SC_AVPHYS_PAGES
:
775 RETURN_FUNCTION(get_avphys_pages());
778 return __UCLIBC_MAX_ATEXIT
;
781 /* We have no limit but since the return value might be used to
782 allocate a buffer we restrict the value. */
785 case _SC_XOPEN_VERSION
:
786 return _XOPEN_VERSION
;
788 case _SC_XOPEN_XCU_VERSION
:
789 return _XOPEN_XCU_VERSION
;
794 case _SC_XOPEN_CRYPT
:
801 case _SC_XOPEN_ENH_I18N
:
802 #ifdef _XOPEN_ENH_I18N
803 return _XOPEN_ENH_I18N
;
852 return sizeof (long int) * CHAR_BIT
;
855 return sizeof (int) * CHAR_BIT
;
864 return _POSIX_SSIZE_MAX
;
932 case _SC_XBS5_ILP32_OFF32
:
933 #ifdef _XBS5_ILP32_OFF32
934 return _XBS5_ILP32_OFF32
;
938 case _SC_XBS5_ILP32_OFFBIG
:
939 #ifdef _XBS5_ILP32_OFFBIG
940 return _XBS5_ILP32_OFFBIG
;
944 case _SC_XBS5_LP64_OFF64
:
945 #ifdef _XBS5_LP64_OFF64
946 return _XBS5_LP64_OFF64
;
950 case _SC_XBS5_LPBIG_OFFBIG
:
951 #ifdef _XBS5_LPBIG_OFFBIG
952 return _XBS5_LPBIG_OFFBIG
;
956 case _SC_V7_ILP32_OFF32
:
957 #ifdef _POSIX_V7_ILP32_OFF32
958 return _POSIX_V7_ILP32_OFF32
;
962 case _SC_V7_ILP32_OFFBIG
:
963 #ifdef _POSIX_V7_ILP32_OFFBIG
964 return _POSIX_V7_ILP32_OFFBIG
;
968 case _SC_V7_LP64_OFF64
:
969 #ifdef _POSIX_V7_LP64_OFF64
970 return _POSIX_V7_LP64_OFF64
;
974 case _SC_V7_LPBIG_OFFBIG
:
975 #ifdef _POSIX_V7_LPBIG_OFFBIG
976 return _POSIX_V7_LPBIG_OFFBIG
;
981 case _SC_XOPEN_LEGACY
:
982 return _XOPEN_LEGACY
;
984 case _SC_XOPEN_REALTIME
:
985 #ifdef _XOPEN_REALTIME
986 return _XOPEN_REALTIME
;
990 case _SC_XOPEN_REALTIME_THREADS
:
991 #ifdef _XOPEN_REALTIME_THREADS
992 return _XOPEN_REALTIME_THREADS
;
997 case _SC_MONOTONIC_CLOCK
:
998 #if defined __UCLIBC_HAS_REALTIME__ && defined __NR_clock_getres
999 if (clock_getres(CLOCK_MONOTONIC
, NULL
) >= 0)
1000 return _POSIX_VERSION
;
1004 #ifdef __UCLIBC_HAS_THREADS_NATIVE__
1005 case _SC_THREAD_CPUTIME
:
1006 # if _POSIX_THREAD_CPUTIME > 0
1007 return _POSIX_THREAD_CPUTIME
;
1014 libc_hidden_def(sysconf
)