#
# For a description of the syntax of this configuration file,
# see docs/Kconfig-language.txt.
#

comment "Library Tuning"

INSERT

choice
	prompt "Buffer allocation policy"
	default FEATURE_BUFFERS_USE_MALLOC
	help
	There are 3 ways busybox can handle buffer allocations:
	- Use malloc. This costs code size for the call to xmalloc.
	- Put them on stack. For some very small machines with limited stack
	space, this can be deadly. For most folks, this works just fine.
	- Put them in BSS. This works beautifully for computers with a real
	MMU (and OS support), but wastes runtime RAM for uCLinux. This
	behavior was the only one available for versions 0.48 and earlier.

config FEATURE_BUFFERS_USE_MALLOC
	bool "Allocate with Malloc"

config FEATURE_BUFFERS_GO_ON_STACK
	bool "Allocate on the Stack"

config FEATURE_BUFFERS_GO_IN_BSS
	bool "Allocate in the .bss section"

endchoice

config PASSWORD_MINLEN
	int "Minimum password length"
	default 6
	range 5 32
	help
	Minimum allowable password length.

config MD5_SMALL
	int "MD5: Trade bytes for speed (0:fast, 3:slow)"
	default 1  # all "fast or small" options default to small
	range 0 3
	help
	Trade binary size versus speed for the md5 algorithm.
	Approximate values running uClibc and hashing
	linux-2.4.4.tar.bz2 were:
	value           user times (sec)  text size (386)
	0 (fastest)     1.1               6144
	1               1.4               5392
	2               3.0               5088
	3 (smallest)    5.1               4912

config SHA1_SMALL
	int "SHA1: Trade bytes for speed (0:fast, 3:slow)"
	default 3  # all "fast or small" options default to small
	range 0 3
	help
	Trade binary size versus speed for the sha1 algorithm.
	With FEATURE_COPYBUF_KB=64:
	                throughput MB/s   size of sha1_process_block64
	value           486  x86-64       486   x86-64
	0               440  485          3481  3502
	1               265  265           641   696
	2,3             220  210           342   364

config SHA1_HWACCEL
	bool "SHA1: Use hardware accelerated instructions if possible"
	default y
	help
	On x86, this adds ~590 bytes of code. Throughput
	is about twice as fast as fully-unrolled generic code.

config SHA256_HWACCEL
	bool "SHA256: Use hardware accelerated instructions if possible"
	default y
	help
	On x86, this adds ~1k bytes of code.

config SHA3_SMALL
	int "SHA3: Trade bytes for speed (0:fast, 1:slow)"
	default 1  # all "fast or small" options default to small
	range 0 1
	help
	Trade binary size versus speed for the sha3 algorithm.
	SHA3_SMALL=0 compared to SHA3_SMALL=1 (approximate):
	64-bit x86: +270 bytes of code, 45% faster
	32-bit x86: +450 bytes of code, 75% faster

config FEATURE_NON_POSIX_CP
	bool "Non-POSIX, but safer, copying to special nodes"
	default y
	help
	With this option, "cp file symlink" will delete symlink
	and create a regular file. This does not conform to POSIX,
	but prevents a symlink attack.
	Similarly, "cp file device" will not send file's data
	to the device. (To do that, use "cat file >device")

config FEATURE_VERBOSE_CP_MESSAGE
	bool "Give more precise messages when copy fails (cp, mv etc)"
	default n
	help
	Error messages with this feature enabled:

	$ cp file /does_not_exist/file
	cp: cannot create '/does_not_exist/file': Path does not exist
	$ cp file /vmlinuz/file
	cp: cannot stat '/vmlinuz/file': Path has non-directory component

	If this feature is not enabled, they will be, respectively:

	cp: cannot create '/does_not_exist/file': No such file or directory
	cp: cannot stat '/vmlinuz/file': Not a directory

	This will cost you ~60 bytes.

config FEATURE_USE_SENDFILE
	bool "Use sendfile system call"
	default y
	help
	When enabled, busybox will use the kernel sendfile() function
	instead of read/write loops to copy data between file descriptors
	(for example, cp command does this a lot).
	If sendfile() doesn't work, copying code falls back to read/write
	loop. sendfile() was originally implemented for faster I/O
	from files to sockets, but since Linux 2.6.33 it was extended
	to work for many more file types.

