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

menu "Init Utilities"

config INIT
	bool "init"
	default n
	select FEATURE_SYSLOG
	help
	  init is the first program run when the system boots.

config DEBUG_INIT
	bool "Debugging aid"
	default n
	depends on INIT
	help
	  Turn this on to disable all the dangerous
	  rebooting stuff when debugging.

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 y
	depends on FEATURE_USE_INITTAB
	help
	  When respawn entries are removed from inittab and a SIGHUP is
	  sent to init, this feature will 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
	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 can actually kill
	  wrong process!)

config FEATURE_INIT_SCTTY
	bool "Run commands with leading dash with controlling tty"
	default n
	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 n
	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 n
	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 HALT
	bool "poweroff, halt, and reboot"
	default n
	help
	  Stop all processes and either halt, reboot, or power off the system.

config MESG
	bool "mesg"
	default n
	help
	  Mesg controls access to your terminal by others. It is typically
	  used to allow or disallow other users to write to your terminal

endmenu
