#!/bin/sh
# This is a shell library to interface to the Debian configuration management
# system.

###############################################################################
# Initialization.

# Check to see if a FrontEnd is running.
if [ ! "$DEBIAN_HAS_FRONTEND" ]; then
	# Ok, this is pretty crazy. Since there is no FrontEnd, this
	# program execs a FrontEnd. It will then run a new copy of $0 that
	# can talk to it.
	exec /usr/share/debconf/frontend $0 "$@"
fi

# Only do this once.
if [ -z "$DEBCONF_REDIR" ]; then
	# Redirect standard output to standard error. This prevents common
	# mistakes by making all the output of the postinst or whatever
	# script is using this library not be parsed as confmodule commands.
	#
	# To actually send something to standard output, send it to fd 3.
	exec 3>&1 1>&5
	DEBCONF_REDIR=1
	export DEBCONF_REDIR
fi

###############################################################################
# Commands.

# Generate subroutines for all commands that don't have special handlers.
# Each command must be listed twice, once in lower case, once in upper.
# Doing that saves us a lot of calls to tr at load time. I just wish shell had
# an upper-case function.
_old_opts="$@"
for i in  "beginblock BEGINBLOCK" "capb CAPB" "clear CLEAR" "endblock ENDBLOCK" "exist EXIST" "fget FGET" "fset FSET" "get GET" "go GO" "input INPUT" "metaget METAGET" "progress PROGRESS" "purge PURGE" "register REGISTER" "reset RESET" "set SET" "settitle SETTITLE" "stop STOP" "subst SUBST" "title TITLE" "unregister UNREGISTER" "version VERSION" "x_loadtemplatefile X_LOADTEMPLATEFILE" "x_save X_SAVE"; do
	# Break string up into words.
	set -- $i
	# Generate functions on the fly.
	eval "db_$1 () {
		echo \"$2 \$@\" >&3
		# Set to newline to get whole line.
		local IFS='
'
		local _LINE
		read -r _LINE
		# Disgusting, but it's the only good way to split the line,
		# preserving all other whitespace.
		RET=\"\${_LINE#[! 	][ 	]}\"
		return \${_LINE%%[ 	]*}
	      }"
done
# $@ was clobbered above, unclobber.
set -- $_old_opts
unset _old_opts

# Just an old alias for input.
db_text () {
	db_input $@
}

# Cannot read a return code, since there is none and we would block.
db_stop () {
	echo STOP >&3
}
