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

menu "Runit Utilities"

config RUNSV
	bool "runsv"
	default n
	help
	  runsv starts and monitors a service and optionally an appendant log
	  service.

config RUNSVDIR
	bool "runsvdir"
	default n
	help
	  runsvdir starts a runsv process for each subdirectory, or symlink to
	  a directory, in the services directory dir, up to a limit of 1000
	  subdirectories, and restarts a runsv process if it terminates.

config FEATURE_RUNSVDIR_LOG
	bool "Enable scrolling argument log"
	depends on RUNSVDIR
	default n
	help
	  Enable feature where second parameter of runsvdir holds last error
	  message (viewable via top/ps). Otherwise (feature is off
	  or no parameter), error messages go to stderr only.

config SV
	bool "sv"
	default n
	help
	  sv reports the current status and controls the state of services
	  monitored by the runsv supervisor.

config SVLOGD
	bool "svlogd"
	default n
	help
	  svlogd continuously reads log data from its standard input, optionally
	  filters log messages, and writes the data to one or more automatically
	  rotated logs.

config CHPST
	bool "chpst"
	default n
	help
	  chpst changes the process state according to the given options, and
	  execs specified program.

config SETUIDGID
	bool "setuidgid"
	help
	  Sets soft resource limits as specified by options

config ENVUIDGID
	bool "envuidgid"
	help
	  Sets $UID to account's uid and $GID to account's gid

config ENVDIR
	bool "envdir"
	help
	  Sets various environment variables as specified by files
	  in the given directory

config SOFTLIMIT
	bool "softlimit"
	help
	  Sets soft resource limits as specified by options

endmenu
