##
##  openpkg.spec -- OpenPKG RPM Specification
##  Copyright (c) 2000-2003 Cable & Wireless Deutschland GmbH
##  Copyright (c) 2000-2003 The OpenPKG Project <http://www.openpkg.org/>
##  Copyright (c) 2000-2003 Ralf S. Engelschall <rse@engelschall.com>
##
##  Permission to use, copy, modify, and distribute this software for
##  any purpose with or without fee is hereby granted, provided that
##  the above copyright notice and this permission notice appear in all
##  copies.
##
##  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
##  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
##  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
##  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
##  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
##  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
##  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
##  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
##  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
##  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
##  SUCH DAMAGE.
##

#   NOTICE: This RPM specification is _very_ special, because it is
#   used both for bootstrapping OpenPKG with its RPM and for regular
#   builds of RPM in order to upgrade an existing installation. For this
#   it has to interact correctly with the "openpkg.boot" script. See
#   this companion script for details, but do not touch anything here
#   until you are 100% sure about what you are doing. In short: This
#   script is allowed to use only a very restricted subset of the RPM
#   functionality!

#   BUILD REQUIREMENTS:
#   o any sh(1)
#   o any tar(1)
#   o any make(1)
#   o any cc(1)

#   the package version and release
%define       V_openpkg 20030103
%define       R_openpkg 20030103

#   the used software versions
%define       V_rpm     4.0.2
%define       V_zlib    1.1.4
%define       V_bzip2   1.0.2
%define       V_db      3.2.9
%define       V_curl    7.10.2
%define       V_make    3.80
%define       V_gzip    1.3.5
%define       V_patch   2.5.4
%define       V_tar     1.13.25
%define       V_bash    2.05b

#   package information
Name:         openpkg
Summary:      OpenPKG Bootstrap
URL:          http://www.openpkg.org/
Vendor:       OpenPKG
Packager:     The OpenPKG Project
Distribution: OpenPKG [CORE]
Group:        Bootstrapping
License:      GPL
Version:      %{V_openpkg}
Release:      %{R_openpkg}

#   list of sources
Source0:      README
Source1:      openpkg.boot
Source2:      ftp://ftp.rpm.org/pub/rpm/dist/rpm-%{V_rpm}.x/rpm-%{V_rpm}.tar.gz
Source3:      rpm.patch.bugfix
Source4:      rpm.patch.feature
Source5:      rpm.patch.porting
Source6:      rpm.patch.regen
Source7:      http://www.sleepycat.com/update/%{V_db}/db-%{V_db}.tar.gz
Source8:      ftp://sources.redhat.com/pub/bzip2/v102/bzip2-%{V_bzip2}.tar.gz
Source9:      ftp://ftp.info-zip.org/pub/infozip/zlib/zlib-%{V_zlib}.tar.gz
Source10:     http://curl.haxx.se/download/curl-%{V_curl}.tar.gz
Source11:     rpmpopt
Source12:     rpmrc
Source13:     rpmmacros
Source14:     root.README
Source15:     local.README
Source16:     rc
Source17:     rc.func
Source18:     rpmtool
Source19:     rpmtool.8
Source20:     rpmtool.pod
Source21:     lsync
Source22:     lsync.8
Source23:     lsync.pod
Source24:     aux.wrapsrc.sh
Source25:     aux.wrapbin.sh
Source26:     openpkg.pgp
Source27:     shtool
Source28:     rpmx.sh
Source29:     rpmx.pl
Source30:     ftp://ftp.gnu.org/gnu/make/make-%{V_make}.tar.gz
Source31:     ftp://alpha.gnu.org/gnu/gzip/gzip-%{V_gzip}.tar
Source32:     ftp://ftp.gnu.org/gnu/patch/patch-%{V_patch}.tar.gz
Source33:     rc.openpkg
Source34:     ftp://ftp.gnu.org/gnu/tar/tar-%{V_tar}.tar.gz
Source35:     ftp://ftp.gnu.org/gnu/bash/bash-%{V_bash}.tar.gz
Source36:     dot.bashrc
Source37:     dot.bash_login
Source38:     dot.lsyncrc
Source39:     db.patch
Source40:     rc.conf
Source41:     aux.prereq.sh
Source42:     aux.usrgrp.sh
Source43:     mkproxyrpm.pl
Source44:     ftp://ftp.gnu.org/gnu/config/config.guess
Source45:     ftp://ftp.gnu.org/gnu/config/config.sub

#   build information
Prefix:       %{l_prefix}
BuildRoot:    %{l_buildroot}
AutoReq:      no
AutoReqProv:  no
Provides:     OpenPKG

%description
    This is the bootstrap package for the RPM-based Unix Software
    Package Hierarchy OpenPKG. The RedHat Package Manager (RPM) is a
    sophisticated and portable package manager for Unix platforms,
    which supports the automated building, installation, management and
    deinstallation of Unix software. Originally RPM is designed and
    implemented for us with the RedHat Linux operating system where
    it manages every file on the whole system. In OpenPKG RPM is used
    only for managing all files in a particular filesystem hierarchy
    dedicated to the installation of third-party software packages
    provided by the OpenPKG project.

    Internally the OpenPKG bootstrap package is based on the
    following particular vendor products:
        RedHat RPM %{V_rpm}, Berkeley-DB %{V_db}, ZLib %{V_zlib},
        GNU Bzip2 %{V_bzip2}, GNU Gzip %{V_gzip}, GNU Tar %{V_tar},
        GNU Patch %{V_patch}, GNU Make %{V_make}, GNU Bash %{V_bash},
        cURL %{V_curl}

