#
# For a description of the syntax of this configuration file,
# see kconfig-language at https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt
#

comment "Standard C Library Options"

config STDIO_BUFFER_SIZE
	int "C STDIO buffer size"
	default 64
	---help---
		Size of buffers using within the C buffered I/O interfaces (printf,
		putchar, fwrite, etc.).  This function sets the initial I/O buffer
		size.  Zero disables I/O buffering.  That size may be subsequently
		modified using setvbuf().

config STDIO_LINEBUFFER
	bool "STDIO line buffering"
	default y
	---help---
		Flush buffer I/O whenever a newline character is found in
		the output data stream.

config NUNGET_CHARS
	int "Number unget() characters"
	default 2
	---help---
		Number of characters that can be buffered by ungetc() (Only if NFILE_STREAMS > 0)

config LIB_HOMEDIR
	string "Home directory"
	default "/"
	depends on !DISABLE_ENVIRON
	---help---
		The home directory to use with operations like such as 'cd ~'

source "$LIBDIR/libc/math/Kconfig"

config NOPRINTF_FIELDWIDTH
	bool "Disable sprintf support fieldwidth"
	default n
	---help---
		sprintf-related logic is a little smaller if we do not support field
		widths.

config LIBC_FLOATINGPOINT
	bool "Enable floating point in printf"
	depends on LIBM
	default n
	---help---
		By default, floating point
		support in printf, sscanf, etc. is disabled.

config NOPRINTF_LONGLONG_TO_ASCII
	bool "Disable long long type in printf"
	default n
	---help---
		sprintf-related logic is a little smaller if we do not support long long type
		conversion

config LIBC_IOCTL_VARIADIC
	bool "Enable variadic ioctl()"
	default n
	---help---
		By default, TinyAra implements the "old style," three-parameter,
		ioctl() interface with this function prototype:

			int ioctl(int fd, int req, unsigned long arg);

		That function is implemented as part of the VFS.  If
		LIBC_IOCTL_VARIADIC is selected, then an additional compatibility
		layer will be provided in the C library.  The enabled, then function
		prototype will become:

			int ioctl(int fd, int req, ...);

		The ioctl() is not controlled by any standard so it is really
		arbitrary which format you used.  You may select the variadic
		function prototype with this option.  That will slightly increase
		code size and ioctl() processing time.  It will not support a
		variable number of arguments and it still always expects to see a
		third argument of type 'unsigned long'.  The only benefit of this
		alternative function signature is that it may provide greater
		compatibility if you are porting code from other platforms that use
		the variadic ioctl() function.

		WARNING:  Use of this option could cause subtle system errors is
		the third argument is omitted or if the sizeof the thread argument
		is anything other than sizeof (unsigned long).  Most small integers
		will be promoted to 'int'.  The following assertion appears in ioctl():

			DEBUGASSERT(sizeof(int)        == sizeof(unsigned long) &&
			            sizeof(FAR void *) == sizeof(unsigned long));

		Do not enable this option if the above is not true.  32-bit ARM
		should pass this test with all three types having sizeof(type) == 4
		bytes.  'float' should also be tested.  But 'long long' and 'double'
		are out of the question!  Don't event try to pass them.

		And what will happen if no third argument is passed?  In most cases,
		this should just result in a garbage value for arg.  But you may
		discover cases where something worse happens!

config LIB_RAND_ORDER
	int "Order of the random number generate"
	default 1
	range 1 3
	---help---
		The order of the random number generator. 1=fast but very bad random
		numbers, 3=slow but very good random numbers.

choice
	prompt "Newline Options"
	default EOL_IS_EITHER_CRLF
	---help---
		This selection determines the line terminating character that is used.
		Some environments may return CR as end-of-line, others LF, and others
		both.  If not specified, the default is either CR or LF (but not both)
		as the line terminating charactor.

config EOL_IS_CR
	bool "EOL is CR"

config EOL_IS_LF
	bool "EOL is LF"

config EOL_IS_BOTH_CRLF
	bool "EOL is CR and LF"

config EOL_IS_EITHER_CRLF
	bool "EOL is CR or LF"

endchoice

config POSIX_SPAWN_PROXY_STACKSIZE
	int "Spawn Stack Size"
	default 1024
	---help---
		If posix_spawn[p]() and task_spawn() use I/O redirection options,
		they will require an intermediary/proxy task to muck with the file
		descriptors.  This configuration item specifies the stack size
		used for the proxy. Default: 1024 bytes.

