This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 35c6d67743e include/limits.h: decouple _POSIX_* invariant constants
from Kconfig
35c6d67743e is described below
commit 35c6d67743e1b6dfd6fe4dee6cc78ef2ba7e2a5c
Author: Swatantra Yadav <[email protected]>
AuthorDate: Sun Oct 18 04:28:25 2026 +0530
include/limits.h: decouple _POSIX_* invariant constants from Kconfig
According to IEEE Std 1003.1 (POSIX), constants prefixed with _POSIX_*
and _POSIX2_* are invariant minimum values guaranteed by the standard,
not configurable implementation limits.
1. include/limits.h:
- Restore _POSIX_* and _POSIX2_* constants to standard-defined
invariant minimums (e.g. _POSIX_NAME_MAX = 14, _POSIX_PATH_MAX = 256,
_POSIX_ARG_MAX = 4096, _POSIX2_LINE_MAX = 2048, _POSIX_OPEN_MAX = 20).
- Direct implementation limits (NAME_MAX, PATH_MAX, ARG_MAX, LINE_MAX,
OPEN_MAX, NGROUPS_MAX, AIO_LISTIO_MAX) to their Kconfig values.
- Align STREAM_MAX with OPEN_MAX and provide fallback CONFIG_PATH_MAX
of at least 256 so implementation limits satisfy POSIX invariants.
- Define CLOCK_MAX with 64-bit fallback (int64_t clock_t).
2. include/stdio.h:
- Include <limits.h> and define FILENAME_MAX as PATH_MAX and
FOPEN_MAX as STREAM_MAX to align published stream and file limits.
3. include/sched.h:
- Guard PTHREAD_KEYS_MAX with #ifndef to avoid redefinition.
4. include/unistd.h:
- Set _POSIX_GETPW_R_SIZE_MAX to invariant 1024.
5. fs/vfs/fs_link.c:
- Check link count against LINK_MAX instead of _POSIX_LINK_MAX.
6. sched/mqueue/mqueue.h:
- Set MQ_PRIO_MAX to UCHAR_MAX instead of _POSIX_MQ_PRIO_MAX.
7. libs/libc/unistd/lib_pathconf.c & lib_sysconf.c:
- Query runtime implementation limits (NAME_MAX, PIPE_BUF, AIO_MAX,
CONFIG_LIBC_PASSWD_LINESIZE).
Resolves #15464.
Signed-off-by: Swatantra Yadav <[email protected]>
---
fs/vfs/fs_link.c | 3 +-
include/limits.h | 288 +++++++++++++++++-----------------------
include/sched.h | 4 +-
include/stdio.h | 5 +-
include/unistd.h | 4 +-
libs/libc/unistd/lib_pathconf.c | 4 +-
libs/libc/unistd/lib_sysconf.c | 6 +-
sched/mqueue/mqueue.h | 4 +-
8 files changed, 142 insertions(+), 176 deletions(-)
diff --git a/fs/vfs/fs_link.c b/fs/vfs/fs_link.c
index e31b73d2232..c142040af7e 100644
--- a/fs/vfs/fs_link.c
+++ b/fs/vfs/fs_link.c
@@ -30,6 +30,7 @@
#include <sys/stat.h>
#include <stdbool.h>
#include <unistd.h>
+#include <limits.h>
#include <assert.h>
#include <errno.h>
@@ -106,7 +107,7 @@ int link(FAR const char *path1, FAR const char *path2)
goto errout_with_search_path1;
}
- if (INODE_GET_NLINK(target) >= _POSIX_LINK_MAX)
+ if (INODE_GET_NLINK(target) >= LINK_MAX)
{
/* Too many links to the target inode */
diff --git a/include/limits.h b/include/limits.h
index 974adc855fa..cbdbcb5c974 100644
--- a/include/limits.h
+++ b/include/limits.h
@@ -50,11 +50,7 @@
*/
#ifndef CONFIG_PATH_MAX
-# if CONFIG_NAME_MAX < 64
-# define CONFIG_PATH_MAX (4*CONFIG_NAME_MAX + 1)
-# else
-# define CONFIG_PATH_MAX 256
-# endif
+# define CONFIG_PATH_MAX 256
#endif
/* Maximum length of any multibyte character in any locale.
@@ -64,183 +60,143 @@
#define MB_LEN_MAX 4
-/* Configurable limits required by POSIX ************************************
- *
- * Required for all implementations:
- *
- * _POSIX_ARG_MAX Total length of string arguments
- * _POSIX_CHILD_MAX Number of child tasks active
- * _POSIX_LINK_MAX The number of links a file can have
- * _POSIX_MAX_CANON Number bytes in TTY canonical input queue
- * _POSIX_MAX_INPUT Number bytes in TTY canonical input queue
- * _POSIX_NAME_MAX Number of bytes in a file or pathname component
- * _POSIX_NGROUPS_MAX Number supplementary group IDs
- * _POSIX_OPEN_MAX Number of files a task can have open at once
- * _POSIX_PATH_MAX Number of bytes in a full pathname
- * (including NULL)
- * _POSIX_PIPE_BUF Number of bytes for atomic write into pipe
- * _POSIX_SSIZE_MAX Largest filesystem write; also max value
- * of ssize_t
- * _POSIX_STREAM_MAX Number of std I/O streams open at once
- * _POSIX_TZNAME_MAX Max number of bytes of a timezone name
- *
- * Required for sigqueue
- *
- * _POSIX_RTSIG_MAX Number of realtime signals reserved
- * for application
- * _POSIX_SIGQUEUE_MAX Max number signals a task can queue
- *
- * Required for POSIX timers
- *
- * _POSIX_DELAYTIMER_MAX Max number timer overruns
- * _POSIX_TIMER_MAX Max number of timers per task
- * _POSIX_CLOCKRES_MIN Clock resolution in nanoseconds
- *
- * Required for asynchronous I/O
- *
- * _POSIX_AIO_LISTIO_MAX Max number of AIOs in single listio call
- * _POSIX_AIO_MAX Max number of simultaneous AIO operations
- *
- * Required for POSIX message passing
- *
- * _POSIX_MQ_OPEN_MAX Max number message queues task may open (mq_open)
- * _POSIX_MQ_PRIO_MAX Max message priority (mq_send)
- *
- * Required for POSIX semaphores
- *
- * _POSIX_SEM_NSEMS_MAX Max number of open semaphores per task
- * _POSIX_SEM_VALUE_MAX Max value a semaphore may have
- *
- * Required for symbolic links
- * _POSIX_SYMLOOP_MAX Maximum number of symbolic links that can be
- * reliably traversed in the resolution of a pathname
- * in the absence of a loop.
- *
- */
-
-#define _POSIX_ARG_MAX CONFIG_TASK_ARG_MAX
-#define _POSIX_CHILD_MAX 6
-#define _POSIX_LINK_MAX 8
-#define _POSIX_MAX_CANON 255
-#define _POSIX_MAX_INPUT 255
-#define _POSIX_NAME_MAX CONFIG_NAME_MAX
-#if defined(CONFIG_SCHED_NGROUPS) && CONFIG_SCHED_NGROUPS > 0
-# define _POSIX_NGROUPS_MAX CONFIG_SCHED_NGROUPS
+/* Invariant minimum values required by POSIX *******************************/
+
+#define _POSIX_AIO_LISTIO_MAX 2
+#define _POSIX_AIO_MAX 1
+#define _POSIX_ARG_MAX 4096
+#define _POSIX_CHILD_MAX 25
+#define _POSIX_CLOCKRES_MIN 20000000
+#define _POSIX_DELAYTIMER_MAX 32
+#define _POSIX_HOST_NAME_MAX 255
+#define _POSIX_LINK_MAX 8
+#define _POSIX_LOGIN_NAME_MAX 9
+#define _POSIX_MAX_CANON 255
+#define _POSIX_MAX_INPUT 255
+#define _POSIX_MQ_OPEN_MAX 8
+#define _POSIX_MQ_PRIO_MAX 32
+#define _POSIX_NAME_MAX 14
+#define _POSIX_NGROUPS_MAX 8
+#define _POSIX_OPEN_MAX 20
+#define _POSIX_PATH_MAX 256
+#define _POSIX_PIPE_BUF 512
+#define _POSIX_RE_DUP_MAX 255
+#define _POSIX_RTSIG_MAX 8
+#define _POSIX_SEM_NSEMS_MAX 256
+#define _POSIX_SEM_VALUE_MAX 32767
+#define _POSIX_SIGQUEUE_MAX 32
+#define _POSIX_STREAM_MAX 8
+#define _POSIX_SYMLINK_MAX 255
+#define _POSIX_SYMLOOP_MAX 8
+#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4
+#if defined(CONFIG_TLS_NELEM) && CONFIG_TLS_NELEM >= 128
+# define _POSIX_THREAD_KEYS_MAX 128
+#elif defined(CONFIG_TLS_NELEM)
+# define _POSIX_THREAD_KEYS_MAX CONFIG_TLS_NELEM
#else
-# define _POSIX_NGROUPS_MAX 0
+# define _POSIX_THREAD_KEYS_MAX 0
#endif
-#define _POSIX_OPEN_MAX 16
-#define _POSIX_PATH_MAX CONFIG_PATH_MAX
-#define _POSIX_PIPE_BUF 512
-#define _POSIX_STREAM_MAX 16
-#define _POSIX_TZNAME_MAX 3
-#define _POSIX2_LINE_MAX CONFIG_LINE_MAX
+#define _POSIX_THREAD_THREADS_MAX 64
+#define _POSIX_TIMER_MAX 32
+#define _POSIX_TTY_NAME_MAX 9
+#define _POSIX_TZNAME_MAX 6
+
+#define _POSIX2_BC_BASE_MAX 99
+#define _POSIX2_BC_DIM_MAX 2048
+#define _POSIX2_BC_SCALE_MAX 99
+#define _POSIX2_BC_STRING_MAX 1000
+#define _POSIX2_CHARCLASS_NAME_MAX 14
+#define _POSIX2_COLL_WEIGHTS_MAX 2
+#define _POSIX2_EXPR_NEST_MAX 32
+#define _POSIX2_LINE_MAX 2048
+#define _POSIX2_RE_DUP_MAX 255
#ifdef CONFIG_SMALL_MEMORY
-#define _POSIX_SIZE_MAX 65535 /* See sys/types.h */
-#define _POSIX_SIZE_MIN 0
+#define _POSIX_SIZE_MAX 65535 /* See
sys/types.h */
+#define _POSIX_SIZE_MIN 0
-#define _POSIX_SSIZE_MAX 32767 /* See sys/types.h */
-#define _POSIX_SSIZE_MIN -32768
+#define _POSIX_SSIZE_MAX 32767 /* See
sys/types.h */
+#define _POSIX_SSIZE_MIN -32768
#else /* CONFIG_SMALL_MEMORY */
-#define _POSIX_SIZE_MAX ULONG_MAX
-#define _POSIX_SIZE_MIN 0
+#define _POSIX_SIZE_MAX ULONG_MAX
+#define _POSIX_SIZE_MIN 0
-#define _POSIX_SSIZE_MAX LONG_MAX
-#define _POSIX_SSIZE_MIN LONG_MIN
+#define _POSIX_SSIZE_MAX LONG_MAX
+#define _POSIX_SSIZE_MIN LONG_MIN
#endif /* CONFIG_SMALL_MEMORY */
-/* Required for sigqueue */
-
-#define _POSIX_RTSIG_MAX 8 /* Number of reserved realtime signals */
-#define _POSIX_SIGQUEUE_MAX 32
-
-/* Required for symbolic links */
-
-#define _POSIX_SYMLOOP_MAX 8
-
-/* Required for POSIX timers.
- *
- * _POSIX_DELAYTIMER_MAX is the number of timer expiration overruns.
- *
- * _POSIX_TIMER_MAX is the per-process number of timers.
- *
- * _POSIX_CLOCKRES_MIN is the resolution of the CLOCK_REALTIME clock in
- * nanoseconds. CLOCK_REALTIME is controlled by the NuttX system time.
- * The default value is the system timer which has a resolution of 1000
- * microseconds. This default setting can be overridden by defining the
- * clock interval in microseconds as CONFIG_USEC_PER_TICK in the NuttX
- * configuration file.
+/* Numerical limits. These values may be increased from the POSIX minimum
+ * values above or made indeterminate
*/
-#define _POSIX_DELAYTIMER_MAX 32
-#define _POSIX_TIMER_MAX 32
+#ifdef CONFIG_TASK_ARG_MAX
+# define ARG_MAX CONFIG_TASK_ARG_MAX
+#else
+# define ARG_MAX _POSIX_ARG_MAX
+#endif
-#ifdef CONFIG_USEC_PER_TICK
-# define _POSIX_CLOCKRES_MIN ((CONFIG_USEC_PER_TICK)*1000)
+#define CHILD_MAX _POSIX_CHILD_MAX
+
+#ifdef CONFIG_LINE_MAX
+# define LINE_MAX CONFIG_LINE_MAX
#else
-# define _POSIX_CLOCKRES_MIN (10*1000000)
+# define LINE_MAX _POSIX2_LINE_MAX
#endif
-/* Required for asynchronous I/O */
+#define LINK_MAX 128
+#define MAX_CANON _POSIX_MAX_CANON
+#define MAX_INPUT _POSIX_MAX_INPUT
+#define NAME_MAX CONFIG_NAME_MAX
+#define TTY_NAME_MAX NAME_MAX
-#define _POSIX_AIO_LISTIO_MAX CONFIG_FS_AIO_LISTIO_MAX
-#define _POSIX_AIO_MAX 1
+#if defined(CONFIG_SCHED_NGROUPS) && CONFIG_SCHED_NGROUPS > 0
+# define NGROUPS_MAX CONFIG_SCHED_NGROUPS
+#else
+# define NGROUPS_MAX 0
+#endif
-/* Required for POSIX message passing */
+#if defined(CONFIG_LIBC_OPEN_MAX) && CONFIG_LIBC_OPEN_MAX > 0
+# define OPEN_MAX CONFIG_LIBC_OPEN_MAX
+#else
+# define OPEN_MAX _POSIX_OPEN_MAX
+#endif
-#define _POSIX_MQ_OPEN_MAX 8
-#define _POSIX_MQ_PRIO_MAX UCHAR_MAX
+#define PATH_MAX CONFIG_PATH_MAX
+#define PIPE_BUF _POSIX_PIPE_BUF
+#define SIZE_MAX _POSIX_SIZE_MAX
+#define SIZE_MIN _POSIX_SIZE_MIN
+#define RSIZE_MAX _POSIX_SIZE_MAX
+#define SSIZE_MAX _POSIX_SSIZE_MAX
+#define SSIZE_MIN _POSIX_SSIZE_MIN
+#define STREAM_MAX OPEN_MAX
+#define TZNAME_MAX _POSIX_TZNAME_MAX
+#define TZ_MAX_TIMES CONFIG_LIBC_TZ_MAX_TIMES
+#define TZ_MAX_TYPES CONFIG_LIBC_TZ_MAX_TYPES
-/* Required for POSIX semaphores */
+#define RTSIG_MAX 32
+#define SIGQUEUE_MAX _POSIX_SIGQUEUE_MAX
-#define _POSIX_SEM_NSEMS_MAX INT_MAX
-#define _POSIX_SEM_VALUE_MAX INT_MAX
+#define SYMLINK_MAX _POSIX_SYMLINK_MAX
+#define SYMLOOP_MAX _POSIX_SYMLOOP_MAX
-/* Numerical limits. These values may be increased from the POSIX minimum
- * values above or made indeterminate
- */
+#define DELAYTIMER_MAX _POSIX_DELAYTIMER_MAX
+#define TIMER_MAX _POSIX_TIMER_MAX
-#define ARG_MAX _POSIX_ARG_MAX
-#define CHILD_MAX _POSIX_CHILD_MAX
-#define LINE_MAX _POSIX2_LINE_MAX
-#define LINK_MAX 128
-#define MAX_CANON _POSIX_MAX_CANON
-#define MAX_INPUT _POSIX_MAX_INPUT
-#define NAME_MAX _POSIX_NAME_MAX
-#define TTY_NAME_MAX _POSIX_NAME_MAX
-#define NGROUPS_MAX _POSIX_NGROUPS_MAX
-#if CONFIG_LIBC_OPEN_MAX < _POSIX_OPEN_MAX
-# define OPEN_MAX _POSIX_OPEN_MAX
+#ifdef CONFIG_USEC_PER_TICK
+# define CLOCKRES_MIN ((CONFIG_USEC_PER_TICK)*1000)
#else
-# define OPEN_MAX CONFIG_LIBC_OPEN_MAX
+# define CLOCKRES_MIN (10*1000000)
#endif
-#define PATH_MAX _POSIX_PATH_MAX
-#define PIPE_BUF _POSIX_PIPE_BUF
-#define SIZE_MAX _POSIX_SIZE_MAX
-#define SIZE_MIN _POSIX_SIZE_MIN
-#define RSIZE_MAX _POSIX_SIZE_MAX
-#define SSIZE_MAX _POSIX_SSIZE_MAX
-#define SSIZE_MIN _POSIX_SSIZE_MIN
-#define STREAM_MAX _POSIX_STREAM_MAX
-#define TZNAME_MAX _POSIX_TZNAME_MAX
-#define TZ_MAX_TIMES CONFIG_LIBC_TZ_MAX_TIMES
-#define TZ_MAX_TYPES CONFIG_LIBC_TZ_MAX_TYPES
-
-#define RTSIG_MAX 32
-#define SIGQUEUE_MAX _POSIX_SIGQUEUE_MAX
-
-#define SYMLOOP_MAX _POSIX_SYMLOOP_MAX
-
-#define DELAYTIMER_MAX _POSIX_DELAYTIMER_MAX
-#define TIMER_MAX _POSIX_TIMER_MAX
-#define CLOCKRES_MIN _POSIX_CLOCKRES_MIN
-#define CLOCK_MAX INT64_MAX
+#ifdef INT64_MAX
+# define CLOCK_MAX INT64_MAX
+#else
+# define CLOCK_MAX LLONG_MAX
+#endif
/* Other invariant values */
@@ -291,34 +247,38 @@
* _POSIX2_LINE_MAX
*/
-#define NL_TEXTMAX _POSIX2_LINE_MAX
+#define NL_TEXTMAX _POSIX2_LINE_MAX
/* NZERO
* Default process priority. Minimum Acceptable Value: 100
*/
-#define NZERO SCHED_PRIORITY_DEFAULT
+#define NZERO SCHED_PRIORITY_DEFAULT
/* Required for asynchronous I/O */
-#define AIO_LISTIO_MAX _POSIX_AIO_LISTIO_MAX
-#define AIO_MAX _POSIX_AIO_MAX
+#ifdef CONFIG_FS_AIO_LISTIO_MAX
+# define AIO_LISTIO_MAX CONFIG_FS_AIO_LISTIO_MAX
+#else
+# define AIO_LISTIO_MAX _POSIX_AIO_LISTIO_MAX
+#endif
+#define AIO_MAX _POSIX_AIO_MAX
/* Required for POSIX message passing */
-#define MQ_OPEN_MAX _POSIX_MQ_OPEN_MAX
-#define MQ_PRIO_MAX _POSIX_MQ_PRIO_MAX
+#define MQ_OPEN_MAX 8
+#define MQ_PRIO_MAX UCHAR_MAX
/* Required for POSIX semaphores */
-#define SEM_NSEMS_MAX _POSIX_SEM_NSEMS_MAX
-#define SEM_VALUE_MAX _POSIX_SEM_VALUE_MAX
+#define SEM_NSEMS_MAX INT_MAX
+#define SEM_VALUE_MAX INT_MAX
/* Required for POSIX pthread management */
-#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4
-#define _POSIX_THREAD_KEYS_MAX CONFIG_TLS_NELEM
-#define _POSIX_THREAD_THREADS_MAX 64
+#ifndef PTHREAD_KEYS_MAX
+# define PTHREAD_KEYS_MAX CONFIG_TLS_NELEM
+#endif
/* Required for readv() and writev() */
diff --git a/include/sched.h b/include/sched.h
index 9fa907af2f5..7b29d8a3a40 100644
--- a/include/sched.h
+++ b/include/sched.h
@@ -69,7 +69,9 @@
/* Pthread definitions ******************************************************/
-#define PTHREAD_KEYS_MAX CONFIG_TLS_NELEM
+#ifndef PTHREAD_KEYS_MAX
+# define PTHREAD_KEYS_MAX CONFIG_TLS_NELEM
+#endif
/* CPU affinity mask helpers ************************************************/
diff --git a/include/stdio.h b/include/stdio.h
index 00487311ee9..0061ee435ec 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -32,6 +32,7 @@
#include <sys/types.h>
#include <stdarg.h>
#include <time.h>
+#include <limits.h>
#include <nuttx/mutex.h>
#include <nuttx/queue.h>
@@ -51,8 +52,8 @@
/* File System Definitions **************************************************/
-#define FILENAME_MAX _POSIX_NAME_MAX
-#define FOPEN_MAX _POSIX_STREAM_MAX
+#define FILENAME_MAX PATH_MAX
+#define FOPEN_MAX STREAM_MAX
/* The (default) size of the I/O buffers */
diff --git a/include/unistd.h b/include/unistd.h
index a929f02fa65..8ab4726711d 100644
--- a/include/unistd.h
+++ b/include/unistd.h
@@ -59,9 +59,7 @@
#undef _POSIX_MEMLOCK_RANGE
#undef _POSIX_FSYNC
#define _POSIX_SYNCHRONIZED_IO 1
-#ifdef CONFIG_LIBC_PASSWD_LINESIZE
-# define _POSIX_GETPW_R_SIZE_MAX CONFIG_LIBC_PASSWD_LINESIZE
-#endif
+#define _POSIX_GETPW_R_SIZE_MAX 1024
#define _POSIX_VERSION 201712L
#define _POSIX_PRIORITIZED_IO _POSIX_VERSION
diff --git a/libs/libc/unistd/lib_pathconf.c b/libs/libc/unistd/lib_pathconf.c
index e6ccd45f521..394d158f616 100644
--- a/libs/libc/unistd/lib_pathconf.c
+++ b/libs/libc/unistd/lib_pathconf.c
@@ -125,10 +125,10 @@ long fpathconf(int fildes, int name)
return LINK_MAX;
case _PC_NAME_MAX:
- return _POSIX_NAME_MAX;
+ return NAME_MAX;
case _PC_PIPE_BUF:
- return _POSIX_PIPE_BUF;
+ return PIPE_BUF;
case _PC_MAX_CANON:
return _POSIX_MAX_CANON;
diff --git a/libs/libc/unistd/lib_sysconf.c b/libs/libc/unistd/lib_sysconf.c
index a52e946f841..f05e171cb7b 100644
--- a/libs/libc/unistd/lib_sysconf.c
+++ b/libs/libc/unistd/lib_sysconf.c
@@ -225,9 +225,11 @@ long sysconf(int name)
case _SC_PRIORITIZED_IO:
return _POSIX_PRIORITIZED_IO;
case _SC_AIO_MAX:
- return _POSIX_AIO_MAX;
-#ifdef CONFIG_LIBC_PASSWD_LINESIZE
+ return AIO_MAX;
case _SC_GETPW_R_SIZE_MAX:
+#ifdef CONFIG_LIBC_PASSWD_LINESIZE
+ return CONFIG_LIBC_PASSWD_LINESIZE;
+#else
return _POSIX_GETPW_R_SIZE_MAX;
#endif
case _SC_CPUTIME:
diff --git a/sched/mqueue/mqueue.h b/sched/mqueue/mqueue.h
index 27aa681319b..1f18ec6a2a4 100644
--- a/sched/mqueue/mqueue.h
+++ b/sched/mqueue/mqueue.h
@@ -48,7 +48,9 @@
#define MQ_MAX_BYTES CONFIG_MQ_MAXMSGSIZE
#define MQ_MAX_MSGS 16
-#define MQ_PRIO_MAX _POSIX_MQ_PRIO_MAX
+#ifndef MQ_PRIO_MAX
+# define MQ_PRIO_MAX UCHAR_MAX
+#endif
#define MQ_MSG_SIZE(n) (sizeof(struct mqueue_msg_s) + (n) - 1)