@ -6,15 +6,21 @@
# include "syscall.h"
# include "libc.h"
# define VER (-2)
# define OFLOW (-3)
# define CPUCNT (-4)
# define JT(x) (-256|(x))
# define VER JT(1)
# define JT_ARG_MAX JT(2)
# define JT_MQ_PRIO_MAX JT(3)
# define JT_PAGE_SIZE JT(4)
# define JT_SEM_VALUE_MAX JT(5)
# define JT_NPROCESSORS_CONF JT(6)
# define JT_NPROCESSORS_ONLN JT(7)
# define RLIM(x) (-32768|(RLIMIT_ ## x))
long sysconf ( int name )
{
static const short values [ ] = {
[ _SC_ARG_MAX ] = OFLOW ,
[ _SC_ARG_MAX ] = JT_ARG_MAX ,
[ _SC_CHILD_MAX ] = RLIM ( NPROC ) ,
[ _SC_CLK_TCK ] = 100 ,
[ _SC_NGROUPS_MAX ] = 32 ,
@ -42,12 +48,12 @@ long sysconf(int name)
[ _SC_AIO_PRIO_DELTA_MAX ] = 0 , /* ?? */
[ _SC_DELAYTIMER_MAX ] = _POSIX_DELAYTIMER_MAX ,
[ _SC_MQ_OPEN_MAX ] = - 1 ,
[ _SC_MQ_PRIO_MAX ] = OFLOW ,
[ _SC_MQ_PRIO_MAX ] = JT_MQ_PRIO_MAX ,
[ _SC_VERSION ] = VER ,
[ _SC_PAGE_SIZE ] = OFLOW ,
[ _SC_PAGE_SIZE ] = JT_PAGE_SIZE ,
[ _SC_RTSIG_MAX ] = _NSIG - 1 - 31 - 3 ,
[ _SC_SEM_NSEMS_MAX ] = SEM_NSEMS_MAX ,
[ _SC_SEM_VALUE_MAX ] = OFLOW ,
[ _SC_SEM_VALUE_MAX ] = JT_SEM_VALUE_MAX ,
[ _SC_SIGQUEUE_MAX ] = - 1 ,
[ _SC_TIMER_MAX ] = - 1 ,
[ _SC_BC_BASE_MAX ] = _POSIX2_BC_BASE_MAX ,
@ -97,8 +103,8 @@ long sysconf(int name)
[ _SC_THREAD_PRIO_INHERIT ] = - 1 ,
[ _SC_THREAD_PRIO_PROTECT ] = - 1 ,
[ _SC_THREAD_PROCESS_SHARED ] = VER ,
[ _SC_NPROCESSORS_CONF ] = CPUCNT ,
[ _SC_NPROCESSORS_ONLN ] = CPUCNT ,
[ _SC_NPROCESSORS_CONF ] = JT_NPROCESSORS_CONF ,
[ _SC_NPROCESSORS_ONLN ] = JT_NPROCESSORS_ONLN ,
[ _SC_PHYS_PAGES ] = - 1 ,
[ _SC_AVPHYS_PAGES ] = - 1 ,
[ _SC_ATEXIT_MAX ] = - 1 ,
@ -215,28 +221,37 @@ long sysconf(int name)
[ _SC_THREAD_ROBUST_PRIO_INHERIT ] = - 1 ,
[ _SC_THREAD_ROBUST_PRIO_PROTECT ] = - 1 ,
} ;
if ( name > sizeof ( values ) / sizeof ( values [ 0 ] ) ) {
errno = EINVAL ;
return - 1 ;
} else if ( values [ name ] = = VER ) {
} else if ( values [ name ] > = - 1 ) {
return values [ name ] ;
} else if ( values [ name ] < - 256 ) {
long lim [ 2 ] ;
__syscall ( SYS_getrlimit , values [ name ] & 16383 , lim ) ;
return lim [ 0 ] < 0 ? LONG_MAX : lim [ 0 ] ;
}
switch ( ( unsigned char ) values [ name ] ) {
case VER & 255 :
return _POSIX_VERSION ;
} else if ( values [ name ] = = OFLOW ) {
if ( name = = _SC_ARG_MAX ) return ARG_MAX ;
if ( name = = _SC_SEM_VALUE_MAX ) return SEM_VALUE_MAX ;
if ( name = = _SC_MQ_PRIO_MAX ) return MQ_PRIO_MAX ;
/* name == _SC_PAGE_SIZE */
case JT_ARG_MAX & 255 :
return ARG_MAX ;
case JT_MQ_PRIO_MAX & 255 :
return MQ_PRIO_MAX ;
case JT_PAGE_SIZE & 255 :
return PAGE_SIZE ;
} else if ( values [ name ] = = CPUCNT ) {
case JT_SEM_VALUE_MAX & 255 :
return SEM_VALUE_MAX ;
case JT_NPROCESSORS_CONF & 255 :
case JT_NPROCESSORS_ONLN & 255 : ;
unsigned char set [ 128 ] = { 1 } ;
int i , cnt ;
__syscall ( SYS_sched_getaffinity , 0 , sizeof set , set ) ;
for ( i = cnt = 0 ; i < sizeof set ; i + + )
for ( ; set [ i ] ; set [ i ] & = set [ i ] - 1 , cnt + + ) ;
return cnt ;
} else if ( values [ name ] < OFLOW ) {
long lim [ 2 ] ;
__syscall ( SYS_getrlimit , values [ name ] & 16383 , lim ) ;
return lim [ 0 ] < 0 ? LONG_MAX : lim [ 0 ] ;
}
return values [ name ] ;
}