config TASK_SPAWN_DEFAULT_STACKSIZE
	int "Default task_spawn Stack Size"
	default 2048
	depends on !ARCH_ADDRENV
	---help---
		The actual size to use for the child task's stack can be set with
		task_spawnattr_setstacksize().  This value specifies the default
		stack size to use if task_spawnattr_setstacksize() is not used.
		Default: 2048.

config LIBC_STRERROR
	bool "Enable strerror"
	default n
	---help---
		strerror() is useful because it decodes 'errno' values into a human readable
		strings.  But it can also require a lot of memory.  If this option is selected,
		strerror() will still exist in the build but it will not decode error values.
		This option should be used by other logic to decide if it should use strerror()
		or not.  For example, the NSH application will not use strerror() if this
		option is not selected; perror() will not use strerror() is this option is not
		selected (see also NSH_STRERROR).

config LIBC_STRERROR_SHORT
	bool "Use short error descriptions in strerror()"
	default n
	depends on LIBC_STRERROR
	---help---
		If this option is selected, then strerror() will use a shortened string when
		it decodes the error.  Specifically, strerror() is simply use the string that
		is the common name for the error.  For example, the 'errno' value of 2 will
		produce the string "No such file or directory" is LIBC_STRERROR_SHORT
		is not defined but the string "ENOENT" is LIBC_STRERROR_SHORT is defined.

config LIBC_PERROR_STDOUT
	bool "perror() to stdout"
	default n
	---help---
		POSIX requires that perror() provide its output on stderr.  This option may
		be defined, however, to provide perror() output that is serialized with
		other stdout messages.

config LIBC_TMPDIR
	string "Temporary file directory"
	default "/tmp"
	depends on FS_WRITABLE
		---help---
		If a write-able file system is selected, this string will be
		provided to specify the full path to a directory where temporary
		files can be created.  This would be a good application of RAM disk:
		To provide temporary storage for application data.

config LIBC_MAX_TMPFILE
	int "Maximum size of a temporary file path"
	default 32
	depends on FS_WRITABLE
		---help---
		If a write-able file system is selected, then temporary file may be
		supported at the path provided by LIBC_TMPDIR.  The tmpnam() interface
		keeps a static copy of this last filename produced; this value is the
		maximum size of that last filename.  This size is the size of the full
		file path.

config ARCH_LOWPUTC
	bool "Low-level console output"
	default "y"
	---help---
		architecture supports low-level, boot time console output

config LIBC_LOCALTIME
	bool "localtime API call support"
	default "n"
	depends on !DISABLE_ENVIRON
	---help---
		localtime API call support

config TIME_EXTENDED
	bool "enable time extended"
	default "n"
	depends on !LIBC_LOCALTIME

if LIBC_LOCALTIME

config LIBC_TZ_MAX_TIMES
	int "Maximum number of times in timezone"
	default 8

config LIBC_TZ_MAX_TYPES
	int "Maximum number of TZ types"
	default 8

config LIBC_TZDIR
	string "zoneinfo directory path"
	default "/etc/zoneinfo"

endif

config LIB_SENDFILE_BUFSIZE
	int "sendfile() buffer size"
	default 512
	---help---
		Size of the I/O buffer to allocate in sendfile().  Default: 512b

config ARCH_HAVE_ROMGETC
	bool

config ARCH_ROMGETC
	bool "Support for ROM string access"
	default n
	depends on ARCH_HAVE_ROMGETC
	---help---
		In Harvard architectures, data accesses and instruction accesses
		occur on different buses, perhaps concurrently.  All data accesses
		are performed on the data bus unless special machine instructions
		are used to read data from the instruction address space.  Also, in
		the typical MCU, the available SRAM data memory is much smaller that
		the non-volatile FLASH instruction memory.  So if the application
		requires many constant strings, the only practical solution may be
		to store those constant strings in FLASH memory where they can only
		be accessed using architecture-specific machine instructions.

		If ARCH_ROMGETC is defined, then the architecture logic must export
		the function up_romgetc().  up_romgetc() will simply read one byte
		of data from the instruction space.

		If ARCH_ROMGETC is selected, certain C stdio functions are effected: (1)
		All format strings in printf, fprintf, sprintf, etc. are assumed to lie
		in FLASH (string arguments for %s are still assumed to reside in SRAM).
		And (2), the string argument to puts and fputs is assumed to reside
		in FLASH.  Clearly, these assumptions may have to modified for the
		particular needs of your environment.  There is no "one-size-fits-all"
		solution for this problem.

