#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#

config SYSTEM_POPEN
	bool "popen()/pclose()/dpopen()/dpclose() Functions"
	default n
	select SCHED_WAITPID
	depends on PIPES
	---help---
		Enable support for the popen(), pclose(), dpopen(), and
		dpclose() interfaces.

		dpopen()/dpclose() are the descriptor-based counterparts
		of popen()/pclose(), analogous to how dprintf() relates
		to fprintf().  They return a raw file descriptor instead
		of a FILE stream, avoiding the stdio.h dependency.

		popen()/pclose() are thin wrappers around dpopen()/dpclose()
		that additionally wrap the fd in a FILE stream.

		When NSH is available (NSH_LIBRARY), commands are executed
		through the shell (sh -c command), supporting full shell
		syntax including pipes, redirects, and globbing.

		When NSH is not available, commands are executed directly
		via posix_spawnp(). The command string must be a simple
		"program arg1 arg2" form without shell syntax.

if SYSTEM_POPEN

config SYSTEM_POPEN_SHPATH
	string "Path to shell command"
	default "/bin/sh"
	depends on (SYSTEM_NSH=m || BUILD_KERNEL) && NSH_LIBRARY
	---help---
		This is the full path to the program in a mounted file system that
		implements the system() command.  That is, a program that starts the
		NSH shell, executes one command (in argv[1]), then exits.

config SYSTEM_POPEN_STACKSIZE
	int "Shell stack size"
	default DEFAULT_TASK_STACKSIZE
	---help---
		The size of stack allocated for the shell.

		NOTE: I needed to set the stack size quite large to get this example
		working on the simulated target (perhaps because of the 64-bit
		stack?  Or perhaps that is a sneak call into the host libc that I
		have not caught).  I assume that a smaller stack would be okay on
		real hardware, but I have not yet verified that.

config SYSTEM_POPEN_PRIORITY
	int "Shell priority"
	default 100
	---help---
		The priority of the shell.

config SYSTEM_POPEN_MAXARGUMENTS
	int "Maximum number of command arguments (no-shell mode)"
	default 7
	depends on !NSH_LIBRARY
	---help---
		When NSH is not available, dpopen()/popen() splits the command
		string by whitespace into an argv array.  This sets the maximum
		number of arguments (excluding the program name and the
		terminating NULL).

		This is analogous to CONFIG_NSH_MAXARGUMENTS but applies
		only to the no-shell path.

endif