config FEATURE_COPYBUF_KB
	int "Copy buffer size, in kilobytes"
	range 1 1024
	default 4
	help
	Size of buffer used by cp, mv, install, wget etc.
	Buffers which are 4 kb or less will be allocated on stack.
	Bigger buffers will be allocated with mmap, with fallback to 4 kb
	stack buffer if mmap fails.

config MONOTONIC_SYSCALL
	bool "Use clock_gettime(CLOCK_MONOTONIC) syscall"
	default y
	help
	Use clock_gettime(CLOCK_MONOTONIC) syscall for measuring
	time intervals (time, ping, traceroute etc need this).
	Probably requires Linux 2.6+. If not selected, gettimeofday
	will be used instead (which gives wrong results if date/time
	is reset).

config IOCTL_HEX2STR_ERROR
	bool "Use ioctl names rather than hex values in error messages"
	default y
	help
	Use ioctl names rather than hex values in error messages
	(e.g. VT_DISALLOCATE rather than 0x5608). If disabled this
	saves about 1400 bytes.

config FEATURE_EDITING
	bool "Command line editing"
	default y
	help
	Enable line editing (mainly for shell command line).

config FEATURE_EDITING_MAX_LEN
	int "Maximum length of input"
	range 128 8192
	default 1024
	depends on FEATURE_EDITING
	help
	Line editing code uses on-stack buffers for storage.
	You may want to decrease this parameter if your target machine
	benefits from smaller stack usage.

config FEATURE_EDITING_VI
	bool "vi-style line editing commands"
	default n
	depends on FEATURE_EDITING
	help
	Enable vi-style line editing. In shells, this mode can be
	turned on and off with "set -o vi" and "set +o vi".

config FEATURE_EDITING_HISTORY
	int "History size"
	# Don't allow way too big values here, code uses fixed "char *history[N]" struct member
	range 0 9999
	default 255
	depends on FEATURE_EDITING
	help
	Specify command history size (0 - disable).

config FEATURE_EDITING_SAVEHISTORY
	bool "History saving"
	default y
	depends on FEATURE_EDITING
	help
	Enable history saving in shells.

config FEATURE_EDITING_SAVE_ON_EXIT
	bool "Save history on shell exit, not after every command"
	default n
	depends on FEATURE_EDITING_SAVEHISTORY
	help
	Save history on shell exit, not after every command.

config FEATURE_REVERSE_SEARCH
	bool "Reverse history search"
	default y
	depends on FEATURE_EDITING
	help
	Enable readline-like Ctrl-R combination for reverse history search.
	Increases code by about 0.5k.

config FEATURE_TAB_COMPLETION
	bool "Tab completion"
	default y
	depends on FEATURE_EDITING

config FEATURE_USERNAME_COMPLETION
	bool "Username completion"
	default y
	depends on FEATURE_TAB_COMPLETION

config FEATURE_EDITING_FANCY_PROMPT
	bool "Fancy shell prompts"
	default y
	depends on FEATURE_EDITING
	help
	Setting this option allows for prompts to use things like \w and
	\$ and escape codes.

config FEATURE_EDITING_WINCH
	bool "Enable automatic tracking of window size changes"
	default y
	depends on FEATURE_EDITING

config FEATURE_EDITING_ASK_TERMINAL
	bool "Query cursor position from terminal"
	default n
	depends on FEATURE_EDITING
	help
	Allow usage of "ESC [ 6 n" sequence. Terminal answers back with
	current cursor position. This information is used to make line
	editing more robust in some cases.
	If you are not sure whether your terminals respond to this code
	correctly, or want to save on code size (about 400 bytes),
	then do not turn this option on.

config LOCALE_SUPPORT
	bool "Enable locale support (system needs locale for this to work)"
	default n
	help
	Enable this if your system has locale support and you would like
	busybox to support locale settings.

config UNICODE_SUPPORT
	bool "Support Unicode"
	default y
	help
	This makes various applets aware that one byte is not
	one character on screen.

	Busybox aims to eventually work correctly with Unicode displays.
	Any older encodings are not guaranteed to work.
	Probably by the time when busybox will be fully Unicode-clean,
	other encodings will be mainly of historic interest.

config UNICODE_USING_LOCALE
	bool "Use libc routines for Unicode (else uses internal ones)"
	default n
	depends on UNICODE_SUPPORT && LOCALE_SUPPORT
	help
	With this option on, Unicode support is implemented using libc
	routines. Otherwise, internal implementation is used.
	Internal implementation is smaller.