config ARCH_OPTIMIZED_FUNCTIONS
	bool "Enable arch optimized functions"
	default n
	---help---
		Allow for architecture optimized implementations of certain library
		functions.  Architecture-specific implementations can improve overall
		system performance.

if ARCH_OPTIMIZED_FUNCTIONS

config ARCH_MEMCPY
	bool "memcpy()"
	default n
	---help---
		Select this option if the architecture provides an optimized version
		of memcpy().

config MEMCPY_VIK
	bool "Vik memcpy()"
	default n
	depends on !ARCH_MEMCPY
	---help---
		Select this option to use the optimized memcpy() function by Daniel Vik.
		Select this option for improved performance at the expense of increased
		size. See licensing information in the top-level COPYING file.

if MEMCPY_VIK

config MEMCPY_PRE_INC_PTRS
	bool "Pre-increment pointers"
	default n
	---help---
		Use pre-increment of pointers. Default is post increment of pointers.

config MEMCPY_INDEXED_COPY
	bool "Array indexing"
	default y
	---help---
		Copying data using array indexing. Using this option, disables the
		MEMCPY_PRE_INC_PTRS option.

config MEMCPY_64BIT
	bool "64-bit memcpy()"
	default n
	---help---
		Compiles memcpy() for architectures that suppport 64-bit operations
		efficiently.

endif # MEMCPY_VIK

config ARCH_MEMCMP
	bool "memcmp()"
	default n
	---help---
		Select this option if the architecture provides an optimized version
		of memcmp().

config ARCH_MEMMOVE
	bool "memmove()"
	default n
	---help---
		Select this option if the architecture provides an optimized version
		of memmove().

config ARCH_MEMSET
	bool "memset()"
	default n
	---help---
		Select this option if the architecture provides an optimized version
		of memset().

config MEMSET_OPTSPEED
	bool "Optimize memset() for speed"
	default n
	depends on !ARCH_MEMSET
	---help---
		Select this option to use a version of memset() optimized for speed.
		Default: memset() is optimized for size.

config MEMSET_64BIT
	bool "64-bit memset()"
	default n
	depends on MEMSET_OPTSPEED
	---help---
		Compiles memset() for architectures that suppport 64-bit operations
		efficiently.

config ARCH_STRCHR
	bool "strchr()"
	default n
	---help---
		Select this option if the architecture provides an optimized version
		of strchr().

config ARCH_STRCMP
	bool "strcmp()"
	default n
	---help---
		Select this option if the architecture provides an optimized version
		of strcmp().

config ARCH_STRCPY
	bool "strcpy()"
	default n
	---help---
		Select this option if the architecture provides an optimized version
		of strcpy().

config ARCH_STRNCPY
	bool "strncpy()"
	default n
	---help---
		Select this option if the architecture provides an optimized version
		of strncpy().

config ARCH_STRLEN
	bool "strlen"
	default n
	---help---
		Select this option if the architecture provides an optimized version
		of strlen().

config ARCH_STRNLEN
	bool "strlen()"
	default n
	---help---
		Select this option if the architecture provides an optimized version
		of strnlen().

config ARCH_BZERO
	bool "bzero()"
	default n
	---help---
		Select this option if the architecture provides an optimized version
		of bzero().

endif # ARCH_OPTIMIZED_FUNCTIONS

config LIBC_NETDB
	bool "Support NetDB"
	default n

menuconfig NETDB_HOSTFILE
	bool "Network host file support"
	default n
	depends on FS_READABLE
	select LIBC_NETDB
	---help---
		Enable network host table look ups via gethostbyname() and
		gethostbyaddr().

if NETDB_HOSTFILE

config NETDB_HOSTCONF_PATH
	string "Path to host configuration file"
	default "/mnt/hosts"

config NETDB_MAX_ALTNAMES
	int "Max number of alternate host names"
	default 4

config NETDB_BUFSIZE
	int "gethostname() buffer size"
	default 128

endif # NETDB_HOSTFILE

