# DO NOT EDIT. This file is generated from Config.src
#
# For a description of the syntax of this configuration file,
# see scripts/kbuild/config-language.txt.
#

menu "Init Utilities"

config BOOTCHARTD
	bool "bootchartd"
	default y
	help
	  bootchartd is commonly used to profile the boot process
	  for the purpose of speeding it up. In this case, it is started
	  by the kernel as the init process. This is configured by adding
	  the init=/sbin/bootchartd option to the kernel command line.

	  It can also be used to monitor the resource usage of a specific
	  application or the running system in general. In this case,
	  bootchartd is started interactively by running bootchartd start
	  and stopped using bootchartd stop.

config FEATURE_BOOTCHARTD_BLOATED_HEADER
	bool "Compatible, bloated header"
	default y
	depends on BOOTCHARTD
	help
	  Create extended header file compatible with "big" bootchartd.
	  "Big" bootchartd is a shell script and it dumps some
	  "convenient" info int the header, such as:
	    title = Boot chart for `hostname` (`date`)
	    system.uname = `uname -srvm`
	    system.release = `cat /etc/DISTRO-release`
	    system.cpu = `grep '^model name' /proc/cpuinfo | head -1` ($cpucount)
	    system.kernel.options = `cat /proc/cmdline`
	  This data is not mandatory for bootchart graph generation,
	  and is considered bloat. Nevertheless, this option
	  makes bootchartd applet to dump a subset of it.

config FEATURE_BOOTCHARTD_CONFIG_FILE
	bool "Support bootchartd.conf"
	default y
	depends on BOOTCHARTD
	help
	  Enable reading and parsing of $PWD/bootchartd.conf
	  and /etc/bootchartd.conf files.
config HALT
	bool "poweroff, halt, and reboot"
	default y
	help
	  Stop all processes and either halt, reboot, or power off the system.

config FEATURE_CALL_TELINIT
	bool "Call telinit on shutdown and reboot"
	default y
	depends on HALT && !INIT
	help
	  Call an external program (normally telinit) to facilitate
	  a switch to a proper runlevel.

	  This option is only available if you selected halt and friends,
	  but did not select init.

config TELINIT_PATH
	string "Path to telinit executable"
	default "/sbin/telinit"
	depends on FEATURE_CALL_TELINIT
	help
	  When busybox halt and friends have to call external telinit
	  to facilitate proper shutdown, this path is to be used when
	  locating telinit executable.
config INIT
	bool "init"
	default y
	select FEATURE_SYSLOG
	help
	  init is the first program run when the system boots.

config FEATURE_USE_INITTAB
	bool "Support reading an inittab file"
	default y
	depends on INIT
	help
	  Allow init to read an inittab file when the system boot.

config FEATURE_KILL_REMOVED
	bool "Support killing processes that have been removed from inittab"
	default n
	depends on FEATURE_USE_INITTAB
	help
	  When respawn entries are removed from inittab and a SIGHUP is
	  sent to init, this option will make init kill the processes
	  that have been removed.

config FEATURE_KILL_DELAY
	int "How long to wait between TERM and KILL (0 - send TERM only)" if FEATURE_KILL_REMOVED
	range 0 1024
	default 0
	depends on FEATURE_KILL_REMOVED
	help
	  With nonzero setting, init sends TERM, forks, child waits N
	  seconds, sends KILL and exits. Setting it too high is unwise
	  (child will hang around for too long and could actually kill
	  the wrong process!)

config FEATURE_INIT_SCTTY
	bool "Run commands with leading dash with controlling tty"
	default y
	depends on INIT
	help
	  If this option is enabled, init will try to give a controlling
	  tty to any command which has leading hyphen (often it's "-/bin/sh").
	  More precisely, init will do "ioctl(STDIN_FILENO, TIOCSCTTY, 0)".
	  If device attached to STDIN_FILENO can be a ctty but is not yet
	  a ctty for other session, it will become this process' ctty.
	  This is not the traditional init behavour, but is often what you want
	  in an embedded system where the console is only accessed during
	  development or for maintenance.
	  NB: using cttyhack applet may work better.

config FEATURE_INIT_SYSLOG
	bool "Enable init to write to syslog"
	default y
	depends on INIT

config FEATURE_EXTRA_QUIET
	bool "Be _extra_ quiet on boot"
	default y
	depends on INIT
	help
	  Prevent init from logging some messages to the console during boot.

config FEATURE_INIT_COREDUMPS
	bool "Support dumping core for child processes (debugging only)"
	default y
	depends on INIT
	help
	  If this option is enabled and the file /.init_enable_core
	  exists, then init will call setrlimit() to allow unlimited
	  core file sizes. If this option is disabled, processes
	  will not generate any core files.

config FEATURE_INITRD
	bool "Support running init from within an initrd (not initramfs)"
	default y
	depends on INIT
	help
	  Legacy support for running init under the old-style initrd. Allows
	  the name linuxrc to act as init, and it doesn't assume init is PID 1.

	  This does not apply to initramfs, which runs /init as PID 1 and
	  requires no special support.

config INIT_TERMINAL_TYPE
	string "Initial terminal type"
	default "linux"
	depends on INIT
	help
	  This is the initial value set by init for the TERM environment
	  variable. This variable is used by programs which make use of
	  extended terminal capabilities.

	  Note that on Linux, init attempts to detect serial terminal and
	  sets TERM to "vt102" if one is found.
config MESG
	bool "mesg"
	default y
	help
	  Mesg controls access to your terminal by others. It is typically
	  used to allow or disallow other users to write to your terminal

config FEATURE_MESG_ENABLE_ONLY_GROUP
	bool "Enable writing to tty only by group, not by everybody"
	default y
	depends on MESG
	help
	  Usually, ttys are owned by group "tty", and "write" tool is
	  setgid to this group. This way, "mesg y" only needs to enable
	  "write by owning group" bit in tty mode.

	  If you set this option to N, "mesg y" will enable writing
	  by anybody at all. This is not recommended.

endmenu
