# Copyright (c) 2018 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

source "lib/posix/getopt/Kconfig"

config POSIX_MAX_FDS
	int "Maximum number of open file descriptors"
	default 16 if POSIX_API
	default 4
	help
	  Maximum number of open file descriptors, this includes
	  files, sockets, special devices, etc.

config POSIX_API
	depends on !ARCH_POSIX
	bool "POSIX APIs"
	help
	  Enable mostly-standards-compliant implementations of
	  various POSIX (IEEE 1003.1) APIs.

config PTHREAD_IPC
	bool "POSIX pthread IPC API"
	default y if POSIX_API
	depends on POSIX_CLOCK
	help
	  This enables a mostly-standards-compliant implementation of
	  the pthread mutex, condition variable and barrier IPC
	  mechanisms.

if PTHREAD_IPC
config MAX_PTHREAD_COUNT
	int "Maximum simultaneously active pthread count in POSIX application"
	default 5
	range 0 255
	help
	  Maximum number of simultaneously active threads in a POSIX application.

config SEM_VALUE_MAX
	int "Maximum semaphore limit"
	default 32767
	range 1 32767
	help
	  Maximum semaphore count in POSIX compliant Application.

endif # PTHREAD_IPC

config POSIX_CLOCK
	bool "POSIX clock, timer, and sleep APIs"
	default y if POSIX_API
	help
	  This enables POSIX clock\_\*(), timer\_\*(), and \*sleep()
	  functions.

config MAX_TIMER_COUNT
	int "Maximum timer count in POSIX application"
	default 5
	range 0 255
	help
	  Mention maximum number of timers in POSIX compliant application.

config POSIX_MQUEUE
	bool "POSIX message queue"
	default y if POSIX_API
	help
	  This enabled POSIX message queue related APIs.

if POSIX_MQUEUE
config MSG_COUNT_MAX
	int "Maximum number of messages in message queue"
	default 16
	help
	  Mention maximum number of messages in message queue in POSIX compliant
	  application.

config MSG_SIZE_MAX
	int "Maximum size of a message"
	default 16
	help
	  Mention maximum size of message in bytes.

config MQUEUE_NAMELEN_MAX
	int "Maximum size of a name length"
	default 16
	range 2 255
	help
	  Mention length of message queue name in number of characters.

endif

config POSIX_FS
	bool "POSIX file system API support"
	default y if POSIX_API
	depends on FILE_SYSTEM
	help
	  This enables POSIX style file system related APIs.

config POSIX_MAX_OPEN_FILES
	int "Maximum number of open file descriptors"
	default 16
	depends on POSIX_FS
	help
	  Maximum number of open files. Note that this setting
	  is additionally bounded by CONFIG_POSIX_MAX_FDS.

# The name of this option is mandated by zephyr_interface_library_named
# cmake directive.
config APP_LINK_WITH_POSIX_SUBSYS
	bool "Make POSIX headers available to application"
	default y
	depends on POSIX_API
	help
	  Add POSIX subsystem header files to the 'app' include path.

config EVENTFD
	bool "Support for eventfd"
	depends on !ARCH_POSIX
	help
	  Enable support for event file descriptors, eventfd. An eventfd can
	  be used as an event wait/notify mechanism together with POSIX calls
	  like read, write and poll.

config EVENTFD_MAX
	int "Maximum number of eventfd's"
	depends on EVENTFD
	default 1
	range 1 4096
	help
	  The maximum number of supported event file descriptors.