menuconfig NETDB_DNSCLIENT
	bool "DNS Name resolution"
	default n
	depends on NET_LWIP
	select LIBC_NETDB
	---help---
		Enable support for the name resolution; Enable network host
		resolution via gethostbyname().

if NETDB_DNSCLIENT

config NETDB_DNSCLIENT_ENTRIES
	int "Number of DNS resolver entries"
	default 0 if DEFAULT_SMALL
	default 8 if !DEFAULT_SMALL
	range 0 255
	---help---
		Number of cached DNS resolver entries.  Default: 8.  Zero disables
		all cached name resolutions.

		Disabling the DNS cache means that each access call to
		gethostbyname() will result in a new DNS network query.  If
		CONFIG_NETDB_DNSCLIENT_ENTRIES is non-zero, then entries will be
		cached and if the name mapping can be found in that cache, the
		network query can be avoid.  Of course, this is only useful if you
		query the same name often and if the IP address of the name is
		stable.  If the IP address can change, then cachin DNS address
		might have undesirable side-effects (see help for
		CONFIG_NETDB_DNSCLIENT_LIFESEC).

config NETDB_DNSCLIENT_NAMESIZE
	int "Max size of a cached hostname"
	default 32
	---help---
		The size of a hostname string in the DNS resolver cache is fixed.
		This setting provides the maximum size of a hostname.  Names longer
		than this will be aliased!  Default: 32

config NETDB_DNSCLIENT_LIFESEC
	int "Life of a DNS cache entry (seconds)"
	default 3600
	---help---
		Cached entries in the name resolution cache older than this will not
		be used.  Default: 1 hour.  Zero means that entries will not expire.

		Small values of CONFIG_NETDB_DNSCLIENT_LIFESEC may result in more
		network DNS queries; larger values can make a host unreachable for
		the entire duration of the timeout value.  This might happen, for
		example, if the remote host was assigned a different IP address by
		a DHCP server.

config NETDB_DNSCLIENT_MAXRESPONSE
	int "Max response size"
	default 512
	---help---
		This setting determines the maximum size of response message that
		can be received by the DNS resolver.  The default is 96 but may
		need to be larger on enterprise networks (perhaps 176).

config NETDB_RESOLVCONF
	bool "DNS resolver file support"
	default n
	depends on FS_READABLE
	---help---
		Enable DNS server look ups in resolver file like /etc/resolv.conf.

if NETDB_RESOLVCONF

config NETDB_RESOLVCONF_PATH
	string "Path to host configuration file"
	default "/etc/resolv.conf"

config NETDB_RESOLVCONF_NONSTDPORT
	bool "Non-standard port support"
	default n
	---help---
		By default, the resolv.conf file will hold only records like:

			nameserver xx.xx.xx.xx
			nameserver xxxx:::::::xxxx

		The default port of 53 is always assumed.

		If this option is selected, then OpenBSD style resolv.conf files
		will be supported.  This adds logic for a bracket port notation
		like:

			nameserver [xx.xx.xx.xx]:ppppp
			nameserver [xxxx:::::::xxxx]:ppppp

endif # NETDB_RESOLVCONF

choice
	prompt "DNS server address type"
	default NETDB_DNSSERVER_IPv4 if NET_IPv4
	default NETDB_DNSSERVER_IPv6 if !NET_IPv4 && NET_IPv6
	default NETDB_DNSSERVER_BY_DHCP if !NET_IPv4 && !NET_IPv6
	depends on !NETDB_RESOLVCONF

config NETDB_DNSSERVER_BY_DHCP
	bool "DNS server address will be provided by DHCP"
	---help---
		There is not default DNS nameserver address. When DHCP client gets
		ip informations at runtime, it will be automatically added the DNS
		server address.

config NETDB_DNSSERVER_IPv4
	bool "IPv4 DNS server address"
	depends on NET_IPv4
	---help---
		An IPv4 default DNS nameserver address will be provided.  Application
		may overwrite this start default server address by calling
		dns_add_server() at runtime.

config NETDB_DNSSERVER_IPv6
	bool "IPv6 DNS server address"
	depends on NET_IPv6
	---help---
		An IPv6 default DNS nameserver address will be provided.  Application
		may overwrite this start default server address by calling
		dns_add_server() at runtime.

endchoice # DNS server address type