config FEATURE_CHECK_UNICODE_IN_ENV
	bool "Check $LC_ALL, $LC_CTYPE and $LANG environment variables"
	default n
	depends on UNICODE_SUPPORT && !UNICODE_USING_LOCALE
	help
	With this option on, Unicode support is activated
	only if locale-related variables have the value of the form
	"xxxx.utf8"

	Otherwise, Unicode support will be always enabled and active.

config SUBST_WCHAR
	int "Character code to substitute unprintable characters with"
	depends on UNICODE_SUPPORT
	default 63
	help
	Typical values are 63 for '?' (works with any output device),
	30 for ASCII substitute control code,
	65533 (0xfffd) for Unicode replacement character.

config LAST_SUPPORTED_WCHAR
	int "Range of supported Unicode characters"
	depends on UNICODE_SUPPORT
	default 767
	help
	Any character with Unicode value bigger than this is assumed
	to be non-printable on output device. Many applets replace
	such characters with substitution character.

	The idea is that many valid printable Unicode chars
	nevertheless are not displayed correctly. Think about
	combining charachers, double-wide hieroglyphs, obscure
	characters in dozens of ancient scripts...
	Many terminals, terminal emulators, xterms etc will fail
	to handle them correctly. Choose the smallest value
	which suits your needs.

	Typical values are:
	126 - ASCII only
	767 (0x2ff) - there are no combining chars in [0..767] range
			(the range includes Latin 1, Latin Ext. A and B),
			code is ~700 bytes smaller for this case.
	4351 (0x10ff) - there are no double-wide chars in [0..4351] range,
			code is ~300 bytes smaller for this case.
	12799 (0x31ff) - nearly all non-ideographic characters are
			available in [0..12799] range, including
			East Asian scripts like katakana, hiragana, hangul,
			bopomofo...
	0 - off, any valid printable Unicode character will be printed.

config UNICODE_COMBINING_WCHARS
	bool "Allow zero-width Unicode characters on output"
	default n
	depends on UNICODE_SUPPORT
	help
	With this option off, any Unicode char with width of 0
	is substituted on output.

config UNICODE_WIDE_WCHARS
	bool "Allow wide Unicode characters on output"
	default n
	depends on UNICODE_SUPPORT
	help
	With this option off, any Unicode char with width > 1
	is substituted on output.

config UNICODE_BIDI_SUPPORT
	bool "Bidirectional character-aware line input"
	default n
	depends on UNICODE_SUPPORT && !UNICODE_USING_LOCALE
	help
	With this option on, right-to-left Unicode characters
	are treated differently on input (e.g. cursor movement).

config UNICODE_NEUTRAL_TABLE
	bool "In bidi input, support non-ASCII neutral chars too"
	default n
	depends on UNICODE_BIDI_SUPPORT
	help
	In most cases it's enough to treat only ASCII non-letters
	(i.e. punctuation, numbers and space) as characters
	with neutral directionality.
	With this option on, more extensive (and bigger) table
	of neutral chars will be used.

config UNICODE_PRESERVE_BROKEN
	bool "Make it possible to enter sequences of chars which are not Unicode"
	default n
	depends on UNICODE_SUPPORT
	help
	With this option on, on line-editing input (such as used by shells)
	invalid UTF-8 bytes are not substituted with the selected
	substitution character.
	For example, this means that entering 'l', 's', ' ', 0xff, [Enter]
	at shell prompt will list file named 0xff (single char name
	with char value 255), not file named '?'.

choice
	prompt "Use LOOP_CONFIGURE for losetup and loop mounts"
	default TRY_LOOP_CONFIGURE
	help
	LOOP_CONFIGURE is added to Linux 5.8
	https://lwn.net/Articles/820408/
	This allows userspace to completely setup a loop device with a single
	ioctl, removing the in-between state where the device can be partially
	configured - eg the loop device has a backing file associated with it,
	but is reading from the wrong offset.

config LOOP_CONFIGURE
	bool "use LOOP_CONFIGURE, needs kernel >= 5.8"

config NO_LOOP_CONFIGURE
	bool "use LOOP_SET_FD + LOOP_SET_STATUS"

config TRY_LOOP_CONFIGURE
	bool "try LOOP_CONFIGURE, fall back to LOOP_SET_FD + LOOP_SET_STATUS"

endchoice