%prep
    #   skip in bootstrap phase 2 (see openpkg.boot)
    [ ".$OPENPKG_BOOT" = .1 ] && exit 0

    #   switch into a temporary build area
    rm -rf %{name}-%{version}
    mkdir %{name}-%{version}
    cd %{name}-%{version}
    rm -f .buildenv
    touch .buildenv

    #   provide a bootstrap alternative to %{SOURCE xxx} because else
    #   it is not possible to upgrade a newer OpenPKG RPM with an older
    #   OpenPKG RPM.
    echo >>.buildenv 'SOURCE () {'
    echo >>.buildenv '    if [ -f "%{_specdir}/$1" ]; then'
    echo >>.buildenv '        echo "%{_specdir}/$1"'
    echo >>.buildenv '    else'
    echo >>.buildenv '        echo "%{_sourcedir}/$1"'
    echo >>.buildenv '    fi'
    echo >>.buildenv '}'
    . ./.buildenv

    #   determine path to shtool
    shtool=`SOURCE shtool`
    echo "shtool=$shtool" >>./.buildenv

    #   manually make sure tar(1) is available
    l_tar=`sh $shtool path gtar tar`; export l_tar
    if [ ".$l_tar" = . ]; then
        echo "openpkg: prerequisite tool \`gtar' or \`tar' not found"
        exit 1
    fi
    echo "l_tar=\"$l_tar\"; export l_tar" >>.buildenv

    #   manually make sure make(1) is available
    l_make=`sh $shtool path gmake make`; export l_make
    if [ ".$l_make" = . ]; then
        echo "openpkg: prerequisite tool \`gmake' or \`make' not found"
        exit 1
    fi
    echo "l_make=\"$l_make\"; export l_make" >>.buildenv

    #   manually make sure cc(1) is available
    l_cc=`sh $shtool path gcc cc`; export l_cc
    if [ ".$l_cc" = . ]; then
        echo "openpkg: prerequisite tool \`gcc' or \`cc' not found"
        exit 1
    fi
    echo "l_cc=\"$l_cc\"; export l_cc" >>.buildenv

    #   manually make sure ar(1) is available
    l_ar=`sh $shtool path ar`; export l_ar
    if [ ".$l_ar" = . ]; then
        echo "openpkg: prerequisite tool \`ar' not found"
        exit 1
    fi

    #   manually make sure ld(1) is available
    l_ld=`sh $shtool path ld`; export l_ld
    if [ ".$l_ld" = . ]; then
        echo "openpkg: prerequisite tool \`ld' not found"
        exit 1
    fi

    #   determine path to aux.usrgrp.sh script
    usrgrp=`SOURCE aux.usrgrp.sh`
    echo "usrgrp=$usrgrp" >>./.buildenv

    #   determine user/group name/id pairs
    #   - bootstrapping: %{l_[smrn]{usr,grp}} is set via sed(1)
    #   - upgrading new: %{l_[smrn]{usr,grp}} is set via rpmmacros
    #   - upgrading old: %{l_[smrn]{usr,grp}} is not set at all
    susr=""; [ ".%{?l_susr:set}"  = .set ] && susr="%{l_susr}"
    sgrp=""; [ ".%{?l_sgrp:set}"  = .set ] && sgrp="%{l_sgrp}"
    musr=""; [ ".%{?l_musr:set}"  = .set ] && musr="%{l_musr}"
    mgrp=""; [ ".%{?l_mgrp:set}"  = .set ] && mgrp="%{l_mgrp}"
    rusr=""; [ ".%{?l_rusr:set}"  = .set ] && rusr="%{l_rusr}"
    rgrp=""; [ ".%{?l_rgrp:set}"  = .set ] && rgrp="%{l_rgrp}"
    nusr=""; [ ".%{?l_nusr:set}"  = .set ] && nusr="%{l_nusr}"
    ngrp=""; [ ".%{?l_ngrp:set}"  = .set ] && ngrp="%{l_ngrp}"
    #   compat:
    usr="";  [ ".%{?l_fsusr:set}" = .set ] && usr="%{l_fsusr}"
    grp="";  [ ".%{?l_fsgrp:set}" = .set ] && grp="%{l_fsgrp}"
    eval `sh $usrgrp \
          --usr="$usr" --grp="$grp" \
          --susr="$susr" --sgrp="$sgrp" \
          --musr="$musr" --mgrp="$mgrp" \
          --rusr="$rusr" --rgrp="$rgrp" \
          --nusr="$nusr" --ngrp="$ngrp"`
    echo "susr=\"$susr\"; export susr" >>.buildenv
    echo "sgrp=\"$sgrp\"; export sgrp" >>.buildenv
    echo "musr=\"$musr\"; export musr" >>.buildenv
    echo "mgrp=\"$mgrp\"; export mgrp" >>.buildenv
    echo "rusr=\"$rusr\"; export rusr" >>.buildenv
    echo "rgrp=\"$rgrp\"; export rgrp" >>.buildenv
    echo "nusr=\"$nusr\"; export nusr" >>.buildenv
    echo "ngrp=\"$ngrp\"; export ngrp" >>.buildenv

    #   determine installation location id
    if [ ".%{?l_location:set}" = .set ]; then
        loc="%{l_location}"
    else
        if [ ".`expr %{l_prefix} : '/[^/][^/]*$'`" != .0 ]; then
            loc=`echo %{l_prefix} | cut -c2-4`
        else
            loc=`echo %{l_prefix} | sed -e 's;/\(.\)[^/]*;\1;g' | cut -c1-3`
        fi
    fi
    echo "loc=\"$loc\"; export loc" >>.buildenv

    #   determine platform id
    s=`(uname -s) 2>/dev/null` || s='Unknown'
    r=`(uname -r) 2>/dev/null` || r='0.0'
    plid="${s}/${r}"

    #   determine platform-specific build environment
    case $plid in
        FreeBSD/* ) l_build_path="/bin:/sbin:/usr/bin:/usr/sbin" ;;
        Linux/*   ) l_build_path="/bin:/sbin:/usr/bin:/usr/sbin" ;;
        SunOS/*   ) l_build_path="/bin:/sbin:/usr/bin:/usr/sbin:/usr/ccs/bin" ;;
        *         ) l_build_path="/bin:/sbin:/usr/bin:/usr/sbin" ;;
    esac
    case $plid in
        FreeBSD/* ) l_build_ldlp="/usr/lib" ;;
        Linux/*   ) l_build_ldlp="/lib:/usr/lib" ;;
        SunOS/*   ) l_build_ldlp="/usr/lib:/usr/ccs/lib" ;;
        *         ) l_build_ldlp="/usr/lib" ;;
    esac
    case $plid in
        FreeBSD/4* ) l_build_ulim="ulimit -H -S -f 262144 -d 262144 -m 262144 -s 65536 -u 128" ;;
        Linux/2*   ) l_build_ulim="ulimit -H -S -f 262144 -d 262144 -m 262144 -v 262144 -s 65536 -u 128" ;;
        SunOS/5.8* ) l_build_ulim="ulimit -H -S -f 262144 -d 262144 -s 65536" ;;
        *          ) l_build_ulim=":" ;;
    esac
    echo "l_build_path=\"$l_build_path\"; export l_build_path" >>.buildenv
    echo "l_build_ldlp=\"$l_build_ldlp\"; export l_build_ldlp" >>.buildenv
    echo "l_build_ulim=\"$l_build_ulim\"; export l_build_ulim" >>.buildenv

    #   bootstrap GNU zip tool
    ${l_tar} xf `SOURCE gzip-%{V_gzip}.tar` 2>/dev/null
    ( cd gzip-%{V_gzip}
      CC="${l_cc}" ./configure
      ${l_make}
    )
    l_gzip="`pwd`/gzip-%{V_gzip}/gzip"; export l_gzip
    echo "l_gzip=\"$l_gzip\"; export l_gzip" >>.buildenv

    #   unpack distribution tarballs
    ${l_gzip} -dc `SOURCE rpm-%{V_rpm}.tar.gz`     | ${l_tar} xf -
    ${l_gzip} -dc `SOURCE zlib-%{V_zlib}.tar.gz`   | ${l_tar} xf -
    ${l_gzip} -dc `SOURCE bzip2-%{V_bzip2}.tar.gz` | ${l_tar} xf -
    ${l_gzip} -dc `SOURCE db-%{V_db}.tar.gz`       | ${l_tar} xf -
    ${l_gzip} -dc `SOURCE curl-%{V_curl}.tar.gz`   | ${l_tar} xf -
    ${l_gzip} -dc `SOURCE make-%{V_make}.tar.gz`   | ${l_tar} xf -
    ${l_gzip} -dc `SOURCE patch-%{V_patch}.tar.gz` | ${l_tar} xf -
    ${l_gzip} -dc `SOURCE tar-%{V_tar}.tar.gz`     | ${l_tar} xf -
    ${l_gzip} -dc `SOURCE bash-%{V_bash}.tar.gz`   | ${l_tar} xf -

    #   update config.guess/config.sub
    for dir in rpm-%{V_rpm} rpm-%{V_rpm}/popt db-%{V_db}/dist \
               curl-%{V_curl} make-%{V_make} patch-%{V_patch} tar-%{V_tar} bash-%{V_bash}/support; do
        chmod u+w $dir/config.guess $dir/config.sub >/dev/null 2>&1 || true
        cp `SOURCE config.guess` $dir/
        cp `SOURCE config.sub`   $dir/
    done

    #   bootstrap GNU make tool
    ( cd make-%{V_make}
      CC="${l_cc}" ./configure --disable-nls --disable-largefile
      ${l_make}
      (mv make ..; ${l_make} clean || true; mv ../make .)
    )
    l_make="`pwd`/make-%{V_make}/make"; export l_make
    echo "l_make=\"$l_make\"; export l_make" >>.buildenv

    #   bootstrap GNU patch tool
    ( cd patch-%{V_patch}
      echo 'ac_cv_func_setmode=${ac_cv_func_setmode=no}' >config.cache
      false=`sh $shtool path false`
      echo "ac_cv_path_ed_PROGRAM=\${ac_cv_path_ed_PROGRAM=$false}" >>config.cache
      CC="${l_cc}" ./configure --disable-largefile
      ${l_make}
      (mv patch ..; ${l_make} clean || true; mv ../patch .)
    )
    l_patch="`pwd`/patch-%{V_patch}/patch"; export l_patch
    echo "l_patch=\"$l_patch\"; export l_patch" >>.buildenv

    #   apply OpenPKG patches to RPM distribution tree
    ( cd rpm-%{V_rpm}
      ${l_patch} -p0 <`SOURCE rpm.patch.bugfix`
      ${l_patch} -p0 <`SOURCE rpm.patch.feature`
      ${l_patch} -p0 <`SOURCE rpm.patch.porting`
      ${l_patch} -p0 <`SOURCE rpm.patch.regen`
      touch aclocal.m4 configure
    )

    #   apply OpenPKG patches to DB distribution tree
    ( cd db-%{V_db}
      ${l_patch} -p0 <`SOURCE db.patch`
    )

%build
    #   skip in bootstrap phase 2 (see openpkg.boot)
    [ ".$OPENPKG_BOOT" = .1 ] && exit 0

    #   switch into a temporary build area
    cd %{name}-%{version}
    . ./.buildenv

    #   build GNU bash tool
    ( cd bash-%{V_bash}
      ( #   force disabled wide-character support
        echo "ac_cv_header_wchar_h=no"
        echo "ac_cv_header_wctype_h=no"
        echo "ac_cv_func_mbsrtowcs=no"
        #   force disabled internationalization support
        echo "ac_cv_header_libintl_h=no"
        echo "ac_cv_func_gettext=no"
        echo "ac_cv_func_textdomain=no"
        echo "ac_cv_func_bindtextdomain=no"
        echo "ac_cv_lib_intl_bindtextdomain=no"
      ) >config.cache
      CC="${l_cc}"
      ./configure \
          --cache-file=./config.cache \
          --prefix=%{l_prefix} \
          --without-curses \
          --without-gnu-malloc \
          --disable-nls
      ${l_make} || exit $?
      ( mv bash ..; ${l_make} clean || true; mv ../bash . )
    )

    #   build GNU tar tool
    ( cd tar-%{V_tar}
      echo 'am_cv_func_iconv=${am_cv_func_iconv=no}' >config.cache
      echo 'am_cv_lib_iconv=${am_cv_lib_iconv=no}' >config.cache
      echo 'am_cv_func_iconv=${am_cv_func_iconv=no}' >config.cache
      CC="${l_cc}"
      ../bash-%{V_bash}/bash \
      ./configure \
          --config-cache \
          --prefix=%{l_prefix} \
          --disable-nls
      ${l_make} || exit $?
      (mv src/tar ..; ${l_make} clean || true; mv ../tar src/)
    )

    #   build BZIP2 library
    ( cd bzip2-%{V_bzip2}
      ${l_make} CC="${l_cc}" CFLAGS="-O" libbz2.a bzip2 || exit $?
    )

    #   build ZLIB library
    ( cd zlib-%{V_zlib}
      CC="${l_cc}" CFLAGS="-O" ./configure
      ${l_make} CC="${l_cc}" CFLAGS="-O" libz.a || exit $?
    )

    #   build cURL tool
    ( cd curl-%{V_curl}
      echo 'ac_cv_header_openssl_engine_h=no' >config.cache
      CC="${l_cc}" \
      CFLAGS="-I`pwd`/../zlib-%{V_zlib}" \
      CPPFLAGS="-I`pwd`/../zlib-%{V_zlib}" \
      LDFLAGS="-L`pwd`/../zlib-%{V_zlib}" \
      ./configure \
          --cache-file=config.cache \
          --without-ssl \
          --disable-shared \
          --disable-thread \
          --disable-ipv6 \
          --with-zlib=`pwd`/../zlib-%{V_zlib}
      ${l_make} || exit $?
      (mv src/curl ..; ${l_make} clean || true; mv ../curl ./src)
    )

    #   build Berkeley-DB library
    ( cd db-%{V_db}/build_unix
      case `sh ../dist/config.guess` in
          *-*-osf* ) echo 'db_cv_mutex=${db_cv_mutex=UNIX/msem_init}' >config.cache ;; # avoid dependency to pthread
      esac
      CC="${l_cc}" ../dist/configure
      ${l_make} libdb.a || exit $?
      ln libdb.a libdbXXX.a # workaround for Tru64
    )

    #   build RPM
    #   - we make sure RPM builds without NLS/gettext problems :-(
    #   - we make sure RPM finds and uses our own BZIP2/ZLIB/DB libraries
    #   - we speed up building by skipping the NLS/gettext data
    ( br=`pwd`
      cd rpm-%{V_rpm}
      sed -e 's;(aclocal --version);false;' \
          -e 's;(automake --version);false;' \
          -e 's;(autoconf --version);false;' \
          -e 's;(autoheader --version);false;' \
          -e 's;(makeinfo --version);false;' \
          -e 's;/lib/rpm;/lib/openpkg;' \
          -e "s;MKDIR_P=.*;MKDIR_P='%{l_prefix}/lib/openpkg/shtool mkdir -f -p -m 755';" \
          <configure >configure.n && \
          mv configure.n configure
      sed -e 's;@INTLLIBS@;@INTLLIBS@ @LIBMISC@;' \
          <tools/Makefile.in >tools/Makefile.in.n && \
          mv tools/Makefile.in.n tools/Makefile.in
      sed -e 's;^\(SUBDIRS[ 	]*=.*\) po \(.*\)$;\1 \2;' \
          -e 's;^\(SUBDIRS[ 	]*=.*\) tools \(.*\)$;\1 \2;' \
          -e 's;^\(LIBS[ 	]*=\).*;\1 @LIBS@ $(EXTRA_LIBS);' \
          <Makefile.in >Makefile.in.n && mv Makefile.in.n Makefile.in
      sed -e 's;^\(SUBDIRS[ 	]*=.*\) po$;\1;' \
          <popt/Makefile.in >popt/Makefile.in.n && \
          mv popt/Makefile.in.n popt/Makefile.in
      sed -e 's;BUFSIZ;8192;g' \
          <rpmio/macro.c >rpmio/macro.c.n && \
          mv rpmio/macro.c.n rpmio/macro.c
      ( echo 'ac_cv_path_MSGFMT=${ac_cv_path_MSGFMT=no}' 
        echo 'ac_cv_path_GMSGFMT=${ac_cv_path_GMSGFMT=no}' 
        echo "ac_cv_path_MKDIR=%{l_prefix}/lib/openpkg/shtool mkdir -f -p -m 755}"
        echo "ac_cv_path___MKDIR=%{l_prefix}/lib/openpkg/shtool mkdir -f -p -m 755}"
      ) >config.cache
      case `sh ./config.guess` in
          *-*-linux* ) nlsopt="--disable-nls" ;;
          *          ) nlsopt="--enable-nls --with-included-gettext" ;;
      esac
      nlsopt="--disable-nls"
      CC="${l_cc} -DOPENPKG -I$br/db-%{V_db}/build_unix -I$br/zlib-%{V_zlib} -I$br/bzip2-%{V_bzip2}" \
      CFLAGS="-DOPENPKG -I$br/db-%{V_db}/build_unix -I$br/zlib-%{V_zlib} -I$br/bzip2-%{V_bzip2}" \
      CPPFLAGS="-DOPENPKG -I$br/db-%{V_db}/build_unix -I$br/zlib-%{V_zlib} -I$br/bzip2-%{V_bzip2}" \
      LDFLAGS="-L$br/db-%{V_db}/build_unix -L$br/zlib-%{V_zlib} -L$br/bzip2-%{V_bzip2}" \
      LIBS="-L$br/db-%{V_db}/build_unix -ldbXXX -L$br/zlib-%{V_zlib} -lz -L$br/bzip2-%{V_bzip2} -lbz2" \
      sh ./configure \
          --prefix=%{l_prefix} \
          --disable-shared \
          --disable-db1 \
          --with-glob \
          $nlsopt
      ${l_make} \
          EXTRA_LIBS="-L$br/db-%{V_db}/build_unix -ldbXXX -L$br/zlib-%{V_zlib} -lz -L$br/bzip2-%{V_bzip2} -lbz2"
    )

%install
    #   skip in bootstrap phase 2 (see openpkg.boot)
    [ ".$OPENPKG_BOOT" = .1 ] && exit 0

    #   switch into a temporary build area
    cd %{name}-%{version}
    . ./.buildenv

    #   create installation hierarchy
    rm -rf $RPM_BUILD_ROOT
    sh $shtool mkdir -f -p -m 755 $RPM_BUILD_ROOT%{l_prefix}
    for dir in bin etc include info lib libexec man sbin share var cgi pub local; do
        test -d $RPM_BUILD_ROOT%{l_prefix}/$dir || \
        mkdir $RPM_BUILD_ROOT%{l_prefix}/$dir
    done
    for i in 1 2 3 4 5 6 7 8 9; do
        test -d $RPM_BUILD_ROOT%{l_prefix}/man/man$i || \
        mkdir $RPM_BUILD_ROOT%{l_prefix}/man/man$i
        test -d $RPM_BUILD_ROOT%{l_prefix}/man/cat$i || \
        mkdir $RPM_BUILD_ROOT%{l_prefix}/man/cat$i
    done
    for dir in PKG bin etc include info lib man sbin; do
        test -d $RPM_BUILD_ROOT%{l_prefix}/local/$dir || \
        mkdir $RPM_BUILD_ROOT%{l_prefix}/local/$dir
    done
    for i in 1 2 3 4 5 6 7 8 9; do
        test -d $RPM_BUILD_ROOT%{l_prefix}/local/man/man$i || \
        mkdir $RPM_BUILD_ROOT%{l_prefix}/local/man/man$i
        test -d $RPM_BUILD_ROOT%{l_prefix}/local/man/cat$i || \
        mkdir $RPM_BUILD_ROOT%{l_prefix}/local/man/cat$i
    done
    test -d $RPM_BUILD_ROOT%{l_prefix}/RPM || \
    mkdir $RPM_BUILD_ROOT%{l_prefix}/RPM
    for dir in SRC PKG DB TMP; do
        test -d $RPM_BUILD_ROOT%{l_prefix}/RPM/$dir || \
        mkdir $RPM_BUILD_ROOT%{l_prefix}/RPM/$dir
    done

    #   install RPM into installation hierarchy
    ( cd rpm-%{V_rpm}
      ${l_make} DESTDIR="$RPM_BUILD_ROOT" install
    )

    #   strip RPM installation
    strip $RPM_BUILD_ROOT%{l_prefix}/bin/* \
          $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/* >/dev/null 2>&1 || true
    for dir in man/ja man/pl man/ru man/sk src; do
        rm -rf $RPM_BUILD_ROOT%{l_prefix}/$dir >/dev/null 2>&1 || true
    done
    for file in rpmbuild rpmdb rpme rpmi rpmsign rpmu rpmverify rpmquery gendiff; do
        rm -f $RPM_BUILD_ROOT%{l_prefix}/bin/$file >/dev/null 2>&1 || true
    done
    rm -rf $RPM_BUILD_ROOT%{l_prefix}/share/* >/dev/null 2>&1 || true
    rm -f $RPM_BUILD_ROOT%{l_prefix}/man/man1/* >/dev/null 2>&1 || true
    rm -f $RPM_BUILD_ROOT%{l_prefix}/man/man3/* >/dev/null 2>&1 || true
    rm -f $RPM_BUILD_ROOT%{l_prefix}/lib/rpmpopt >/dev/null 2>&1 || true
    rm -f $RPM_BUILD_ROOT%{l_prefix}/lib/rpmrc >/dev/null 2>&1 || true
    rm -f $RPM_BUILD_ROOT%{l_prefix}/lib/lib*.la >/dev/null 2>&1 || true
    rm -rf $RPM_BUILD_ROOT%{l_prefix}/var/lib >/dev/null 2>&1 || true
    for file in \
        u_pkg.sh vpkg-provides.sh vpkg-provides2.sh rpmdiff.cgi rpmdiff \
        perl.prov perl.req mkinstalldirs magic.prov magic.req http.req \
        getpo.sh get_magic.pl find-requires.perl find-req.pl find-provides.perl \
        find-prov.pl find-lang.sh cpanflute convertrpmrc.sh check-prereqs \
        rpmputtext rpmgettext brp-compress brp-redhat brp-sparc64-linux \
        brp-strip brp-strip-shared brp-strip-comment-note rpmrc \
        config.guess config.sub; do
        rm -f $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/$file >/dev/null 2>&1 || true
    done

    #   add additional development files
    cp zlib-%{V_zlib}/zlib.h $RPM_BUILD_ROOT%{l_prefix}/include/rpm/
    cp zlib-%{V_zlib}/libz.a $RPM_BUILD_ROOT%{l_prefix}/lib/librpmz.a
    cp db-%{V_db}/build_unix/db.h $RPM_BUILD_ROOT%{l_prefix}/include/rpm/
    cp db-%{V_db}/build_unix/libdb.a $RPM_BUILD_ROOT%{l_prefix}/lib/librpmdb.a

    #   post-adjust RPM installation (namespace-clean POPT inclusion)
    mv $RPM_BUILD_ROOT%{l_prefix}/lib/libpopt.a \
       $RPM_BUILD_ROOT%{l_prefix}/lib/librpmpopt.a
    mv $RPM_BUILD_ROOT%{l_prefix}/include/popt.h \
       $RPM_BUILD_ROOT%{l_prefix}/include/rpm/popt.h

    #   replace symlinks with hardlinks
    for entry in rpme:rpmi rpmt:rpmb rpmu:rpmi rpmv:rpmq; do
        eval `echo $entry | sed -e 's/^\(.*\):\(.*\)$/dst=\1; src=\2/'`
        rm -f $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/$dst
        ln $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/$src \
           $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/$dst
    done

    #   install lsync tool
    sed -e "s:@l_prefix@:%{l_prefix}:g" \
        <`SOURCE lsync` \
        >$RPM_BUILD_ROOT%{l_prefix}/sbin/lsync
    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/sbin/lsync
    sed -e "s:@l_prefix@:%{l_prefix}:g" \
        <`SOURCE dot.lsyncrc` \
        >$RPM_BUILD_ROOT%{l_prefix}/local/.lsyncrc
    sed -e "s:@l_prefix@:%{l_prefix}:g" \
        <`SOURCE lsync.8` \
        >$RPM_BUILD_ROOT%{l_prefix}/man/man8/lsync.8

    #   install RPM extension
    ( cd curl-%{V_curl}
      cp src/curl $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/curl
      strip $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/curl
    )
    ( cd bzip2-%{V_bzip2}
      cp bzip2 $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/bzip2
      strip $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/bzip2
    )
    ( cd gzip-%{V_gzip}
      cp gzip $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/gzip
      strip $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/gzip
    )
    ( cd patch-%{V_patch}
      cp patch $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/patch
      strip $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/patch
    )
    ( cd tar-%{V_tar}
      cp src/tar $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/tar
      strip $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/tar
    )
    ( cd bash-%{V_bash}
      cp bash $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/bash
      strip $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/bash
    )
    sed -e "s;@l_prefix@;%{l_prefix};g" \
        <`SOURCE rpmx.sh` >$RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/rpmx.sh
    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/rpmx.sh
    sed -e "s;@l_prefix@;%{l_prefix};g" \
        <`SOURCE rpmx.pl` >$RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/rpmx.pl
    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/rpmx.pl
    sed -e "s;@l_prefix@;%{l_prefix};g" \
        <`SOURCE mkproxyrpm.pl` >$RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/mkproxyrpm.pl
    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/mkproxyrpm.pl
    sed -e "s:@l_prefix@:%{l_prefix}:g" \
        <`SOURCE rpmtool` >$RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/rpmtool
    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/rpmtool

    #   install an own copy of shtool
    cp $shtool $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/shtool
    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/shtool

    #   install GNU config scripts
    cp `SOURCE config.guess` $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/
    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/config.guess
    cp `SOURCE config.sub` $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/
    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/config.sub

    #   install a few README files
    sed -e "s:@l_prefix@:%{l_prefix}:g" \
        <`SOURCE root.README` \
        >$RPM_BUILD_ROOT%{l_prefix}/README
    sed -e "s:@l_prefix@:%{l_prefix}:g" \
        <`SOURCE local.README` \
        >$RPM_BUILD_ROOT%{l_prefix}/local/README

    #   install Bash environment
    sed -e "s:@l_prefix@:%{l_prefix}:g" \
        <`SOURCE dot.bashrc` \
        >$RPM_BUILD_ROOT%{l_prefix}/.bashrc
    sed -e "s:@l_prefix@:%{l_prefix}:g" \
        <`SOURCE dot.bash_login` \
        >$RPM_BUILD_ROOT%{l_prefix}/.bash_login

    #   install Run-Command files
    sed -e "s:@l_prefix@:%{l_prefix}:g" \
        <`SOURCE rc` \
        >$RPM_BUILD_ROOT%{l_prefix}/etc/rc
    chmod 755 $RPM_BUILD_ROOT%{l_prefix}/etc/rc
    sed -e "s:@l_prefix@:%{l_prefix}:g" \
        <`SOURCE rc.conf` \
        >$RPM_BUILD_ROOT%{l_prefix}/etc/rc.conf
    chmod 644 $RPM_BUILD_ROOT%{l_prefix}/etc/rc.conf
    sed -e "s:@l_prefix@:%{l_prefix}:g" \
        <`SOURCE rc.func` \
        >$RPM_BUILD_ROOT%{l_prefix}/etc/rc.func
    chmod 644 $RPM_BUILD_ROOT%{l_prefix}/etc/rc.func
    mkdir $RPM_BUILD_ROOT%{l_prefix}/etc/rc.d
    sed -e "s:@l_prefix@:%{l_prefix}:g" \
        <`SOURCE rc.openpkg` \
        >$RPM_BUILD_ROOT%{l_prefix}/etc/rc.d/rc.openpkg
    chmod 755 $RPM_BUILD_ROOT%{l_prefix}/etc/rc.d/rc.openpkg

    #   hard-code RPM tool for installation hierarchy
    #   and adjust RPM configuration files
    mv $RPM_BUILD_ROOT%{l_prefix}/bin/rpm \
       $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/rpm
    ( echo "#!/bin/sh";
      echo "exec %{l_prefix}/lib/openpkg/rpm --rcfile %{l_prefix}/etc/openpkg/rpmrc \${1+\"\$@\"}"
    ) >$RPM_BUILD_ROOT%{l_prefix}/bin/rpm
    chmod 755 $RPM_BUILD_ROOT%{l_prefix}/bin/rpm
    cat `SOURCE rpmpopt` \
        >>$RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/rpmpopt-%{V_rpm}
    test -d $RPM_BUILD_ROOT%{l_prefix}/etc/openpkg || \
    mkdir $RPM_BUILD_ROOT%{l_prefix}/etc/openpkg
    sed -e "s:@l_prefix@:%{l_prefix}:g" \
        <`SOURCE rpmrc` \
        >$RPM_BUILD_ROOT%{l_prefix}/etc/openpkg/rpmrc
    sed -e "s:@l_prefix@:%{l_prefix}:g" \
        -e "s;@l_build_path@;$l_build_path;g" \
        -e "s;@l_build_ldlp@;$l_build_ldlp;g" \
        -e "s;@l_build_ulim@;$l_build_ulim;g" \
        -e "s:@LOC@:$loc:g" \
        -e "s:@SUSR@:$susr:g" \
        -e "s:@SGRP@:$sgrp:g" \
        -e "s:@MUSR@:$musr:g" \
        -e "s:@MGRP@:$mgrp:g" \
        -e "s:@RUSR@:$rusr:g" \
        -e "s:@RGRP@:$rgrp:g" \
        -e "s:@NUSR@:$nusr:g" \
        -e "s:@NGRP@:$ngrp:g" \
        <`SOURCE rpmmacros` \
        >$RPM_BUILD_ROOT%{l_prefix}/etc/openpkg/rpmmacros
    cp `SOURCE openpkg.pgp` \
       $RPM_BUILD_ROOT%{l_prefix}/etc/openpkg/openpkg.pgp

%files
    %defattr(-,%{?l_musr}%{!?l_musr:%{l_fsusr}},%{?l_mgrp}%{!?l_mgrp:%{l_fsgrp}})
    %{l_prefix}/README
    %{l_prefix}/.bashrc
    %{l_prefix}/.bash_login
    %dir %{l_prefix}/RPM
    %dir %{l_prefix}/RPM/SRC
    %dir %{l_prefix}/RPM/PKG
    %dir %{l_prefix}/RPM/DB
    %dir %{l_prefix}/RPM/TMP
    %dir %{l_prefix}/cgi
    %dir %{l_prefix}/bin
    %{l_prefix}/bin/rpm2cpio
    %{l_prefix}/bin/rpm
    %dir %{l_prefix}/etc
    %{l_prefix}/etc/rc
    %config %{l_prefix}/etc/rc.conf
    %{l_prefix}/etc/rc.func
    %dir %{l_prefix}/etc/rc.d
    %{l_prefix}/etc/rc.d/rc.openpkg
    %dir %{l_prefix}/etc/openpkg
    %config %{l_prefix}/etc/openpkg/rpmmacros
    %config %{l_prefix}/etc/openpkg/rpmrc
    %{l_prefix}/etc/openpkg/openpkg.pgp
    %dir %{l_prefix}/include
    %dir %{l_prefix}/include/rpm
    %{l_prefix}/include/rpm/popt.h
    %{l_prefix}/include/rpm/header.h
    %{l_prefix}/include/rpm/misc.h
    %{l_prefix}/include/rpm/rpmbuild.h
    %{l_prefix}/include/rpm/rpmerr.h
    %{l_prefix}/include/rpm/rpmio.h
    %{l_prefix}/include/rpm/rpmlib.h
    %{l_prefix}/include/rpm/rpmlog.h
    %{l_prefix}/include/rpm/rpmmacro.h
    %{l_prefix}/include/rpm/rpmmessages.h
    %{l_prefix}/include/rpm/rpmspec.h
    %{l_prefix}/include/rpm/rpmurl.h
    %{l_prefix}/include/rpm/stringbuf.h
    %{l_prefix}/include/rpm/ugid.h
    %{l_prefix}/include/rpm/db.h
    %{l_prefix}/include/rpm/zlib.h
    %dir %{l_prefix}/info
    %dir %{l_prefix}/lib
    %dir %{l_prefix}/lib/openpkg
    %{l_prefix}/lib/openpkg/bash
    %{l_prefix}/lib/openpkg/bzip2
    %{l_prefix}/lib/openpkg/curl
    %{l_prefix}/lib/openpkg/find-provides
    %{l_prefix}/lib/openpkg/find-requires
    %{l_prefix}/lib/openpkg/gzip
    %{l_prefix}/lib/openpkg/macros
    %{l_prefix}/lib/openpkg/mkproxyrpm.pl
    %{l_prefix}/lib/openpkg/patch
    %{l_prefix}/lib/openpkg/rpm
    %{l_prefix}/lib/openpkg/rpmb
    %{l_prefix}/lib/openpkg/rpmdb
    %{l_prefix}/lib/openpkg/rpme
    %{l_prefix}/lib/openpkg/rpmi
    %{l_prefix}/lib/openpkg/rpmk
    %{l_prefix}/lib/openpkg/rpmpopt-%{V_rpm}
    %{l_prefix}/lib/openpkg/rpmq
    %{l_prefix}/lib/openpkg/rpmt
    %{l_prefix}/lib/openpkg/rpmtool
    %{l_prefix}/lib/openpkg/rpmu
    %{l_prefix}/lib/openpkg/rpmv
    %{l_prefix}/lib/openpkg/rpmx.pl
    %{l_prefix}/lib/openpkg/rpmx.sh
    %{l_prefix}/lib/openpkg/shtool
    %{l_prefix}/lib/openpkg/tar
    %{l_prefix}/lib/openpkg/config.guess
    %{l_prefix}/lib/openpkg/config.sub
    %{l_prefix}/lib/librpmpopt.a
    %{l_prefix}/lib/librpm.a
    %{l_prefix}/lib/librpmbuild.a
    %{l_prefix}/lib/librpmio.a
    %{l_prefix}/lib/librpmz.a
    %{l_prefix}/lib/librpmdb.a
    %dir %{l_prefix}/libexec
    %dir %{l_prefix}/man
    %dir %{l_prefix}/man/man1
    %dir %{l_prefix}/man/man2
    %dir %{l_prefix}/man/man3
    %dir %{l_prefix}/man/man4
    %dir %{l_prefix}/man/man5
    %dir %{l_prefix}/man/man6
    %dir %{l_prefix}/man/man7
    %dir %{l_prefix}/man/man8
    %dir %{l_prefix}/man/man9
    %dir %{l_prefix}/man/cat1
    %dir %{l_prefix}/man/cat2
    %dir %{l_prefix}/man/cat3
    %dir %{l_prefix}/man/cat4
    %dir %{l_prefix}/man/cat5
    %dir %{l_prefix}/man/cat6
    %dir %{l_prefix}/man/cat7
    %dir %{l_prefix}/man/cat8
    %dir %{l_prefix}/man/cat9
    %{l_prefix}/man/man8/rpm.8
    %{l_prefix}/man/man8/rpm2cpio.8
    %{l_prefix}/man/man8/lsync.8
    %dir %{l_prefix}/sbin
    %dir %{l_prefix}/pub
    %dir %{l_prefix}/share
    %dir %{l_prefix}/var
    %{l_prefix}/sbin/lsync
    %dir %{l_prefix}/local
    %{l_prefix}/local/README
    %{l_prefix}/local/.lsyncrc
    %dir %{l_prefix}/local/PKG
    %dir %{l_prefix}/local/bin
    %dir %{l_prefix}/local/etc
    %dir %{l_prefix}/local/include
    %dir %{l_prefix}/local/info
    %dir %{l_prefix}/local/lib
    %dir %{l_prefix}/local/man
    %dir %{l_prefix}/local/man/man1
    %dir %{l_prefix}/local/man/man2
    %dir %{l_prefix}/local/man/man3
    %dir %{l_prefix}/local/man/man4
    %dir %{l_prefix}/local/man/man5
    %dir %{l_prefix}/local/man/man6
    %dir %{l_prefix}/local/man/man7
    %dir %{l_prefix}/local/man/man8
    %dir %{l_prefix}/local/man/man9
    %dir %{l_prefix}/local/man/cat1
    %dir %{l_prefix}/local/man/cat2
    %dir %{l_prefix}/local/man/cat3
    %dir %{l_prefix}/local/man/cat4
    %dir %{l_prefix}/local/man/cat5
    %dir %{l_prefix}/local/man/cat6
    %dir %{l_prefix}/local/man/cat7
    %dir %{l_prefix}/local/man/cat8
    %dir %{l_prefix}/local/man/cat9
    %dir %{l_prefix}/local/sbin

%clean
    #   skip in bootstrap phase 2 (see openpkg.boot)
    [ ".$OPENPKG_BOOT" = .1 ] && exit 0

    #   cleanup after building
    rm -rf $RPM_BUILD_ROOT
    rm -rf %{name}-%{version}

%pre
    #   always performed for upgrades and because it doesn't harm!
    #[ ".$1" != .1 ] && exit 0

    #   this procedure is only usable with root priviledges
    #   (for non-root installations it is not required at all)
    cusr=`(id -un) 2>/dev/null ||\
          (id | sed -e 's;^[^(]*(\([^)]*\)).*;\1;') 2>/dev/null ||\
          (whoami) 2>/dev/null ||\
          (who am i | cut "-d " -f1) 2>/dev/null ||\
          echo $LOGNAME`

    #   determine runtime details (for both inside and outside RPM!!)
    #   - bootstrapping: $xxx is set from aux.wrapbin.sh
    #   - upgrading new: %{l_[smrn]{usr,grp}} is set via rpmmacros
    #   - upgrading old: %{l_[smrn]{usr,grp}} is not set at all
    [ ".$susr" = . ] && susr="%{?l_susr}%{!?l_susr:root}"
    [ ".$sgrp" = . ] && sgrp="%{?l_sgrp}%{!?l_sgrp:wheel}"
    [ ".$musr" = . ] && musr="%{?l_musr}%{!?l_musr:%{l_fsusr}}"
    [ ".$mgrp" = . ] && mgrp="%{?l_mgrp}%{!?l_mgrp:%{l_fsgrp}}"
    [ ".$rusr" = . ] && rusr="%{?l_rusr}%{!?l_rusr:%{l_fsusr}-r}"
    [ ".$rgrp" = . ] && rgrp="%{?l_rgrp}%{!?l_rgrp:%{l_fsgrp}-r}"
    [ ".$nusr" = . ] && nusr="%{?l_nusr}%{!?l_nusr:%{l_fsusr}-n}"
    [ ".$ngrp" = . ] && ngrp="%{?l_ngrp}%{!?l_ngrp:%{l_fsgrp}-n}"

    #   determine prefix
    [ ".$prefix" = . ] && prefix="%{l_prefix}"
    prefix=`echo "$prefix" | sed -e 's;//*;/;g' -e 's;/$;;'`

    #   determine user/group ids
    for class in s m r n; do
        eval "xusr=\"\$${class}usr\""
        eval "xgrp=\"\$${class}grp\""
        eval "xuid=\"\$${class}uid\""
        eval "xgid=\"\$${class}gid\""
        if [ ".$xuid" = . ]; then
            xuid=`(cat /etc/passwd; ypcat passwd) 2>/dev/null |\
                  grep "^${xusr}:" | awk -F: '{ print $3; }'`
            if [ ".$xuid" = . ]; then
                #   seek for a reasonably uid/gid pair
                xuid=1000
                ok=0
                while [ ".$ok" = .0 ]; do
                    eval "u_exists=\$u_exists_$xuid"
                    if [ ".$u_exists" = . ]; then
                        u_exists=`(cat /etc/passwd; ypcat passwd) 2>/dev/null | grep "^[^:]*:[^:]*:$xuid:"`
                    fi
                    eval "g_exists=\$g_exists_$xuid"
                    if [ ".$g_exists" = . ]; then
                        g_exists=`(cat /etc/group;  ypcat group)  2>/dev/null | grep "^[^:]*:[^:]*:$xuid:"`
                    fi
                    if [ ".$u_exists" = . -a ".$g_exists" = . ]; then
                        ok=1
                        break
                    fi
                    xuid=`expr $xuid + 1`
                done
                eval "u_exists_$xuid=yes"
                eval "g_exists_$xuid=yes"
            fi
        fi
        if [ ".$xgid" = . ]; then
            xgid=`(cat /etc/group; ypcat group) 2>/dev/null |\
                  grep "^${xgrp}:" | awk -F: '{ print $3; }'`
            if [ ".$xgid" = . ]; then
                xgid="$xuid"
            fi
        fi
        eval "${class}uid=\"$xuid\""
        eval "${class}gid=\"$xgid\""
    done

    #   determine platform id
    s=`(uname -s) 2>/dev/null` || s='Unknown'
    r=`(uname -r) 2>/dev/null` || r='0.0'
    plid="${s}/${r}"

    #   add entry to /etc/shells
    shell="${prefix}/lib/openpkg/bash"
    exists=`cat /etc/shells 2>/dev/null | grep "^$shell"`
    if [ ".$exists" = . ]; then
        if [ ".$cusr" != ".root" ]; then
            echo "openpkg:WARNING: skipping addition of $shell to /etc/shells" 1>&2
            echo "openpkg:WARNING: (would require root-priviledges)" 1>&2
        else
            echo "${shell}" >>/etc/shells
        fi
    fi

    #   create the hierarchy user/group
    for req in "superuser:${susr}:${suid}:${sgrp}:${sgid}" \
               "management:${musr}:${muid}:${mgrp}:${mgid}" \
               "restricted:${rusr}:${ruid}:${rgrp}:${rgid}" \
               "non-priviledged:${nusr}:${nuid}:${ngrp}:${ngid}"; do
        #    split request into class/usr/uid/grp/gid
        OIFS="$IFS"; IFS=":"; set -- $req; IFS="$OIFS"
        class="$1"; usr="$2"; uid="$3"; grp="$4"; gid="$5"

        #    check whether user already exists
        exists=`(cat /etc/passwd; ypcat passwd) 2>/dev/null | grep "^$usr:"`
        if [ ".$exists" = . ]; then
            if [ ".$cusr" != ".root" ]; then
                echo "openpkg:WARNING: skipping creation of OpenPKG $class user $usr" 1>&2
                echo "openpkg:WARNING: (would require root-priviledges)" 1>&2
            else
                #   add entry to passwd database
                realname="${prefix} OpenPKG ($class)"
                case "$plid" in
                    FreeBSD/* | NetBSD/* )
                        file=/etc/master.passwd
                        entry="${usr}:*:${uid}:${gid}::0:0:${realname}:${prefix}:${shell}"
                        update="(PATH=\$PATH:/usr/sbin; pwd_mkdb -p /etc/master.passwd)"
                        ;;
                    Linux/* )
                        file=/etc/passwd
                        entry="${usr}:*:${uid}:${gid}:${realname}:${prefix}:${shell}"
                        update="(PATH=\$PATH:/usr/sbin; pwconv)"
                        ;;
                    SunOS/5.* )
                        file=/etc/passwd
                        entry="${usr}:*:${uid}:${gid}:${realname}:${prefix}:${shell}"
                        update="(PATH=\$PATH:/usr/sbin; pwconv)"
                        ;;
                    OSF1/V5.* )
                        file=/etc/passwd
                        entry="${usr}:*:${uid}:${gid}:${realname}:${prefix}:${shell}"
                        update="(PATH=\$PATH:/usr/sbin; mkpasswd /etc/passwd)"
                        ;;
                    HP-UX/* )
                        file=/etc/passwd
                        entry="${usr}:*:${uid}:${gid}:${realname}:${prefix}:${shell}"
                        update=":"
                        ;;
                esac
                cp $file $file.bak && \
                (grep -v '^+:' $file.bak; echo $entry; grep '^+:' $file.bak) >$file
                rm -f $file.bak >/dev/null 2>&1
                eval $update
            fi
        fi

        #    check whether group already exists
        exists=`(cat /etc/group; ypcat group) 2>/dev/null | grep "^$grp:"`
        if [ ".$exists" = . ]; then
            if [ ".$cusr" != ".root" ]; then
                echo "openpkg:WARNING: skipping creation of OpenPKG $class group $grp" 1>&2
                echo "openpkg:WARNING: (would require root-priviledges)" 1>&2
            else
                #   add entry to group database
                file=/etc/group
                entry="${grp}:*:${gid}:${usr}"
                cp $file $file.bak && \
                (grep -v '^+:' $file.bak; echo $entry; grep '^+:' $file.bak) >$file
                rm -f $file.bak >/dev/null 2>&1
            fi
        fi
    done

    #   create the startup/shutdown transfer script
    name=`echo "$prefix" | sed -e 's;/;;g'`
    if [ ".$cusr" != ".root" ]; then
        echo "openpkg:WARNING: skipping creation of system run-command hooks" 1>&2
        echo "openpkg:WARNING: (would require root-priviledges)" 1>&2
    else
        case "$plid" in
            FreeBSD/* )
                if [ ! -f /etc/rc.d/${name}.sh ]; then
                    #   make sure /etc/rc.d exists
                    if [ ! -d /etc/rc.d ]; then
                        mkdir /etc/rc.d
                    fi
                    #   make sure /etc/rc.d is activated
                    (   . /etc/defaults/rc.conf
                        . /etc/rc.conf
                        found=0
                        for p in ${local_startup-x}; do
                            if [ ".$p" = "./etc/rc.d" ]; then
                                found=1
                                break
                            fi
                        done
                        if [ ".$found" = .0 ]; then
                          cp -p /etc/rc.conf /etc/rc.conf.bak
                          (
                            grep -v local_startup /etc/rc.conf.bak
                            echo "local_startup=\"/etc/rc.d $local_startup\""
                          ) >/etc/rc.conf
                        fi
                    )
                    #   install transfer script
                    rm -f /etc/rc.d/${name}.sh >/dev/null 2>&1
                    (   echo "#!/bin/sh"
                        echo "#"
                        echo "# ${name}.sh -- startup/shutdown transfer script for ${prefix} OpenPKG hierarchy"
                        echo "#"
                        echo "[ ! -f ${prefix}/etc/rc ] && exit 0"
                        echo "case \$1 in"
                        echo "    start ) exec ${prefix}/etc/rc all start ;;"
                        echo "    stop  ) exec ${prefix}/etc/rc all stop  ;;"
                        echo "esac"
                    ) >/etc/rc.d/${name}.sh
                    chmod 755 /etc/rc.d/${name}.sh
                fi
                ;;
            NetBSD/* )
                if [ ! -f /etc/rc.d/${name} ]; then
                    (   echo "#!/bin/sh"
                        echo "#"
                        echo "# ${name} -- startup/shutdown transfer script for ${prefix} OpenPKG hierarchy"
                        echo "#"
                        echo "# PROVIDE: ${name}"
                        echo "# REQUIRE: DAEMON LOGIN NETWORK SERVERS"
                        echo "#"
                        echo ""
                        echo "[ ! -f ${prefix}/etc/rc ] && exit 0"
                        echo "case \$1 in"
                        echo "    start   ) exec ${prefix}/etc/rc all start ;;"
                        echo "    stop    ) exec ${prefix}/etc/rc all stop  ;;"
                        echo "    restart ) exec ${prefix}/etc/rc all stop start ;;"
                        echo "    status  ) ;;"
                        echo "esac"
                    ) >/etc/rc.d/${name}
                    chmod 755 /etc/rc.d/${name}
                fi
                ;;
            Linux/* )
                # sroot: script root directory
                # lroot: link   root directory
                if [ -f /etc/debian_version ]; then
                    sroot=/etc/init.d
                    lroot=/etc/rc%d.d
                elif [ -f /etc/redhat-release -o -f /etc/mandrake-release ]; then
                    sroot=/etc/rc.d/init.d
                    lroot=/etc/rc.d/rc%d.d
                else
                    echo "WARNING: you are not running one of the supported standard" 1>&2
                    echo "WARNING: Linux platforms (Debian, RedHat). We are trying"  1>&2
                    echo "WARNING: to guess the location of the system init scripts!" 1>&2
                    sroot=""
                    lroot=""
                    for sr in /etc/rc.d/init.d /etc/init.d /sbin/init.d; do
                        if [ -d $sr ]; then
                            sroot="$sr"
                            break
                        fi
                    done
                    for lr in /etc/rc.d/rc2.d /etc/rc2.d /sbin/init.d/rc2.d; do
                        if [ -d $lr ]; then
                            lroot="`echo $lr | sed -e 's;2;%d;'`"
                            break
                        fi
                    done
                    if [ ".$sroot" = . -o ".$lroot" = . ]; then
                        echo "ERROR: Failed to guess the location of the system init scripts!" 1>&2
                        exit 1
                    fi
                fi
                if [ ! -f $sroot/${name} ]; then
                    #   install transfer script
                    (   echo "#!/bin/sh"
                        echo "#"
                        echo "# ${name} -- startup/shutdown transfer script for ${prefix} OpenPKG hierarchy"
                        echo "#"
                        echo "[ ! -f ${prefix}/etc/rc ] && exit 0"
                        echo "case \$1 in"
                        echo "    start ) exec ${prefix}/etc/rc all start ;;"
                        echo "    stop  ) exec ${prefix}/etc/rc all stop  ;;"
                        echo "esac"
                    ) >$sroot/${name}
                    chmod 755 $sroot/${name}
                    #   create corresponding symbolic links
                    for i in 2 3 4 5; do
                        ln -s $sroot/${name} `echo $lroot | sed -e "s;%d;$i;"`/S99${name}
                    done
                    for i in 0 1 6; do
                        ln -s $sroot/${name} `echo $lroot | sed -e "s;%d;$i;"`/K00${name}
                    done
                fi
                ;;
            SunOS/5.* )
                if [ ! -f /etc/init.d/${name} ]; then
                    #   install transfer script
                    (   echo "#!/bin/sh"
                        echo "#"
                        echo "# ${name} -- startup/shutdown transfer script for ${prefix} OpenPKG hierarchy"
                        echo "#"
                        echo "[ ! -f ${prefix}/etc/rc ] && exit 0"
                        echo "case \$1 in"
                        echo "    start ) exec ${prefix}/etc/rc all start ;;"
                        echo "    stop  ) exec ${prefix}/etc/rc all stop  ;;"
                        echo "esac"
                    ) >/etc/init.d/${name}
                    chmod 755 /etc/init.d/${name}
                    #   create corresponding symbolic links
                    ( cd /etc
                      ln init.d/${name} rc3.d/S99${name}
                      ln init.d/${name} rc0.d/K00${name}
                      ln init.d/${name} rc1.d/K00${name}
                    )
                fi
                ;;
            OSF1/V5.* )
                if [ ! -f /sbin/init.d/${name} ]; then
                    #   install transfer script
                    (   echo "#!/bin/sh"
                        echo "#"
                        echo "# ${name} -- startup/shutdown transfer script for ${prefix} OpenPKG hierarchy"
                        echo "#"
                        echo "[ ! -f ${prefix}/etc/rc ] && exit 0"
                        echo "case \$1 in"
                        echo "    start ) exec ${prefix}/etc/rc all start ;;"
                        echo "    stop  ) exec ${prefix}/etc/rc all stop  ;;"
                        echo "esac"
                    ) >/sbin/init.d/${name}
                    chmod 755 /sbin/init.d/${name}
                    #   create corresponding symbolic links
                    ( cd /sbin
                      ln -s ../init.d/${name} rc3.d/S99${name}
                      ln -s ../init.d/${name} rc0.d/K00${name}
                    )
                fi
                ;;
            HP-UX/* )
                if [ ! -f /sbin/init.d/${name} ]; then
                    #   install transfer script
                    (   echo "#!/bin/sh"
                        echo "#"
                        echo "# ${name} -- startup/shutdown transfer script for ${prefix} OpenPKG hierarchy"
                        echo "#"
                        echo "[ ! -f ${prefix}/etc/rc ] && exit 0"
                        echo "case \$1 in"
                        echo "    start ) exec ${prefix}/etc/rc all start ;;"
                        echo "    stop  ) exec ${prefix}/etc/rc all stop  ;;"
                        echo "esac"
                    ) >/sbin/init.d/${name}
                    chmod 755 /sbin/init.d/${name}
                    #   create corresponding symbolic links
                    ( cd /sbin
                      ln -s ../init.d/${name} rc2.d/S900${name}
                      ln -s ../init.d/${name} rc1.d/K100${name}
                    )
                fi
                ;;
        esac
    fi

    #   create the cron transfer entries
    if [ ".$cusr" != ".root" ]; then
        echo "openpkg:WARNING: skipping creation of system cron hooks" 1>&2
        echo "openpkg:WARNING: (would require root-priviledges)" 1>&2
    else
        case "$plid" in
            FreeBSD/* | Linux/* )
                exists=`grep "$prefix/etc/rc" /etc/crontab`
                if [ ".$exists" = . ]; then
                    (   echo "# <OpenPKG prefix=$prefix pkg=openpkg>"
                        echo "# chronological tasks of ${prefix} OpenPKG hierarchy"
                        echo "0    0  1  *  *  root  [ -f ${prefix}/etc/rc ] && ${prefix}/etc/rc all monthly"
                        echo "0    0  *  *  0  root  [ -f ${prefix}/etc/rc ] && ${prefix}/etc/rc all weekly"
                        echo "0    0  *  *  *  root  [ -f ${prefix}/etc/rc ] && ${prefix}/etc/rc all daily"
                        echo "0    *  *  *  *  root  [ -f ${prefix}/etc/rc ] && ${prefix}/etc/rc all hourly"
                        echo "*/15 *  *  *  *  root  [ -f ${prefix}/etc/rc ] && ${prefix}/etc/rc all quarterly"
                        echo "# </OpenPKG>"
                    ) >>/etc/crontab
                fi
                ;;
            SunOS/5.* | OSF1/V5.* | NetBSD/* | HP-UX/* )
                exists=`crontab -l | grep "$prefix/etc/rc"`
                if [ ".$exists" = . ]; then
                    EDITOR=/tmp/vipw.$$
                    VISUAL="$EDITOR"
                    export EDITOR
                    export VISUAL
                    ( echo "#!/bin/sh"
                      echo "(   echo \"# <OpenPKG prefix=$prefix pkg=openpkg>\""
                      echo "    echo \"# chronological tasks of ${prefix} OpenPKG hierarchy\""
                      echo "    echo \"0          0  1  *  *  [ -f ${prefix}/etc/rc ] && ${prefix}/etc/rc all monthly\""
                      echo "    echo \"0          0  *  *  0  [ -f ${prefix}/etc/rc ] && ${prefix}/etc/rc all weekly\""
                      echo "    echo \"0          0  *  *  *  [ -f ${prefix}/etc/rc ] && ${prefix}/etc/rc all daily\""
                      echo "    echo \"0          *  *  *  *  [ -f ${prefix}/etc/rc ] && ${prefix}/etc/rc all hourly\""
                      echo "    echo \"0,15,30,45 *  *  *  *  [ -f ${prefix}/etc/rc ] && ${prefix}/etc/rc all quarterly\""
                      echo "    echo \"# </OpenPKG>\""
                      echo ") >>\$1"
                    ) >$EDITOR
                    chmod a+x $EDITOR
                    (PATH="$PATH:/usr/bin"; crontab -e)
                    rm -f $EDITOR
                fi
                ;;
        esac
    fi

%post
    #   Finally, rebuild the RPM database with the newly installed RPM
    #   program on upgrades. Because of RPM internal database locking we
    #   have to play a little trick here and delay the operation until RPM
    #   thinks this "post" script has already terminated.
    if [ ".$1" = .2 ]; then
        ( sleep 2
          %{l_prefix}/bin/rpm --rebuilddb
          chown %{l_musr}:%{l_mgrp} %{l_prefix}/RPM/DB/* || true
        ) </dev/null >/dev/null 2>/dev/null &
    fi

%preun
    [ ".$1" != .0 ] && exit 0

    #   remove files which are not RPM controlled
    rm -rf %{l_prefix}/RPM/TMP/* >/dev/null 2>&1 || true
    rm -rf %{l_prefix}/RPM/SRC/* >/dev/null 2>&1 || true
    rm -rf %{l_prefix}/RPM/PKG/* >/dev/null 2>&1 || true
    rm -rf %{l_prefix}/RPM/DB/*  >/dev/null 2>&1 || true

    ##
    ##  The following code usually would be done in a %postun section.
    ##  But because we already had to remove the database in this %preun
    ##  section (see the 'rm' commands above) in order to make RPM happy
    ##  inside its own removal procedure, RPM would no longer find the
    ##  %postun script (because it's recorded in the database files). So
    ##  we have to perform the procedure already in this %preun script.
    ##  except for the removal of the top-level directory it does not
    ##  matter. But the top-level directory can only be removed after
    ##  the RPM removal procedure took place, so we play a little delay
    ##  trick below.
    ##

    #   determine current user
    cusr=`(id -un) 2>/dev/null ||\
          (id | sed -e 's;^[^(]*(\([^)]*\)).*;\1;') 2>/dev/null ||\
          (whoami) 2>/dev/null ||\
          (who am i | cut "-d " -f1) 2>/dev/null ||\
          echo $LOGNAME`

    #   determine runtime details (for both inside and outside RPM!!)
    user="%{l_musr}"
    group="%{l_mgrp}"
    prefix="%{l_prefix}"
    prefix=`echo "$prefix" | sed -e 's;//*;/;g' -e 's;/$;;'`

    #   determine platform id
    s=`(uname -s) 2>/dev/null` || s='Unknown'
    r=`(uname -r) 2>/dev/null` || r='0.0'
    plid="${s}/${r}"

    #   remove entry in /etc/shells
    shell="${prefix}/lib/openpkg/bash"
    exists=`cat /etc/shells 2>/dev/null | grep "^$shell"`
    if [ ".$exists" != . ]; then
        if [ ".$cusr" != ".root" ]; then
            echo "openpkg:WARNING: skipping deletion of $shell from /etc/shells" 1>&2
            echo "openpkg:WARNING: (would require root-priviledges)" 1>&2
        else
            cp /etc/shells /etc/shells.bak && \
            grep -v "^${shell}" /etc/shells.bak >/etc/shells
        fi
    fi

    #   remove the hierarchy user/group
    for req in "super-user:%{l_susr}:%{l_suid}:%{l_sgrp}:%{l_sgid}" \
               "management:%{l_musr}:%{l_muid}:%{l_mgrp}:%{l_mgid}" \
               "restricted:%{l_rusr}:%{l_ruid}:%{l_rgrp}:%{l_rgid}" \
               "non-priviledged:%{l_nusr}:%{l_nuid}:%{l_ngrp}:%{l_ngid}"; do
        #    split request into class/usr/uid/grp/gid
        OIFS="$IFS"; IFS=":"; set -- $req; IFS="$OIFS"
        class="$1"; usr="$2"; uid="$3"; grp="$4"; gid="$5"

        #    check whether user already exists
        exists=`(cat /etc/passwd; ypcat passwd) 2>/dev/null | grep "^$usr:"`
        if [ ".$exists" != . ]; then
            if [ ".$cusr" != ".root" ]; then
                echo "openpkg:WARNING: skipping deletion of OpenPKG $class user $usr" 1>&2
                echo "openpkg:WARNING: (would require root-priviledges)" 1>&2
            elif [ ".$usr" = ".root" ]; then
                echo "openpkg:WARNING: skipping deletion of OpenPKG $class user $usr" 1>&2
                echo "openpkg:WARNING: (would remove system standard user)" 1>&2
            else
                case "$plid" in
                    FreeBSD/* | NetBSD/* )
                        cp /etc/master.passwd /etc/master.passwd.bak && \
                        grep -v "^${usr}:" /etc/master.passwd.bak >/etc/master.passwd
                        (PATH="$PATH:/usr/sbin"; pwd_mkdb -p /etc/master.passwd)
                        ;;
                    Linux/* | SunOS/5.* )
                        cp /etc/passwd /etc/passwd.bak && \
                        grep -v "^${usr}:" /etc/passwd.bak >/etc/passwd
                        (PATH="$PATH:/usr/sbin"; pwconv)
                        ;;
                    OSF1/V5.* )
                        cp /etc/passwd /etc/passwd.bak && \
                        grep -v "^${usr}:" /etc/passwd.bak >/etc/passwd
                        (PATH="$PATH:/usr/sbin"; mkpasswd /etc/passwd)
                        ;;
                    HP-UX/* )
                        cp /etc/passwd /etc/passwd.bak && \
                        grep -v "^${usr}:" /etc/passwd.bak >/etc/passwd
                        ;;
                esac
            fi
        fi

        #    check whether group already exists
        exists=`(cat /etc/group; ypcat group) 2>/dev/null | grep "^$grp:"`
        if [ ".$exists" = . ]; then
            if [ ".$cusr" != ".root" ]; then
                echo "openpkg:WARNING: skipping deletion of OpenPKG $class group $grp" 1>&2
                echo "openpkg:WARNING: (would require root-priviledges)" 1>&2
            elif [ ".$usr" = ".root" ] || [ ".$grp" = ".root" ] || [ ".$grp" = ".wheel" ]; then
                echo "openpkg:WARNING: skipping deletion of OpenPKG $class group $grp" 1>&2
                echo "openpkg:WARNING: (would remove system standard group)" 1>&2
            else
                #   delete group entry
                cp /etc/group /etc/group.bak && \
                grep -v "^${grp}:" /etc/group.bak >/etc/group
            fi
        fi
    done

    #   remove the startup/shutdown transfer ripts
    name=`echo "$prefix" | sed -e 's;/;;g'`
    if [ ".$cusr" != ".root" ]; then
        echo "openpkg:WARNING: skipping deletion of system run-command hooks" 1>&2
        echo "openpkg:WARNING: (would require root-priviledges)" 1>&2
    else
        case "$plid" in
            FreeBSD/* )
                rm -f /etc/rc.d/${name}.sh >/dev/null 2>&1
                ;;
            NetBSD/* )
                rm -f /etc/rc.d/${name} >/dev/null 2>&1
                ;;
            Linux/* )
                # sroot: script root directory
                # lroot: link   root directory
                if [ -f /etc/debian_version ]; then
                    sroot=/etc/init.d
                    lroot=/etc/rc%d.d
                elif [ -f /etc/redhat-release -o -f /etc/mandrake-release ]; then
                    sroot=/etc/rc.d/init.d
                    lroot=/etc/rc.d/rc%d.d
                else
                    echo "WARNING: you are not running one of the supported standard" 1>&2
                    echo "WARNING: Linux platforms (Debian, RedHat). We are trying"  1>&2
                    echo "WARNING: to guess the location of the system init scripts!" 1>&2
                    sroot=""
                    lroot=""
                    for sr in /etc/rc.d/init.d /etc/init.d /sbin/init.d; do
                        if [ -d $sr ]; then
                            sroot="$sr"
                            break
                        fi
                    done
                    for lr in /etc/rc.d/rc2.d /etc/rc2.d /sbin/init.d/rc2.d; do
                        if [ -d $lr ]; then
                            lroot="`echo $lr | sed -e 's;2;%d;'`"
                            break
                        fi
                    done
                    if [ ".$sroot" = . -o ".$lroot" = . ]; then
                        echo "ERROR: Failed to guess the location of the system init scripts!" 1>&2
                        exit 1
                    fi
                fi
                rm -f ${sroot}/${name} >/dev/null 2>&1
                for i in 2 3 4 5; do
                    rm -f `echo $lroot | sed -e "s;%d;$i;"`/S99${name} >/dev/null 2>&1
                done
                for i in 0 1 6; do
                    rm -f `echo $lroot | sed -e "s;%d;$i;"`/K00${name} >/dev/null 2>&1
                done
                ;;
            SunOS/5.* )
                rm -f /etc/init.d/${name} >/dev/null 2>&1
                rm -f /etc/rc3.d/S99${name} >/dev/null 2>&1
                rm -f /etc/rc0.d/K00${name} >/dev/null 2>&1
                rm -f /etc/rc1.d/K00${name} >/dev/null 2>&1
                ;;
            OSF1/V5.* )
                rm -f /sbin/init.d/${name} >/dev/null 2>&1
                rm -f /sbin/rc3.d/S99${name} >/dev/null 2>&1
                rm -f /sbin/rc0.d/K00${name} >/dev/null 2>&1
                ;;
            HP-UX/* )
                rm -f /sbin/init.d/${name} >/dev/null 2>&1
                rm -f /etc/rc2.d/S900${name} >/dev/null 2>&1
                rm -f /etc/rc1.d/K100${name} >/dev/null 2>&1
                ;;
        esac
    fi

    #   remove the cron transfer entries
    if [ ".$cusr" != ".root" ]; then
        echo "openpkg:WARNING: skipping deletion of system cron hooks" 1>&2
        echo "openpkg:WARNING: (would require root-priviledges)" 1>&2
    else
        case "$plid" in
            FreeBSD/* | Linux/* )
                exists=`grep "<OpenPKG prefix=$prefix pkg=openpkg>" /etc/crontab`
                if [ ".$exists" != . ]; then
                    p=`echo $prefix | sed -e 's;/;\\\\/;g'`
                    cp /etc/crontab /etc/crontab.bak
                    cat /etc/crontab.bak |\
                    sed -e "/<OpenPKG prefix=$p pkg=openpkg>/,/<\\/OpenPKG>/d" \
                    >/etc/crontab
                fi
                ;;
            SunOS/5.* | OSF1/V5.* | NetBSD/* | HP-UX/* )
                EDITOR=/tmp/vipw.$$
                VISUAL="$EDITOR"
                export EDITOR
                export VISUAL
                p=`echo $prefix | sed -e 's;/;\\\\\\\\/;g'`
                ( echo "cp \$1 \$1.bak"
                  echo "cat \$1.bak | sed -e \"/<OpenPKG prefix=$p pkg=openpkg>/,/<\\\\/OpenPKG>/d\" >\$1"
                  echo "rm -f \$1.bak"
                ) >$EDITOR
                chmod a+x $EDITOR
                (PATH="$PATH:/usr/bin"; crontab -e)
                rm -f $EDITOR
                ;;
        esac
    fi

    #   delayed removal of top-level directory.
    ( sleep 10
      rmdir %{l_prefix} >/dev/null 2>&1 || true
    ) </dev/null >/dev/null 2>/dev/null &