config NETDB_DNSSERVER_IPv4ADDR
	hex "Target IPv4 address"
	default 0x0a000001
	depends on NETDB_DNSSERVER_IPv4
	---help---
		Default DNS server IPv4 address in host byte order.  Default value
		10.0.0.0.1.  This may be changed via dns_add_nameserver().

if NETDB_DNSSERVER_IPv6

config NETDB_DNSSERVER_IPv6ADDR_1
	hex "[0]"
	default 0xfc00
	range 0x0 0xffff
	---help---
		This is the default IP address of the DNS server.  This is a 16-bit
		integer value in host order.  Each of the eight values forming the
		full IPv6 address must be specified individually.  This is the first
		of the 8-values.  The default for all eight values is fc00::1.

config NETDB_DNSSERVER_IPv6ADDR_2
	hex "[1]"
	default 0x0000
	range 0x0 0xffff
	---help---
		This is the default IP address of the DNS server.  This is a 16-bit
		integer value in host order.  Each of the eight values forming the
		full IPv6 address must be specified individually.  This is the second
		of the 8-values.  The default for all eight values is fc00::1.

config NETDB_DNSSERVER_IPv6ADDR_3
	hex "[2]"
	default 0x0000
	range 0x0 0xffff
	---help---
		This is the default IP address of the DNS server.  This is a 16-bit
		integer value in host order.  Each of the eight values forming the
		full IPv6 address must be specified individually.  This is the third
		of the 8-values.  The default for all eight values is fc00::1.

config NETDB_DNSSERVER_IPv6ADDR_4
	hex "[3]"
	default 0x0000
	range 0x0 0xffff
	---help---
		This is the default IP address of the DNS server.  This is a 16-bit
		integer value in host order.  Each of the eight values forming the
		full IPv6 address must be specified individually.  This is the fourth
		of the 8-values.  The default for all eight values is fc00::1.

config NETDB_DNSSERVER_IPv6ADDR_5
	hex "[4]"
	default 0x0000
	range 0x0 0xffff
	---help---
		This is the default IP address of the DNS server.  This is a 16-bit
		integer value in host order.  Each of the eight values forming the
		full IPv6 address must be specified individually.  This is the fifth
		of the 8-values.  The default for all eight values is fc00::1.

config NETDB_DNSSERVER_IPv6ADDR_6
	hex "[5]"
	default 0x0000
	range 0x0 0xffff
	---help---
		This is the default IP address of the DNS server.  This is a 16-bit
		integer value in host order.  Each of the eight values forming the
		full IPv6 address must be specified individually.  This is the sixth
		of the 8-values.  The default for all eight values is fc00::1.

config NETDB_DNSSERVER_IPv6ADDR_7
	hex "[6]"
	default 0x0000
	range 0x0 0xffff
	---help---
		This is the default IP address of the DNS server.  This is a 16-bit
		integer value in host order.  Each of the eight values forming the
		full IPv6 address must be specified individually.  This is the seventh
		of the 8-values.  The default for all eight values is fc00::1.

config NETDB_DNSSERVER_IPv6ADDR_8
	hex "[7]"
	default 0x0001
	range 0x0 0xffff
	---help---
		This is the default IP address of the DNS server.  This is a 16-bit
		integer value in host order.  Each of the eight values forming the
		full IPv6 address must be specified individually.  This is the last
		of the 8-values.  The default for all eight values is fc00::1.

endif # NETDB_DNSSERVER_IPv6
endif # NETDB_DNSCLIENT

comment "Non-standard Library Support"

if BUILD_PROTECTED || BUILD_KERNEL

config LIB_USRWORK
	bool "User mode worker thread"
	default y
	depends on !DISABLE_SIGNALS
	---help---
		User space work queues can also be made available for deferred
		processing in the TinyAra kernel build.

if LIB_USRWORK

config LIB_USRWORKPRIORITY
	int "User mode priority worker thread priority"
	default 100
	---help---
		The execution priority of the user-mode priority worker thread.  Default: 100

config LIB_USRWORKPERIOD
	int "User mode worker thread period"
	default 100000
	---help---
		How often the lower priority worker thread checks for work in units
		of microseconds. Default: 100*1000 (100 MS).

config LIB_USRWORKSTACKSIZE
	int "User mode worker thread stack size"
	default 2048
	---help---
		The stack size allocated for the lower priority worker thread.  Default: 2K.

endif # LIB_USRWORK
endif # BUILD_PROTECTED || BUILD_KERNEL
