#
# For a description of the syntax of this configuration file,
# see scripts/kbuild/config-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 md5sum 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 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 sha3sum 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_FAST_TOP
	bool "Faster /proc scanning code (+100 bytes)"
	default n  # all "fast or small" options default to small
	help
	This option makes top and ps ~20% faster (or 20% less CPU hungry),
	but code size is slightly bigger.

config FEATURE_ETC_NETWORKS
	bool "Support /etc/networks"
	default n
	help
	Enable support for network names in /etc/networks. This is
	a rarely used feature which allows you to use names
	instead of IP/mask pairs in route command.

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 '?'.

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
	select PLATFORM_LINUX
	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 FEATURE_SKIP_ROOTFS
	bool "Skip rootfs in mount table"
	default y
	help
	Ignore rootfs entry in mount table.

	In Linux, kernel has a special filesystem, rootfs, which is initially
	mounted on /. It contains initramfs data, if kernel is configured
	to have one. Usually, another file system is mounted over / early
	in boot process, and therefore most tools which manipulate
	mount table, such as df, will skip rootfs entry.

	However, some systems do not mount anything on /.
	If you need to configure busybox for one of these systems,
	you may find it useful to turn this option off to make df show
	initramfs statistics.

	Otherwise, choose Y.

config MONOTONIC_SYSCALL
	bool "Use clock_gettime(CLOCK_MONOTONIC) syscall"
	default y
	select PLATFORM_LINUX
	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_HWIB
	bool "Support infiniband HW"
	default y
	help
	Support for printing infiniband addresses in network applets.
