nuttx/libs/libc/unistd/lib_sysconf.c
chenzhijia 1086a05e50 libc/sysconf: add _SC_GETPW_R_SIZE_MAX
pass tlpi example: https://man7.org/tlpi/code/online/dist/users_groups/t_getpwnam_r.c.html

Signed-off-by: chenzhijia <chenzhijia@xiaomi.com>
2024-08-29 09:05:45 +08:00

275 lines
12 KiB
C

/****************************************************************************
* libs/libc/unistd/lib_sysconf.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/atexit.h>
#include <unistd.h>
#include <sched.h>
#include <errno.h>
#ifdef CONFIG_MM_PGSIZE
# define DEFAULT_MM_PGSIZE CONFIG_MM_PGSIZE
#else
# define DEFAULT_MM_PGSIZE CONFIG_PTHREAD_STACK_MIN
#endif
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: sysconf
*
* Description:
* The sysconf() function provides a method for the application to
* determine the current value of a configurable system limit or option
* (variable). The implementation will support all of the variables
* listed in the following table and may support others.
*
* The 'name' argument represents the system variable to be queried. The
* following table lists the minimal set of system variables from
* <limits.h> or <unistd.h> that can be returned by sysconf(), and the
* symbolic constants defined in <unistd.h> that are the corresponding
* values used for name.
*
* Variable Value of Name
*
* {AIO_LISTIO_MAX} _SC_AIO_LISTIO_MAX
* {AIO_MAX} _SC_AIO_MAX
* {AIO_PRIO_DELTA_MAX} _SC_AIO_PRIO_DELTA_MAX
* {ARG_MAX} _SC_ARG_MAX
* {ATEXIT_MAX} _SC_ATEXIT_MAX
* {BC_BASE_MAX} _SC_BC_BASE_MAX
* {BC_DIM_MAX} _SC_BC_DIM_MAX
* {BC_SCALE_MAX} _SC_BC_SCALE_MAX
* {BC_STRING_MAX} _SC_BC_STRING_MAX
* {CHILD_MAX} _SC_CHILD_MAX
* Clock ticks/second _SC_CLK_TCK
* {COLL_WEIGHTS_MAX} _SC_COLL_WEIGHTS_MAX
* {DELAYTIMER_MAX} _SC_DELAYTIMER_MAX
* {EXPR_NEST_MAX} _SC_EXPR_NEST_MAX
* {HOST_NAME_MAX} _SC_HOST_NAME_MAX
* {IOV_MAX} _SC_IOV_MAX
* {LINE_MAX} _SC_LINE_MAX
* {LOGIN_NAME_MAX} _SC_LOGIN_NAME_MAX
* {NGROUPS_MAX} _SC_NGROUPS_MAX
* Maximum size of getgrgid_r() and _SC_GETGR_R_SIZE_MAX
* getgrnam_r() data buffers
* Maximum size of getpwuid_r() and _SC_GETPW_R_SIZE_MAX
* getpwnam_r() data buffers
* {MQ_OPEN_MAX} _SC_MQ_OPEN_MAX
* {MQ_PRIO_MAX} _SC_MQ_PRIO_MAX
* {OPEN_MAX} _SC_OPEN_MAX
* _POSIX_ADVISORY_INFO _SC_ADVISORY_INFO
* _POSIX_BARRIERS _SC_BARRIERS
* _POSIX_ASYNCHRONOUS_IO _SC_ASYNCHRONOUS_IO
* _POSIX_CLOCK_SELECTION _SC_CLOCK_SELECTION
* _POSIX_CPUTIME _SC_CPUTIME
* _POSIX_FSYNC _SC_FSYNC
* _POSIX_IPV6 _SC_IPV6
* _POSIX_JOB_CONTROL _SC_JOB_CONTROL
* _POSIX_MAPPED_FILES _SC_MAPPED_FILES
* _POSIX_MEMLOCK _SC_MEMLOCK
* _POSIX_MEMLOCK_RANGE _SC_MEMLOCK_RANGE
* _POSIX_MEMORY_PROTECTION _SC_MEMORY_PROTECTION
* _POSIX_MESSAGE_PASSING _SC_MESSAGE_PASSING
* _POSIX_MONOTONIC_CLOCK _SC_MONOTONIC_CLOCK
* _POSIX_PRIORITIZED_IO _SC_PRIORITIZED_IO
* _POSIX_PRIORITY_SCHEDULING _SC_PRIORITY_SCHEDULING
* _POSIX_RAW_SOCKETS _SC_RAW_SOCKETS
* _POSIX_READER_WRITER_LOCKS _SC_READER_WRITER_LOCKS
* _POSIX_REALTIME_SIGNALS _SC_REALTIME_SIGNALS
* _POSIX_REGEXP _SC_REGEXP
* _POSIX_SAVED_IDS _SC_SAVED_IDS
* _POSIX_SEMAPHORES _SC_SEMAPHORES
* _POSIX_SHARED_MEMORY_OBJECTS _SC_SHARED_MEMORY_OBJECTS
* _POSIX_SHELL _SC_SHELL
* _POSIX_SPAWN _SC_SPAWN
* _POSIX_SPIN_LOCKS _SC_SPIN_LOCKS
* _POSIX_SPORADIC_SERVER _SC_SPORADIC_SERVER
* _POSIX_SS_REPL_MAX _SC_SS_REPL_MAX
* _POSIX_SYNCHRONIZED_IO _SC_SYNCHRONIZED_IO
* _POSIX_THREAD_ATTR_STACKADDR _SC_THREAD_ATTR_STACKADDR
* _POSIX_THREAD_ATTR_STACKSIZE _SC_THREAD_ATTR_STACKSIZE
* _POSIX_THREAD_CPUTIME _SC_THREAD_CPUTIME
* _POSIX_THREAD_PRIO_INHERIT _SC_THREAD_PRIO_INHERIT
* _POSIX_THREAD_PRIO_PROTECT _SC_THREAD_PRIO_PROTECT
* _POSIX_THREAD_PRIORITY_SCHEDULING _SC_THREAD_PRIORITY_SCHEDULING
* _POSIX_THREAD_PROCESS_SHARED _SC_THREAD_PROCESS_SHARED
* _POSIX_THREAD_SAFE_FUNCTIONS _SC_THREAD_SAFE_FUNCTIONS
* _POSIX_THREAD_SPORADIC_SERVER _SC_THREAD_SPORADIC_SERVER
* _POSIX_THREADS _SC_THREADS
* _POSIX_TIMEOUTS _SC_TIMEOUTS
* _POSIX_TIMERS _SC_TIMERS
* _POSIX_TRACE _SC_TRACE
* _POSIX_TRACE_EVENT_FILTER _SC_TRACE_EVENT_FILTER
* _POSIX_TRACE_EVENT_NAME_MAX _SC_TRACE_EVENT_NAME_MAX
* _POSIX_TRACE_INHERIT _SC_TRACE_INHERIT
* _POSIX_TRACE_LOG _SC_TRACE_LOG
* _POSIX_TRACE_NAME_MAX _SC_TRACE_NAME_MAX
* _POSIX_TRACE_SYS_MAX _SC_TRACE_SYS_MAX
* _POSIX_TRACE_USER_EVENT_MAX _SC_TRACE_USER_EVENT_MAX
* _POSIX_TYPED_MEMORY_OBJECTS _SC_TYPED_MEMORY_OBJECTS
* _POSIX_VERSION _SC_VERSION
* _POSIX_V6_ILP32_OFF32 _SC_V6_ILP32_OFF32
* _POSIX_V6_ILP32_OFFBIG _SC_V6_ILP32_OFFBIG
* _POSIX_V6_LP64_OFF64 _SC_V6_LP64_OFF64
* _POSIX_V6_LPBIG_OFFBIG _SC_V6_LPBIG_OFFBIG
* _POSIX2_C_BIND _SC_2_C_BIND
* _POSIX2_C_DEV _SC_2_C_DEV
* _POSIX2_CHAR_TERM _SC_2_CHAR_TERM
* _POSIX2_FORT_DEV _SC_2_FORT_DEV
* _POSIX2_FORT_RUN _SC_2_FORT_RUN
* _POSIX2_LOCALEDEF _SC_2_LOCALEDEF
* _POSIX2_PBS _SC_2_PBS
* _POSIX2_PBS_ACCOUNTING _SC_2_PBS_ACCOUNTING
* _POSIX2_PBS_CHECKPOINT _SC_2_PBS_CHECKPOINT
* _POSIX2_PBS_LOCATE _SC_2_PBS_LOCATE
* _POSIX2_PBS_MESSAGE _SC_2_PBS_MESSAGE
* _POSIX2_PBS_TRACK _SC_2_PBS_TRACK
* _POSIX2_SW_DEV _SC_2_SW_DEV
* _POSIX2_UPE _SC_2_UPE
* _POSIX2_VERSION _SC_2_VERSION
* {PAGE_SIZE} _SC_PAGE_SIZE
* {PAGESIZE} _SC_PAGESIZE
* {PTHREAD_DESTRUCTOR_ITERATIONS} _SC_THREAD_DESTRUCTOR_ITERATIONS
* {PTHREAD_KEYS_MAX} _SC_THREAD_KEYS_MAX
* {PTHREAD_STACK_MIN} _SC_THREAD_STACK_MIN
* {PTHREAD_THREADS_MAX} _SC_THREAD_THREADS_MAX
* {RE_DUP_MAX} _SC_RE_DUP_MAX
* {RTSIG_MAX} _SC_RTSIG_MAX
* {SEM_NSEMS_MAX} _SC_SEM_NSEMS_MAX
* {SEM_VALUE_MAX} _SC_SEM_VALUE_MAX
* {SIGQUEUE_MAX} _SC_SIGQUEUE_MAX
* {STREAM_MAX} _SC_STREAM_MAX
* {SYMLOOP_MAX} _SC_SYMLOOP_MAX
* {TIMER_MAX} _SC_TIMER_MAX
* {TTY_NAME_MAX} _SC_TTY_NAME_MAX
* {TZNAME_MAX} _SC_TZNAME_MAX
* _XBS5_ILP32_OFF32 (LEGACY) _SC_XBS5_ILP32_OFF32 (LEGACY)
* _XBS5_ILP32_OFFBIG (LEGACY) _SC_XBS5_ILP32_OFFBIG (LEGACY)
* _XBS5_LP64_OFF64 (LEGACY) _SC_XBS5_LP64_OFF64 (LEGACY)
* _XBS5_LPBIG_OFFBIG (LEGACY) _SC_XBS5_LPBIG_OFFBIG (LEGACY)
* _XOPEN_CRYPT _SC_XOPEN_CRYPT
* _XOPEN_ENH_I18N _SC_XOPEN_ENH_I18N
* _XOPEN_LEGACY _SC_XOPEN_LEGACY
* _XOPEN_REALTIME _SC_XOPEN_REALTIME
* _XOPEN_REALTIME_THREADS _SC_XOPEN_REALTIME_THREADS
* _XOPEN_SHM _SC_XOPEN_SHM
* _XOPEN_STREAMS _SC_XOPEN_STREAMS
* _XOPEN_UNIX _SC_XOPEN_UNIX
* _XOPEN_VERSION _SC_XOPEN_VERSION
*
* Returned Value:
* If name is an invalid value, sysconf() will return -1 and set errno to
* EINVAL to indicate the error. If the variable corresponding to name has
* no limit, sysconf() will return -1 without changing the value of errno.
* Note that indefinite limits do not imply infinite limits; see
* <limits.h>.
*
* Otherwise, sysconf() will return the current variable value on the
* system. The value returned will not be more restrictive than the
* corresponding value described to the application when it was compiled
* with the implementation's <limits.h> or <unistd.h>. The value will not
* change during the lifetime of the calling process, except that
* sysconf(_SC_OPEN_MAX) may return different values before and after a
* call to setrlimit() which changes the RLIMIT_NOFILE soft limit.
*
* If the variable corresponding to name is dependent on an unsupported
* option, the results are unspecified.
*
****************************************************************************/
long sysconf(int name)
{
int errcode;
/* NOTE: The initialize implementation of this interface is very sparse.
* It was originally created to support only the functionality of
* getdtablesize() but can be extended to support as much of the standard
* POSIX sysconf() as is necessary.
*/
switch (name)
{
#ifdef CONFIG_FS_AIO
case _SC_ASYNCHRONOUS_IO:
return _POSIX_ASYNCHRONOUS_IO;
#endif
case _SC_PRIORITIZED_IO:
return _POSIX_PRIORITIZED_IO;
case _SC_AIO_MAX:
return _POSIX_AIO_MAX;
#ifdef CONFIG_LIBC_PASSWD_LINESIZE
case _SC_GETPW_R_SIZE_MAX:
return _POSIX_GETPW_R_SIZE_MAX;
#endif
case _SC_CPUTIME:
return _POSIX_CPUTIME;
case _SC_THREAD_CPUTIME:
return _POSIX_THREAD_CPUTIME;
case _SC_REALTIME_SIGNALS:
return _POSIX_REALTIME_SIGNALS;
case _SC_CLK_TCK:
return CLOCKS_PER_SEC;
case _SC_OPEN_MAX:
return OPEN_MAX;
case _SC_ATEXIT_MAX:
return ATEXIT_MAX;
case _SC_NPROCESSORS_CONF:
case _SC_NPROCESSORS_ONLN:
return CONFIG_SMP_NCPUS;
case _SC_MONOTONIC_CLOCK:
return 1;
case _SC_PAGESIZE:
return DEFAULT_MM_PGSIZE;
case _SC_THREAD_STACK_MIN:
return CONFIG_PTHREAD_STACK_MIN;
/* threads limit to tcb_s->group->tg_nmembers(unint_8) */
case _SC_THREAD_THREADS_MAX:
return UINT8_MAX;
default:
#if 0 /* Assume valid but not implemented for the time being */
errcode = EINVAL;
#else
errcode = ENOSYS;
#endif
break;
}
set_errno(errcode);
return ERROR;
}