run_parts_list()
{
    ls "$1"/*
}

progress_timestamp()
{
    local p s
    s="$hook"
    if [ "x$2" != "xstage" ]; then
	p=$(basename "$filename")
	s="$s ${p:4}"
    fi
    echo "progress: $(($(date +%s) - $start_time)) $s"
}

progress_ext()
{
    local n plugin
    plugin="$(basename "$filename")"
    n=${plugin:0:3}
    if [ "x$n" = "x000" -o "x$n" = "x999" ]; then
	plugin=""
    fi
    case "$1" in
	[[:digit:]]*)
	    PROGRESS_VALUE=$1
	    echo "progress: $PROGRESS_VALUE $hook:$plugin"
	    ;;
	plugin)
	    echo "progress: $PROGRESS_VALUE $hook:$plugin"
	    ;;
	stage)
	    echo "progress: $PROGRESS_VALUE $hook:$plugin"
	    ;;
	done)
	    echo
	    echo "$(basename "$0") done"
	    echo
	    echo "progress: 1000 done"
	    ;;
	init)
	    echo "progress: 0 configure"
	    ;;
    esac
}

progress_norm()
{
    local n plugin
    plugin="$(basename "$filename")"
    n=${plugin:0:3}
    if [ "x$n" = "x000" -o "x$n" = "x999" ]; then
	plugin=" "
    fi
    case "$1" in
	[[:digit:]]*)
	    PROGRESS_VALUE=$((($1+5)/10))
	    printf "\r%-16s %-24s %3d%%" "$hook:" "$plugin" $PROGRESS_VALUE
	    ;;
	plugin)
	    printf "\r%-16s %-24s %3d%%" "$hook:" "$plugin" $PROGRESS_VALUE
	    ;;
	stage)
	    printf "\r%-16s %-24s %3d%%" "$hook:" "$plugin" $PROGRESS_VALUE
	    ;;
	done)
	    echo
	    echo "$(basename "$0") done"
	    echo
	    ;;
	init)
	    echo
	    ;;
esac
}

progressbar_init()
{
    local KDIALOG
    if KDIALOG=$(kdialog --geometry 600x10 --progressbar "ltsp-build-client" 1000 2>/dev/null); then
	KDIALOG_CLIENT=$(dcopclient $KDIALOG)
	KDIALOG_OBJECT=$(dcopobject $KDIALOG)
	dcop $KDIALOG_CLIENT $KDIALOG_OBJECT showCancelButton true
	return 0
    else
	return 1
    fi
}

progressbar()
{
    if [ -n "$KDIALOG_CLIENT" -a "x$(dcop $KDIALOG_CLIENT $KDIALOG_OBJECT wasCancelled)" = "xtrue" ]; then
	dcop $KDIALOG_CLIENT $KDIALOG_OBJECT close
	echo >&2
	exit 255
    fi
    case "$1" in
	[[:digit:]]*)
	    dcop $KDIALOG_CLIENT $KDIALOG_OBJECT setProgress $1
	    ;;
	plugin)
	    dcop $KDIALOG_CLIENT $KDIALOG_OBJECT setLabel "$hook: $(basename "$filename")"
	    ;;
	stage)
	    dcop $KDIALOG_CLIENT $KDIALOG_OBJECT setLabel "$hook"
	    ;;
	done)
	    dcop $KDIALOG_CLIENT $KDIALOG_OBJECT close
	    ;;
	init)
	    progressbar_init || PROGRESS=true
	    ;;
    esac
}


scratch_build()
{
    EtcAptDir=$(mktemp -d -t apt.XXXXXXXX)
    cat > "$EtcAptDir/apt.conf" <<EOF
Dir::Etc::main "/dev/null";
Dir::Etc::parts "/var/empty";
Dir::Etc::SourceParts "/var/empty";
EOF
    echo "Dir::Etc::sourcelist \"$sources_list\";" >> "$EtcAptDir/apt.conf"
    mkdir -p "$ROOT"/{etc,var/lib}/rpm
    rpm --initdb --root "$ROOT" >&2
    $SETARCH apt-get $APT_VERBOSE update --config-file="$EtcAptDir/apt.conf" -o RPM::RootDir="$ROOT" >&2
    $SETARCH apt-get -y $APT_VERBOSE install --config-file="$EtcAptDir/apt.conf" -o RPM::RootDir="$ROOT" apt chrooted-resolv >&2
    rm -rf "$EtcAptDir"
    if echo "$MIRROR $EXTRA_MIRROR" | egrep -q '(ftp|http|ssh|rsh)://'; then
	if cp --preserve=mode,ownership /etc/resolv.conf "$ROOT"/etc/; then
	    $SETARCH chroot "$ROOT" update_chrooted -f conf
	fi
    fi
}

tar_build()
{
    tar -C "$ROOT" -x${1}f "$CHROOT_IMAGE"
}

cpio_build()
{
    pushd "$ROOT"
    ${1}cat "$CHROOT_IMAGE" | cpio -i -m --no-absolute-filenames -d
    popd
}
