# /usr/lib/lpdfilter/global/functions
#
# Define useful shell functions, shorten the main script.
#

#
# language environment
#
export LANG=POSIX
export LC_ALL=POSIX

#
# We need a readlink
#
if ! type -p readlink &>/dev/null ; then
    function readlink ()
    {
	test $# -ne 1 && echo "readlink: Need exactly one argument." 1>&2
	test -L "$1"  || return 1
	find $1 -printf '%l\n'
    }
fi

#
# Accounting handler, parses fd 1
#
function accsearch ()
{
    local pages=0

    : ${af="/dev/null"}

    test /dev/fd/3 -ef $af || exec 3>> $af
    while read line ; do
	case "$line" in
	    $key:*) pages=${line#*:} ;; 
	    *)      echo -E "$line"   ;;
	esac
    done
    echo "${user-unknown} $(hostname -f) ${0##*/} \
	  ${pages-0} ${filter-f} $(date '+%a %b %d %T %Y')"  1>&3
}

#
# PostScript page handlers (note: `banner' is a real script)
#
function duplex ()
{
    case "$1" in
    on)
	cat <<-EOF
	statusdict /setduplexmode known {statusdict begin true  setduplexmode end} if {} pop
	statusdict /settumble     known {statusdict begin false settumble     end} if {} pop
	EOF
    ;;
    off)
	cat <<-EOF
	statusdict /setduplexmode known {statusdict begin false setduplexmode end} if {} pop
	EOF
    ;;
    tumble)
	cat <<-EOF
	statusdict /setduplexmode known {statusdict begin true  setduplexmode end} if {} pop
	statusdict /settumble     known {statusdict begin true  settumble     end} if {} pop
	EOF
    ;;
    esac
}

function tray ()
{
    if test -n "$1" ; then
	cat <<-EOF
	statusdict /setpapertray known {statusdict begin $1 setpapertray end} if {} pop
	EOF
    fi
}

function gamma ()
{
    test -z "$OIFS" && OIFS="$IFS"
    IFS=",$IFS"
    set -- $@
    if test $# -eq 4 ; then
	# CMYK color model:
	cat <<-EOF
	{$1 exp} {$2 exp} {$3 exp} {$4 exp} setcolortransfer
	EOF
    elif test $# -eq 1 ; then
	# CMYK color model:
	cat <<-EOF
	{$1 exp} dup dup dup setcolortransfer
	EOF
    else
	# RGB color model:
	cat <<-EOF
	{$1 exp} {$2 exp} {$3 exp} currenttransfer setcolortransfer
	EOF
    fi
    IFS="$OIFS"
}

#
# Fault handler
#

function fault_job ()
{
    echo "lpdfilter: unable to print job ${job-unknown}" \
	| logger -p lpr.error -t lpd
    echo "lpdfilter: unable to print job ${job-unknown}" \
	| mailx -s "lpdfilter: printer fault ${job-unknown}" ${mailto-root} &> /dev/null
    test "${pid:-$PPID}" -ne $$ &>/dev/null && kill -SIGUSR2 ${pid:-$PPID} &> /dev/null
    exit 2
}

function fault_method()
{
    echo "lpdfilter: unknown print method \`$type' for job ${job-unknown}" \
	| logger -p lpr.error -t lpd
    echo "lpdfilter: unknown print method \`$type' for job ${job-unknown}" \
	| mailx -s "lpdfilter: printer fault ${job-unknown}" ${mailto-root} &> /dev/null
    test "${pid:-$PPID}" -ne $$ &>/dev/null && kill -SIGUSR2 ${pid:-$PPID} &> /dev/null
    exit 2
}

function fault_unpacker()
{
    echo "lpdfilter: missing \`$unpack' utility to print job ${job-unknown}" \
	| logger -p lpr.error -t lpd
    echo "lpdfilter: missing \`$unpack' utility to print job ${job-unknown}" \
	| mailx -s "lpdfilter: printer fault ${job-unknown}" ${mailto-root} &> /dev/null
    test "${pid:-$PPID}" -ne $$ &>/dev/null && kill -SIGUSR2 ${pid:-$PPID} &> /dev/null
    exit 2
}

fault_filetype()
{
    echo "lpdfilter: missing \`$1' utility to print job ${job-unknown}" \
	| logger -p lpr.error -t lpd
    echo "lpdfilter: missing \`$1' utility to print job ${job-unknown}" \
	| mailx -s "lpdfilter: printer fault ${job-unknown}" ${mailto-root} &> /dev/null
    test "${pid:-$PPID}" -ne $$ &>/dev/null && kill -SIGUSR2 ${pid:-$PPID} &> /dev/null
    exit 2
}

function fatal_error ()
{
    echo "${0##*/}: $@" 1>&2
    echo "lpdfilter: internal error during print job ${job-unknown}" \
	| mailx -s "lpdfilter: printer fault ${job-unknown}" ${mailto-root} &> /dev/null
    test "${pid:-$PPID}" -ne $$ &>/dev/null && kill -SIGUSR2 ${pid:-$PPID} &> /dev/null
    exit 2
}

function pipe_status()
{
    for s in ${PIPESTATUS[*]} ; do
	test $s -eq 0 || fault_job
    done
}

function get_encoding ()
{
    (
	. /etc/SuSEconfig/profile &> /dev/null
	locale charmap
    )
}

#
# End of source/functions
