#
# For a description of the syntax of this configuration file,
# see scripts/kbuild/config-language.txt.
#

menu "Busybox 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 BusyBox 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:
	                    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_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.

endmenu
