Annotation of embedaddon/sudo/pp, revision 1.1

1.1     ! misho       1: #!/bin/sh
        !             2: # (c) 2011 Quest Software, Inc. All rights reserved
        !             3: pp_revision="305"
        !             4:  # Copyright 2010 Quest Software, Inc.  All rights reserved.
        !             5:  #
        !             6:  # Redistribution and use in source and binary forms, with or without
        !             7:  # modification, are permitted provided that the following conditions
        !             8:  # are met:
        !             9:  #
        !            10:  # 1. Redistributions of source code must retain the above copyright
        !            11:  #    notice, this list of conditions and the following disclaimer.
        !            12:  # 2. Redistributions in binary form must reproduce the above copyright
        !            13:  #    notice, this list of conditions and the following disclaimer in the
        !            14:  #    documentation and/or other materials provided with the distribution.
        !            15:  # 3. Neither the name of Quest Software, Inc. nor the names of its
        !            16:  #    contributors may be used to endorse or promote products derived from
        !            17:  #    this software without specific prior written permission.
        !            18:  #
        !            19:  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        !            20:  # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        !            21:  # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
        !            22:  # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
        !            23:  # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
        !            24:  # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
        !            25:  # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
        !            26:  # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
        !            27:  # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
        !            28:  # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
        !            29:  # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            30: 
        !            31:  # Please see <http://rc.quest.com/topics/polypkg/> for more information
        !            32: 
        !            33: pp_version="1.0.0.$pp_revision"
        !            34: pp_copyright="Copyright 2010, Quest Software, Inc. All rights reserved."
        !            35: 
        !            36: pp_opt_debug=false
        !            37: pp_opt_destdir="$DESTDIR"
        !            38: pp_opt_install_script=
        !            39: pp_opt_list=false
        !            40: pp_opt_no_clean=false
        !            41: pp_opt_no_package=false
        !            42: pp_opt_only_front=false
        !            43: pp_opt_platform=
        !            44: pp_opt_probe=false
        !            45: pp_opt_strip=false
        !            46: pp_opt_save_unstripped=false
        !            47: pp_opt_vas_platforms=false
        !            48: pp_opt_wrkdir="`pwd`/pp.work.$$"
        !            49: pp_opt_verbose=false
        !            50: pp_opt_version=false
        !            51: pp_opt_input="-"
        !            52: pp_opt_init_vars=""
        !            53: pp_opt_eval=
        !            54: 
        !            55: test -n "$PP_NO_CLEAN" && pp_opt_no_clean=true
        !            56: test -n "$PP_DEBUG" && pp_opt_debug=true
        !            57: test -n "$PP_VERBOSE" && pp_opt_verbose=true
        !            58: 
        !            59: pp_main_cleanup () {
        !            60:        pp_debug "main_cleanup"
        !            61:         pp_remove_later_now
        !            62:        if $pp_opt_no_clean || test x"$pp_platform" = x"unknown"; then
        !            63:            : no cleanup
        !            64:        else
        !            65:            pp_backend_${pp_platform}_cleanup
        !            66:            $pp_errors && pp_die "Errors during cleanup"
        !            67:            if test -d "$pp_wrkdir"; then
        !            68:                if $pp_opt_debug; then
        !            69:                    pp_debug "not removing $pp_wrkdir"
        !            70:                else
        !            71:                    pp_verbose rm -rf "$pp_wrkdir"
        !            72:                fi
        !            73:            fi
        !            74:        fi
        !            75: }
        !            76: 
        !            77: pp_parseopts () {
        !            78:         typeset a n _var _val
        !            79:        while test $# -gt 0; do
        !            80: 
        !            81:          # convert -[dilpv] to --long-options
        !            82:          case "$1" in
        !            83:            --?*=?*) n=`echo "$1" | sed -ne 's/^--\([^=]*\)=.*/\1/p'`
        !            84:                   a=`echo "$1" | sed -ne 's/^--[^=]*=\(.*\)/\1/p'`
        !            85:                   shift
        !            86:                   set -- "--$n" "$a" "$@";;
        !            87:            --?*) : ;;
        !            88: 
        !            89:            -d)  shift; set -- "--debug" "$@";;
        !            90:            -d*) a=`echo "$1" | sed -ne 's/^-.//'`
        !            91:                 shift; set -- "--debug" "$@";;
        !            92: 
        !            93:            -i) shift; set -- "--install-script" "$@";;
        !            94:            -i*) a=`echo "$1" | sed -ne 's/^-.//'`
        !            95:                 shift; set -- "--install-script" "$a" "$@";;
        !            96: 
        !            97:            -l)  shift; set -- "--list" "$@";;
        !            98:            -l*) a=`echo "$1" | sed -ne 's/^-.//'`
        !            99:                 shift; set -- "--list" "$@";;
        !           100: 
        !           101:            -p) shift; set -- "--platform" "$@";;
        !           102:            -p*) a=`echo "$1" | sed -ne 's/^-.//'`
        !           103:                 shift; set -- "--platform" "$a" "$@";;
        !           104: 
        !           105:            -v)  shift; set -- "--verbose" "$@";;
        !           106:            -v*) a=`echo "$1" | sed -ne 's/^-.//'`
        !           107:                 shift; set -- "--verbose" "$@";;
        !           108: 
        !           109:            -\?)  shift; set -- "--help" "$@";;
        !           110:            -\?*) a=`echo "$1" | sed -ne 's/^-.//'`
        !           111:                 shift; set -- "--help" "$@";;
        !           112:          esac
        !           113: 
        !           114:          case "$1" in
        !           115:            --destdir|--eval|--install-script|--platform|--wrkdir)
        !           116:                test $# -ge 2 || pp_error "missing argument to $1";;
        !           117:          esac
        !           118: 
        !           119:          case "$1" in
        !           120:            --)                                        shift;break;;
        !           121:            --debug)           pp_opt_debug=true;      shift;;
        !           122:            --destdir)         pp_opt_destdir="$2";    shift;shift;;
        !           123:            --eval)            pp_opt_eval="$2";       shift;shift;; # undoc
        !           124:            --install-script)  pp_opt_install_script="$2"; shift;shift;;
        !           125:            --list)            pp_opt_list=true;       shift;;
        !           126:            --no-clean)        pp_opt_no_clean=true;   shift;;
        !           127:            --no-package)      pp_opt_no_package=true; shift;;
        !           128:            --only-front)      pp_opt_only_front=true; shift;;
        !           129:            --platform)        pp_opt_platform="$2";   shift;shift;;
        !           130:            --probe)           pp_opt_probe=true;      shift;;
        !           131:            --strip)           pp_opt_strip=true;      shift;;
        !           132:            --save-unstripped) pp_opt_save_unstripped=true; shift;;
        !           133:            --wrkdir)          pp_opt_wrkdir="$2";     shift;shift;;
        !           134:            --vas-platforms)   pp_opt_vas_platforms=true; shift;;
        !           135:            --verbose)         pp_opt_verbose=true;    shift;;
        !           136:            --version)         pp_opt_version=true;    shift;;
        !           137:            --help)            pp_errors=true;         shift;;
        !           138:            -) break;;
        !           139:            -*) pp_error "unknown option $1"; shift;;
        !           140:            *) break;;
        !           141:          esac
        !           142: 
        !           143:        done
        !           144: 
        !           145:        pp_opt_input=-
        !           146:        if test $# -gt 0; then
        !           147:            pp_opt_input="$1"
        !           148:            shift
        !           149:        fi
        !           150: 
        !           151:         #-- extra arguments of the form Foo=bar alter *global* vars
        !           152:         while test $# -gt 0; do
        !           153:             case "$1" in
        !           154:                -*)     pp_error "unexpected option '$1'"
        !           155:                        shift;;
        !           156:                 *=*)    _val="${1#*=}"
        !           157:                         _var=${1%="$_val"}
        !           158:                         _val=`echo "$_val"|sed -e 's/[$"\\]/\\&/g'`
        !           159:                         pp_debug "setting $_var = \"$_val\""
        !           160:                         pp_opt_init_vars="$pp_opt_init_vars$_var=\"$_val\";"
        !           161:                         shift;;
        !           162:                 *)      pp_error "unexpected argument $1'"
        !           163:                        shift;;
        !           164:             esac
        !           165:         done
        !           166: 
        !           167:        test $# -gt 0 &&
        !           168:             pp_error "unknown argument $1"
        !           169: 
        !           170:        if $pp_errors; then
        !           171:            cat <<. >&2
        !           172: polypkg $pp_version $pp_copyright
        !           173: usage: $0 [options] [input.pp] [var=value ...]
        !           174:     -d --debug                  -- write copious info to stderr
        !           175:        --destdir=path           -- file root, defaults to \$DESTDIR
        !           176:     -? --help                   -- display this information
        !           177:     -i --install-script=path    -- create an install helper script
        !           178:     -l --list                   -- write package filenames to stdout
        !           179:        --no-clean               -- don't remove temporary files
        !           180:        --no-package             -- do everything but create packages
        !           181:        --only-front             -- only perform front-end actions
        !           182:     -p --platform=platform      -- defaults to local platform
        !           183:        --probe                  -- print local system identifier, then exit
        !           184:        --strip                  -- strip debug symbols from binaries before
        !           185:                                    packaging (modifies files in destdir)
        !           186:        --save-unstripped        -- save unstripped binaries to
        !           187:                                    \$name-\$version-unstripped.tar.gz
        !           188:        --wrkdir=path            -- defaults to subdirectory of \$TMPDIR or /tmp
        !           189:     -v --verbose                -- write info to stderr
        !           190:        --version                -- display version and quit
        !           191: .
        !           192:            exit 1
        !           193:        fi
        !           194: }
        !           195: 
        !           196: pp_drive () {
        !           197:        # initialise the front and back ends
        !           198:         pp_model_init
        !           199:        pp_frontend_init
        !           200:        $pp_opt_only_front || pp_backend_init
        !           201: 
        !           202:        # run the front-end to generate the intermediate files
        !           203:         # set $pp_input_dir to be the 'include dir' if needed
        !           204:        pp_debug "calling frontend on $pp_opt_input"
        !           205:        case "$pp_opt_input" in
        !           206:            -)   pp_input_dir=.
        !           207:                 test -t 1<&0 &&
        !           208:                    pp_warn "reading directives from standard input"
        !           209:                  pp_frontend
        !           210:                  ;;
        !           211:             */*) pp_input_dir=${pp_opt_input%/*}
        !           212:                 pp_frontend <"$pp_opt_input"
        !           213:                  ;;
        !           214:             *)   pp_input_dir=.
        !           215:                 pp_frontend <"$pp_opt_input"
        !           216:                  ;;
        !           217:        esac
        !           218: 
        !           219:         pp_files_ignore_others
        !           220:         pp_service_scan_groups
        !           221: 
        !           222:        # some sanity checks after front-end processing
        !           223:         if test x"$pp_platform" != x"null"; then
        !           224:            pp_debug "sanity checks"
        !           225:            test -n "$pp_components" || pp_error "No components?"
        !           226:            pp_check_var_is_defined  "name"
        !           227:            pp_check_var_is_defined  "version"
        !           228:             pp_files_check_duplicates
        !           229:             pp_files_check_coverage
        !           230:            pp_die_if_errors "Errors during sanity checks"
        !           231:         fi
        !           232: 
        !           233:        # stop now if we're only running the front
        !           234:        $pp_opt_only_front && return
        !           235: 
        !           236:        if test x"$pp_opt_strip" = x"true"; then
        !           237:            pp_strip_binaries
        !           238:        fi
        !           239: 
        !           240:        # run the back-end to generate the package
        !           241:        pp_debug "calling backend"
        !           242:        pp_backend
        !           243:        pp_die_if_errors "Errors during backend processing"
        !           244: 
        !           245:        # copy the resulting package files to PP_PKGDESTDIR or .
        !           246:        for f in `pp_backend_names` -; do
        !           247:            test x"$f" = x"-" && continue
        !           248:           pp_debug "copying: $f to `pwd`"
        !           249:           if pp_verbose cp -r $pp_wrkdir/$f ${PP_PKGDESTDIR:-.}; then
        !           250:                echo "${PP_PKGDESTDIR:+$PP_PKGDESTDIR/}$f"
        !           251:            else
        !           252:                pp_error "$f: missing package"
        !           253:            fi
        !           254:        done
        !           255:        pp_die_if_errors "Errors during package copying"
        !           256: }
        !           257: 
        !           258: pp_install_script () {
        !           259:         pp_debug "writing install script to $pp_opt_install_script"
        !           260:         rm -f $pp_opt_install_script
        !           261:         pp_backend_install_script > $pp_opt_install_script
        !           262:        pp_die_if_errors "Errors during package install script"
        !           263:         chmod +x $pp_opt_install_script
        !           264: }
        !           265: 
        !           266: pp_main () {
        !           267:        # If PP_DEV_PATH is set, then jump to that script.
        !           268:        # (Useful when working on polypkg source that isn't installed)
        !           269:        if test -n "$PP_DEV_PATH" -a x"$PP_DEV_PATH" != x"$0"; then
        !           270:            pp_warn "switching from $0 to $PP_DEV_PATH ..."
        !           271:            exec "$PP_DEV_PATH" "$@" || exit 1
        !           272:        fi
        !           273: 
        !           274:        pp_set_expand_converter_or_reexec "$@"
        !           275:        pp_parseopts "$@"
        !           276: 
        !           277:         if $pp_opt_version; then
        !           278:             #-- print version and exit
        !           279:             echo "polypkg $pp_version"
        !           280:             exit 0
        !           281:         fi
        !           282: 
        !           283:        pp_set_platform
        !           284: 
        !           285:        trap 'pp_main_cleanup' 0
        !           286: 
        !           287:        pp_wrkdir="$pp_opt_wrkdir"
        !           288:        pp_debug "pp_wrkdir = $pp_wrkdir"
        !           289:        rm -rf "$pp_wrkdir"
        !           290:        mkdir -p "$pp_wrkdir"
        !           291: 
        !           292:        pp_destdir="$pp_opt_destdir"
        !           293:        pp_debug "pp_destdir = $pp_destdir"
        !           294: 
        !           295:         if $pp_opt_probe; then
        !           296:            pp_backend_init
        !           297:             pp_backend_probe
        !           298:         elif $pp_opt_vas_platforms; then
        !           299:            pp_backend_init
        !           300:             pp_backend_vas_platforms
        !           301:        elif test -n "$pp_opt_eval"; then
        !           302:            #-- execute a shell command
        !           303:            eval "$pp_opt_eval" || exit
        !           304:        else
        !           305:            pp_drive
        !           306:            if test -n "$pp_opt_install_script"; then
        !           307:                pp_install_script
        !           308:            fi
        !           309:         fi
        !           310: 
        !           311:        exit 0
        !           312: }
        !           313: 
        !           314: 
        !           315: pp_errors=false
        !           316: 
        !           317: if test -n "$TERM" -a -t 1 && (tput op) >/dev/null 2>/dev/null; then
        !           318:    pp_col_redfg=`tput setf 4` 2>/dev/null
        !           319:    pp_col_bluefg=`tput setf 1` 2>/dev/null
        !           320:    pp_col_reset=`tput op` 2>/dev/null
        !           321: else
        !           322:    pp_col_redfg='['
        !           323:    pp_col_bluefg='['
        !           324:    pp_col_reset=']'
        !           325: fi
        !           326: 
        !           327: pp__warn () {
        !           328:        if test x"" = x"$pp_lineno"; then
        !           329:            echo "$1 $2" >&2
        !           330:        else
        !           331:            echo "$1 line $pp_lineno: $2" >&2
        !           332:        fi
        !           333: }
        !           334: 
        !           335: pp_warn () {
        !           336:        pp__warn "pp: ${pp_col_redfg}warning${pp_col_reset}" "$*"
        !           337: }
        !           338: 
        !           339: pp_error () {
        !           340:        pp__warn "pp: ${pp_col_redfg}error${pp_col_reset}" "$*"
        !           341:        pp_errors=true
        !           342: }
        !           343: 
        !           344: pp_die () {
        !           345:        pp_error "$@"
        !           346:        exit 1
        !           347: }
        !           348: 
        !           349: pp_die_if_errors () {
        !           350:        $pp_errors && pp_die "$@"
        !           351: }
        !           352: 
        !           353: pp_debug () {
        !           354:        $pp_opt_debug && echo "${pp_col_bluefg}debug${pp_col_reset} $*" >&2
        !           355: }
        !           356: 
        !           357: pp_verbose () {
        !           358:        $pp_opt_verbose && echo "pp: ${pp_col_bluefg}info${pp_col_reset} $*" >&2
        !           359:        "$@";
        !           360: }
        !           361: 
        !           362: pp_substitute () {
        !           363:   sed -e 's,%(\([^)]*\)),`\1`,g' \
        !           364:       -e 's,%{\([^}]*\)},${\1},g' \
        !           365:       -e 's,$,,' |
        !           366:   tr '' '\012' |
        !           367:   sed -e '/^[^]/s/["$`\\]/\\&/g' \
        !           368:       -e 's/^//' \
        !           369:       -e '1s/^/echo "/' \
        !           370:       -e '$s,$,",' \
        !           371:       -e 's,,"echo ",g' |
        !           372:   tr -d '\012' |
        !           373:   tr '' '\012'
        !           374:   echo
        !           375: }
        !           376: 
        !           377: pp_incr () {
        !           378:     eval "$1=\`expr \$$1 + 1\`"
        !           379: }
        !           380: 
        !           381: pp_decr () {
        !           382:     eval "$1=\`expr \$$1 - 1\`"
        !           383: }
        !           384: 
        !           385: pp_check_var_is_defined () {
        !           386:     if eval test -z "\"\$$1\""; then
        !           387:        pp_error "\$$1: not set"
        !           388:        eval "$1=undefined"
        !           389:     fi
        !           390: }
        !           391: 
        !           392: pp_contains () {
        !           393:     case " $1 " in
        !           394:        *" $2 "*) return 0;;
        !           395:        *) return 1;;
        !           396:     esac
        !           397: }
        !           398: 
        !           399: pp_contains_all () {
        !           400:     typeset _s _c
        !           401:     _l="$1"; shift
        !           402:     for _w
        !           403:     do
        !           404:        pp_contains "$_l" "$_w" || return 1
        !           405:     done
        !           406:     return 0
        !           407: }
        !           408: 
        !           409: pp_contains_any () {
        !           410:     typeset _s _c
        !           411:     _l="$1"; shift
        !           412:     for _w
        !           413:     do
        !           414:        pp_contains "$_l" "$_w" && return 0
        !           415:     done
        !           416:     return 1
        !           417: }
        !           418: 
        !           419: pp_add_to_list () {
        !           420:     if eval test -z \"\$$1\"; then
        !           421:        eval $1='"$2"'
        !           422:     elif eval pp_contains '"$'$1'"' '"$2"'; then
        !           423:        : already there
        !           424:     else
        !           425:        eval $1='"$'$1' $2"'
        !           426:     fi
        !           427: }
        !           428: 
        !           429: pp_unique () {
        !           430:     typeset result element
        !           431:     result=
        !           432:     for element
        !           433:     do
        !           434:        pp_add_to_list result $element
        !           435:     done
        !           436:     echo $result
        !           437: }
        !           438: 
        !           439: pp_mode_strip_altaccess () {
        !           440:     case "$1" in
        !           441:        ??????????[+.])
        !           442:            echo `echo "$1" | cut -b -10`;;
        !           443:        *)
        !           444:            echo "$1";;
        !           445:     esac
        !           446: }
        !           447: 
        !           448: pp_mode_from_ls () {
        !           449:    typeset umode gmode omode smode
        !           450: 
        !           451:    set -- `pp_mode_strip_altaccess "$1"`
        !           452: 
        !           453:    case "$1" in
        !           454:        ?--[-X]??????) umode=0;;
        !           455:        ?--[xs]??????) umode=1;;
        !           456:        ?-w[-X]??????) umode=2;;
        !           457:        ?-w[xs]??????) umode=3;;
        !           458:        ?r-[-X]??????) umode=4;;
        !           459:        ?r-[xs]??????) umode=5;;
        !           460:        ?rw[-X]??????) umode=6;;
        !           461:        ?rw[xs]??????) umode=7;;
        !           462:        *) pp_error "bad user mode $1";;
        !           463:    esac
        !           464: 
        !           465:    case "$1" in
        !           466:        ????--[-S]???) gmode=0;;
        !           467:        ????--[xs]???) gmode=1;;
        !           468:        ????-w[-S]???) gmode=2;;
        !           469:        ????-w[xs]???) gmode=3;;
        !           470:        ????r-[-X]???) gmode=4;;
        !           471:        ????r-[xs]???) gmode=5;;
        !           472:        ????rw[-X]???) gmode=6;;
        !           473:        ????rw[xs]???) gmode=7;;
        !           474:        *) pp_error "bad group mode $1";;
        !           475:    esac
        !           476: 
        !           477:    case "$1" in
        !           478:        ???????--[-T]) omode=0;;
        !           479:        ???????--[xt]) omode=1;;
        !           480:        ???????-w[-T]) omode=2;;
        !           481:        ???????-w[xt]) omode=3;;
        !           482:        ???????r-[-T]) omode=4;;
        !           483:        ???????r-[xt]) omode=5;;
        !           484:        ???????rw[-T]) omode=6;;
        !           485:        ???????rw[xt]) omode=7;;
        !           486:        *) pp_error "bad other mode $1";;
        !           487:    esac
        !           488: 
        !           489:    case "$1" in
        !           490:        ???[-x]??[-x]??[-x]) smode=;;
        !           491:        ???[-x]??[-x]??[tT]) smode=1;;
        !           492:        ???[-x]??[Ss]??[-x]) smode=2;;
        !           493:        ???[-x]??[Ss]??[tT]) smode=3;;
        !           494:        ???[Ss]??[-x]??[-x]) smode=4;;
        !           495:        ???[Ss]??[-x]??[tT]) smode=5;;
        !           496:        ???[Ss]??[Ss]??[-x]) smode=6;;
        !           497:        ???[Ss]??[Ss]??[tT]) smode=7;;
        !           498:        *) pp_error "bad set-id mode $1";;
        !           499:    esac
        !           500: 
        !           501:    echo "$smode$umode$gmode$omode"
        !           502: }
        !           503: 
        !           504: pp_find_recurse () {
        !           505:   pp_debug "find: ${1#$pp_destdir}/"
        !           506:   for f in "$1"/.* "$1"/*; do
        !           507:     case "$f" in */.|*/..) continue;; esac  # should never happen!
        !           508:     if test -d "$f" -o -f "$f" -o -h "$f"; then
        !           509:         if test -d "$f" -a ! -h "$f"; then
        !           510:             echo "${f#$pp_destdir}/"
        !           511:             pp_find_recurse "$f"
        !           512:         else
        !           513:             echo "${f#$pp_destdir}"
        !           514:         fi
        !           515:     fi
        !           516:   done
        !           517: }
        !           518: 
        !           519: pp_prepend () {
        !           520:     #test -t && pp_warn "pp_prepend: stdin is a tty?"
        !           521:     if test -f $1; then
        !           522:         pp_debug "prepending to $1"
        !           523:         mv $1 $1._prepend
        !           524:         cat - $1._prepend >$1
        !           525:         rm -f $1._prepend
        !           526:     else
        !           527:         pp_debug "prepend: creating $1"
        !           528:         cat >$1
        !           529:     fi
        !           530: }
        !           531: 
        !           532: pp_note_file_used() {
        !           533:     echo "$1" >> $pp_wrkdir/all.files
        !           534: }
        !           535: 
        !           536: pp_create_dir_if_missing () {
        !           537:     case "$1" in
        !           538:         */) pp_error "pp_create_dir_if_missing: trailing / forbidden";;
        !           539:        "") return 0;;
        !           540:        *)  if test ! -d "$pp_destdir$1"; then
        !           541:                 pp_debug "fabricating directory $1/"
        !           542:                pp_create_dir_if_missing "${1%/*}"
        !           543:                mkdir "$pp_destdir$1" &&
        !           544:                     pp_note_file_used "$1/"
        !           545:                pp_remove_later "$1" &&
        !           546:                chmod ${2:-755} "$pp_destdir$1"
        !           547:            fi;;
        !           548:     esac
        !           549: }
        !           550: 
        !           551: pp_add_file_if_missing () {
        !           552:     typeset dir
        !           553:     #-- check that the file isn't already declared in the component
        !           554:     if test -s $pp_wrkdir/%files.${2:-run}; then
        !           555:       awk "\$6 == \"$1\" {exit 1}" < $pp_wrkdir/%files.${2:-run} || return 1
        !           556:     fi
        !           557: 
        !           558:     pp_create_dir_if_missing "${1%/*}"
        !           559:     pp_debug "fabricating file $1"
        !           560:     echo "f ${3:-755} - - ${4:--} $1" >> $pp_wrkdir/%files.${2:-run}
        !           561:     pp_note_file_used "$1"
        !           562:     pp_remove_later "$1"
        !           563:     return 0
        !           564: }
        !           565: 
        !           566: pp_add_transient_file () {
        !           567:     test -f "$pp_destdir$1" && pp_die "$pp_destdir$1: exists"
        !           568:     pp_create_dir_if_missing "${1%/*}"
        !           569:     pp_debug "transient file $1"
        !           570:     pp_note_file_used "$1"
        !           571:     pp_remove_later "$1"
        !           572: }
        !           573: 
        !           574: pp_remove_later () {
        !           575:    {
        !           576:        echo "$1"
        !           577:        test -s $pp_wrkdir/pp_cleanup && cat $pp_wrkdir/pp_cleanup
        !           578:    } > $pp_wrkdir/pp_cleanup.new
        !           579:    mv $pp_wrkdir/pp_cleanup.new $pp_wrkdir/pp_cleanup
        !           580: }
        !           581: 
        !           582: pp_ls_readlink () {
        !           583:     if test -h "$1"; then
        !           584:         ls -1ld "$1" | sed -ne 's,.* -> ,,p'
        !           585:     else
        !           586:         echo "$1: not a symbolic link" >&2
        !           587:         return 1
        !           588:     fi
        !           589: }
        !           590: 
        !           591: pp_remove_later_now () {
        !           592:     typeset f
        !           593:     if test -s $pp_wrkdir/pp_cleanup; then
        !           594:         pp_debug "pp_remove_later_now"
        !           595:         while read f; do
        !           596:             pp_debug "removing $pp_destdir$f"
        !           597:            if test -d $pp_destdir$f; then
        !           598:                rmdir $pp_destdir$f
        !           599:            else
        !           600:                rm $pp_destdir$f
        !           601:            fi
        !           602:         done < $pp_wrkdir/pp_cleanup
        !           603:         rm $pp_wrkdir/pp_cleanup
        !           604:     fi
        !           605: }
        !           606: 
        !           607: pp_readlink() {
        !           608: 
        !           609: pp_debug "&& pp_readlink_fn=$pp_readlink_fn"
        !           610: 
        !           611:     if test -n "$pp_readlink_fn"; then
        !           612: pp_debug "&& calling $pp_readlink_fn $*"
        !           613:         "$pp_readlink_fn" "$@"
        !           614:     else
        !           615:         readlink "$@"
        !           616:     fi
        !           617: }
        !           618: 
        !           619: 
        !           620: pp_install_script_common () {
        !           621:         cat <<-.
        !           622: 
        !           623:             # Automatically generated for
        !           624:             #    $name $version ($pp_platform)
        !           625:             # by PolyPackage $pp_version
        !           626: 
        !           627:             usage () {
        !           628:               case "$1" in
        !           629:               "list-services")
        !           630:                 echo "usage: \$0 list-services" ;;
        !           631:               "list-components")
        !           632:                 echo "usage: \$0 list-components" ;;
        !           633:               "list-files")
        !           634:                 echo "usage: \$0 list-files {cpt...|all}" ;;
        !           635:               "install")
        !           636:                 echo "usage: \$0 install {cpt...|all}" ;;
        !           637:               "uninstall")
        !           638:                 echo "usage: \$0 uninstall {cpt...|all}" ;;
        !           639:               "start")
        !           640:                 echo "usage: \$0 start {svc...}" ;;
        !           641:               "stop")
        !           642:                 echo "usage: \$0 stop {svc...}" ;;
        !           643:               "print-platform")
        !           644:                 echo "usage: \$0 print-platform" ;;
        !           645:               *)
        !           646:                 echo "usage: \$0 [-q] command [args]"
        !           647:                 echo "   list-services"
        !           648:                 echo "   list-components"
        !           649:                 echo "   list-files {cpt...|all}"
        !           650:                 echo "   install {cpt...|all}"
        !           651:                 echo "   uninstall {cpt...|all}"
        !           652:                 echo "   start {svc...}"
        !           653:                 echo "   stop {svc...}"
        !           654:                 echo "   print-platform"
        !           655:                 ;;
        !           656:               esac >&2
        !           657:               exit 1
        !           658:             }
        !           659: 
        !           660:             if test x"\$1" = x"-q"; then
        !           661:                 shift
        !           662:                 verbose () { "\$@"; }
        !           663:                 verbosemsg () { : ; }
        !           664:             else
        !           665:                 verbose () { echo "+ \$*"; "\$@"; }
        !           666:                 verbosemsg () { echo "\$*"; }
        !           667:             fi
        !           668: .
        !           669: }
        !           670: 
        !           671: 
        !           672: pp_functions () {
        !           673:     typeset func deps allfuncs
        !           674:     allfuncs=
        !           675:     while test $# -gt 0; do
        !           676:        pp_add_to_list allfuncs "$1"
        !           677:        deps=`pp_backend_function "$1:depends"`
        !           678:        shift
        !           679:        set -- `pp_unique "$@" $deps`
        !           680:     done
        !           681: 
        !           682:     for func in $allfuncs
        !           683:     do
        !           684:         pp_debug "generating function code for '$1'"
        !           685:         echo ""
        !           686:         echo "$func () {"
        !           687:        case "$func" in
        !           688:            pp_mkgroup|pp_mkuser|pp_havelib) echo <<.;;
        !           689:                if test \$# -lt 1; then
        !           690:                    echo "$func: not enough arguments" >&2
        !           691:                    return 1
        !           692:                fi
        !           693: .
        !           694:        esac
        !           695:         pp_backend_function "$func" || cat <<.
        !           696:                echo "$func: not implemented" >&2
        !           697:                return 1
        !           698: .
        !           699:         echo "}"
        !           700:     done
        !           701: }
        !           702: 
        !           703: pp_function () {
        !           704:     pp_functions "$1"
        !           705: }
        !           706: 
        !           707: pp_makevar () {
        !           708:     #-- convert all non alpha/digits to underscores
        !           709:     echo "$*" | tr -c '[a-z][A-Z][0-9]\012' '[_*]'
        !           710: }
        !           711: 
        !           712: pp_getpwuid () {
        !           713:     awk -F: '$3 == uid { if (!found) print $1; found=1; } END { if (!found) exit 1; }' uid="$1" \
        !           714:        < /etc/passwd || pp_error "no local username for uid $1"
        !           715: }
        !           716: 
        !           717: pp_getgrgid () {
        !           718:     awk -F: '$3 == gid { if (!found) print $1; found=1; } END { if (!found) exit 1; }' gid="$1" \
        !           719:        < /etc/group || pp_error "no local group for gid $1"
        !           720: }
        !           721: 
        !           722: pp_backend_function_getopt () {
        !           723:     cat <<'..'
        !           724: pp_getopt () {
        !           725:      _pp_optstring="$1"; shift; eval `_pp_getopt "$_pp_optstring"`
        !           726: }
        !           727: _pp_getopt_meta=s,[\\\\\"\'\`\$\&\;\(\)\{\}\#\%\ \     ],\\\\\&,g
        !           728: _pp_protect () {
        !           729:     sed "$_pp_getopt_meta" <<. | tr '\012' ' '
        !           730: $*
        !           731: .
        !           732: }
        !           733: _pp_protect2 () {
        !           734:     sed "s,^..,,$pp_getopt_meta" <<. | tr '\012' ' '
        !           735: $*
        !           736: .
        !           737: }
        !           738: _pp_nonl () {
        !           739:     tr '\012' ' ' <<.
        !           740: $*
        !           741: .
        !           742: }
        !           743: _pp_getopt () {
        !           744:     _pp_nonl '_pp_nonl set --; while test $# -gt 0; do case "$1" in "--") shift; break;;'
        !           745:     sed 's/\([^:       ]:*\)/<@<\1>@>/g;
        !           746:         s/<@<\(.\):>@>/"-\1")  _pp_nonl -"\1"; _pp_protect "$2"; shift; shift;; "-\1"*) _pp_nonl -"\1"; _pp_protect2 "$1"; shift;;/g;s/<@<\(.\)>@>/ "-\1")  _pp_nonl -"\1"; shift;; "-\1"*) _pp_nonl -"\1"; _pp_tmp="$1"; shift; set -- -`_pp_protect2 "$_pp_tmp"` "$@";;/g' <<.
        !           747: $1
        !           748: .
        !           749:     _pp_nonl '-*) echo "$1: unknown option">&2; return 1;; *) break;; esac; done; _pp_nonl --; while test $# -gt 0; do _pp_nonl "$1"; shift; done; echo'
        !           750:     echo
        !           751: }
        !           752: ..
        !           753: }
        !           754: 
        !           755: pp_copy_unstripped () {
        !           756:     typeset filedir realdir
        !           757:     filedir="`dirname ${1#$pp_destdir}`"
        !           758:     realdir="$pp_wrkdir/unstripped/$filedir"
        !           759: 
        !           760:     mkdir -p "$realdir"
        !           761:     # Can't use hardlinks because `strip` modifies the original file in-place
        !           762:     cp "$1" "$realdir"
        !           763: }
        !           764: 
        !           765: pp_package_stripped_binaries () {
        !           766:     (cd "$pp_wrkdir/unstripped" && tar -c .) \
        !           767:      | gzip > "$name-dbg-$version.tar.gz"
        !           768:     rm -rf "$pp_wrkdir/unstripped"
        !           769: }
        !           770: 
        !           771: pp_strip_binaries () {
        !           772:     if test x"$pp_opt_save_unstripped" = x"true"; then
        !           773:        rm  -rf "$pp_wrkdir/unstripped"
        !           774:        mkdir "$pp_wrkdir/unstripped"
        !           775:     fi
        !           776: 
        !           777:     for f in `find "$pp_destdir" -type f`; do
        !           778:        if file "$f" | awk '{print $2}' | grep ^ELF >/dev/null 2>&1; then
        !           779:            if test x"$pp_opt_save_unstripped" = x"true"; then
        !           780:                if file "$f" | LC_MESSAGES=C grep 'not stripped' >/dev/null 2>&1; then
        !           781:                    pp_debug "Saving unstripped binary $f"
        !           782:                    pp_copy_unstripped "$f"
        !           783:                else
        !           784:                    pp_debug "$f is already stripped; not saving a copy"
        !           785:                fi
        !           786:            fi
        !           787:            pp_debug "Stripping unnecessary symbols from $f"
        !           788:            strip "$f"
        !           789:        fi
        !           790:     done
        !           791: 
        !           792:     if test x"$pp_opt_save_unstripped" = x"true"; then
        !           793:        pp_package_stripped_binaries
        !           794:     fi
        !           795: }
        !           796: 
        !           797: pp_if_true=0
        !           798: pp_if_false=0
        !           799: 
        !           800: pp_frontend_init () {
        !           801:     name=
        !           802:     version=
        !           803:     summary="no summary"
        !           804:     description="No description"
        !           805:     copyright="Copyright 2010 Quest Software, Inc. All rights reserved."
        !           806: 
        !           807:     #-- if the user supplied extra arguments on the command line
        !           808:     #   then load them now.
        !           809:     pp_debug "pp_opt_init_vars=$pp_opt_init_vars"
        !           810:     test -n "$pp_opt_init_vars" && eval "$pp_opt_init_vars"
        !           811: }
        !           812: 
        !           813: pp_is_qualifier () {
        !           814:     typeset ret
        !           815: 
        !           816:     case "$1" in
        !           817:         "["*"]") ret=true;;
        !           818:         *)       ret=false;;
        !           819:     esac
        !           820:     pp_debug "is_qualifier: $* -> $ret"
        !           821:     test $ret = true
        !           822: }
        !           823: 
        !           824: pp_eval_qualifier () {
        !           825:     typeset ret
        !           826: 
        !           827:     case "$1" in
        !           828:         "[!$pp_platform]"| \
        !           829:          "[!"*",$pp_platform]"| \
        !           830:          "[!$pp_platform,"*"]"| \
        !           831:          "[!"*",$pp_platform,"*"]") ret=false;;
        !           832:         "[!"*"]") ret=true;;
        !           833:         "[$pp_platform]"| \
        !           834:          "["*",$pp_platform]"| \
        !           835:          "[$pp_platform,"*"]"| \
        !           836:          "["*",$pp_platform,"*"]") ret=true;;
        !           837:         "["*"]") ret=false;;
        !           838:         *) pp_die "pp_eval_qualifier: bad qualifier '$1'"
        !           839:     esac
        !           840:     pp_debug "eval: $* -> $ret"
        !           841:     test true = $ret
        !           842: }
        !           843: 
        !           844: pp_frontend_if () {
        !           845:     typeset ifcmd ifret
        !           846:     ifcmd="$1";
        !           847:     shift
        !           848:     case "$ifcmd" in
        !           849:        %if) if test 0 = $pp_if_false; then
        !           850:                case "$*" in
        !           851:                    true |1) pp_incr pp_if_true;;
        !           852:                    false|0) pp_incr pp_if_false;;
        !           853:                     *)
        !           854:                        ifret=true
        !           855:                         if pp_is_qualifier "$*"; then
        !           856:                             pp_eval_qualifier "$*" || ifret=false
        !           857:                         else
        !           858:                            eval test "$@" || ifret=false
        !           859:                            pp_debug "evaluating test $* -> $ifret"
        !           860:                        fi
        !           861:                        pp_incr pp_if_$ifret
        !           862:                         ;;
        !           863:                esac
        !           864:             else
        !           865:                pp_incr pp_if_false
        !           866:             fi;;
        !           867:        %else)  test $# = 0 || pp_warn "ignoring argument to %else"
        !           868:                if test $pp_if_false -gt 1; then
        !           869:                  : no change
        !           870:                elif test $pp_if_false = 1; then
        !           871:                  pp_incr pp_if_true
        !           872:                  pp_decr pp_if_false
        !           873:                elif test $pp_if_true = 0; then
        !           874:                  pp_die "unmatched %else"
        !           875:                else
        !           876:                  pp_incr pp_if_false
        !           877:                  pp_decr pp_if_true
        !           878:                fi;;
        !           879:        %endif) test $# = 0 || pp_warn "ignoring argument to %endif"
        !           880:                if test $pp_if_false -gt 0; then
        !           881:                  pp_decr pp_if_false
        !           882:                elif test $pp_if_true -gt 0; then
        !           883:                  pp_decr pp_if_true
        !           884:                else
        !           885:                  pp_die "unmatched %endif"
        !           886:                fi;;
        !           887:        *) pp_die "frontend_if: unknown cmd $ifcmd";;
        !           888:     esac
        !           889: }
        !           890: 
        !           891: 
        !           892: pp_frontend () {
        !           893:   typeset section newsection sed_word sed_ws line cpt svc
        !           894:   typeset section_enabled newsection_enabled s sed sed_candidate
        !           895: 
        !           896:   section='%_initial'
        !           897:   newsection='%_initial'
        !           898:   section_enabled=:
        !           899:   newsection_enabled=:
        !           900:   sed_word="[a-zA-Z_][a-zA-Z_0-9]*"
        !           901:   sed_ws="[    ]"
        !           902: 
        !           903:   #-- not all seds are created equal
        !           904:   sed=
        !           905:   for sed_candidate in ${PP_SED:-sed} /usr/xpg4/bin/sed; do
        !           906:       if echo 'foo' | $sed_candidate -ne '/^\(x\)*foo/p' | grep foo > /dev/null
        !           907:       then
        !           908:         sed="$sed_candidate"
        !           909:         break
        !           910:       fi
        !           911:   done
        !           912:   test -z "$sed" &&
        !           913:         pp_die "sed is broken on this system"
        !           914: 
        !           915:   pp_lineno=0
        !           916: 
        !           917:   #-- Note: this sed script should perform similar to pp_eval_qualifier()
        !           918:   $sed -e "/^#/s/.*//" \
        !           919:        -e "/^\\[!\\($sed_word,\\)*$pp_platform\\(,$sed_word\\)*\\]/s/.*//" \
        !           920:        -e "s/^\\[\\($sed_word,\\)*$pp_platform\\(,$sed_word\\)*\\]$sed_ws*//" \
        !           921:        -e "s/^\\[!\\($sed_word,\\)*$sed_word\\]$sed_ws*//" \
        !           922:        -e "/^\\[\\($sed_word,\\)*$sed_word\\]/s/.*//" \
        !           923:        -e "s/^%$sed_ws*/%/" \
        !           924:        -e "s/^$sed_ws/%\\\\&/" \
        !           925:      > $pp_wrkdir/frontend.tmp
        !           926: 
        !           927:   #-- add an ignore section at the end to force section completion
        !           928:   echo '%ignore' >> $pp_wrkdir/frontend.tmp
        !           929:   echo  >> $pp_wrkdir/frontend.tmp
        !           930: 
        !           931:   exec 0<$pp_wrkdir/frontend.tmp
        !           932:   : > $pp_wrkdir/tmp
        !           933:   : > $pp_wrkdir/%fixup
        !           934:   while read -r line; do
        !           935:      #-- Convert leading double-% to single-%, or switch sections
        !           936:      pp_incr pp_lineno
        !           937: 
        !           938:      pp_debug "line $pp_lineno: $line"
        !           939:      set -f
        !           940:      set -- $line
        !           941:      set +f
        !           942:      #pp_debug "line $pp_lineno: $*"
        !           943: 
        !           944:      case "$line" in %*)
        !           945:         case "$1" in
        !           946:           %if|%else|%endif)
        !           947:                 pp_debug "processing if directive $1"
        !           948:                pp_frontend_if "$@"
        !           949:                continue;;
        !           950:        esac
        !           951:        test 0 -ne $pp_if_false && continue     # ignore lines %if'd out
        !           952: 
        !           953:         case "$1" in
        !           954:          %set|%fixup|%ignore)
        !           955:              pp_debug "processing new section $1"
        !           956:             newsection="$1"; shift
        !           957:              newsection_enabled=:
        !           958:              if pp_is_qualifier "$1"; then
        !           959:                 pp_eval_qualifier "$1" || newsection_enabled=false
        !           960:                 shift
        !           961:              fi
        !           962:             test $# -eq 0 || pp_warn "ignoring extra arguments: $line"
        !           963:             continue;;
        !           964:          %pre|%post|%preun|%postup|%postun|%files|%depend|%check)
        !           965:              pp_debug "processing new component section $*"
        !           966:              s="$1"; shift
        !           967:              if test $# -eq 0 || pp_is_qualifier "$1"; then
        !           968:                 cpt=run
        !           969:              else
        !           970:                 cpt="$1"
        !           971:                 shift
        !           972:              fi
        !           973:              newsection="$s.$cpt"
        !           974:              newsection_enabled=:
        !           975:              if test $# -gt 0 && pp_is_qualifier "$1"; then
        !           976:                 pp_eval_qualifier "$1" || newsection_enabled=false
        !           977:                 shift
        !           978:              fi
        !           979:              test $# -eq 0 ||
        !           980:                 pp_warn "ignoring extra arguments: $line"
        !           981:              case "$cpt" in
        !           982:                 run|dbg|doc|dev)
        !           983:                     $newsection_enabled && pp_add_component "$cpt";;
        !           984:                 x-*) :;;    # useful for discarding stuff
        !           985:                 *) pp_error "unknown component: $1 $cpt";;
        !           986:              esac
        !           987:             continue;;
        !           988:           %pp)
        !           989:             newsection="%ignore"; shift
        !           990:             if test $# -gt 0; then
        !           991:                 pp_set_api_version "$1"
        !           992:                 shift
        !           993:             else
        !           994:                 pp_error "%pp: missing version"
        !           995:             fi
        !           996:             test $# -gt 0 &&
        !           997:                 pp_error "%pp: too many arguments"
        !           998:             continue;;
        !           999:          %service)
        !          1000:              pp_debug "processing new service section $1 $2"
        !          1001:              s="$1"; shift
        !          1002:              if test $# -eq 0 || pp_is_qualifier "$1"; then
        !          1003:                 pp_error "$s: service name required"
        !          1004:                 svc=unknown
        !          1005:              else
        !          1006:                 svc="$1"; shift
        !          1007:              fi
        !          1008: 
        !          1009:             newsection="$s.$svc"
        !          1010:              newsection_enabled=:
        !          1011:             if test $# -gt 0 && pp_is_qualifier "$1"; then
        !          1012:                 pp_eval_qualifier "$1" || newsection_enabled=false
        !          1013:                 shift
        !          1014:              fi
        !          1015:              test $# -eq 0 ||
        !          1016:                 pp_warn "ignoring extra arguments: $line"
        !          1017:             $newsection_enabled && pp_add_service "$svc"
        !          1018:             continue;;
        !          1019:          %\\*)
        !          1020:              pp_debug "removing leading %\\"
        !          1021:             line="${line#??}"
        !          1022:              pp_debug "  result is <$line>"
        !          1023:              set -f
        !          1024:              set -- $line
        !          1025:              set +f
        !          1026:              ;;
        !          1027:          %%*)
        !          1028:              pp_debug "removing leading %"
        !          1029:             line="${line#%}"
        !          1030:              set -f
        !          1031:              set -- $line
        !          1032:              set +f
        !          1033:             ;;
        !          1034:          %*)
        !          1035:             pp_error "unknown section $1"
        !          1036:             newsection='%ignore'
        !          1037:              newsection_enabled=:
        !          1038:             continue;;
        !          1039:        esac;;
        !          1040:      esac
        !          1041: 
        !          1042:      test 0 != $pp_if_false && continue        # ignore lines %if'd out
        !          1043: 
        !          1044:      pp_debug "section=$section (enabled=$section_enabled) newsection=$newsection (enabled=$newsection_enabled)"
        !          1045: 
        !          1046:      #-- finish processing a previous section
        !          1047:      if test x"$newsection" != x""; then
        !          1048:       $section_enabled && case "$section" in
        !          1049:        %ignore|%_initial)
        !          1050:                 pp_debug "leaving ignored section $section"
        !          1051:                : ignore  # guaranteed to be the last section
        !          1052:                ;;
        !          1053:        %set)
        !          1054:                 pp_debug "leaving $section: sourcing $pp_wrkdir/tmp"
        !          1055:                 $pp_opt_debug && cat $pp_wrkdir/tmp >&2
        !          1056:                . $pp_wrkdir/tmp
        !          1057:                : > $pp_wrkdir/tmp
        !          1058:                ;;
        !          1059:        %pre.*|%preun.*|%post.*|%postup.*|%postun.*|%depend.*|%check.*|%service.*|%fixup)
        !          1060:                 pp_debug "leaving $section: substituting $pp_wrkdir/tmp"
        !          1061:                 # cat $pp_wrkdir/tmp >&2    # debugging
        !          1062:                 $pp_opt_debug && pp_substitute < $pp_wrkdir/tmp >&2
        !          1063:                pp_substitute < $pp_wrkdir/tmp > $pp_wrkdir/tmp.sh
        !          1064:                 . $pp_wrkdir/tmp.sh >> $pp_wrkdir/$section ||
        !          1065:                     pp_error "shell error in $section"
        !          1066:                rm -f $pp_wrkdir/tmp.sh
        !          1067:                : > $pp_wrkdir/tmp
        !          1068:                ;;
        !          1069:       esac
        !          1070:       section="$newsection"
        !          1071:       section_enabled="$newsection_enabled"
        !          1072:       newsection=
        !          1073:      fi
        !          1074: 
        !          1075:      #-- ignore section content that is disabled
        !          1076:      $section_enabled || continue
        !          1077: 
        !          1078:      #-- process some lines in-place
        !          1079:      case "$section" in
        !          1080:        %_initial)
        !          1081:                case "$line" in "") continue;; esac # ignore non-section blanks
        !          1082:                pp_die "Ignoring text before % section introducer";;
        !          1083:        %set|%pre.*|%preun.*|%post.*|%postup.*|%postun.*|%check.*|%service.*|%fixup)
        !          1084:                 pp_debug "appending line to \$pp_wrkdir/tmp"
        !          1085:                echo "$line" >> $pp_wrkdir/tmp
        !          1086:                ;;
        !          1087:        %files.*)
        !          1088:                test $# -eq 0 && continue;
        !          1089:                pp_files_expand "$@" >> $pp_wrkdir/$section
        !          1090:                ;;
        !          1091:        %depend.*)
        !          1092:                pp_debug "Adding explicit dependency $@ to $cpt"
        !          1093:                echo "$@" >> $pp_wrkdir/%depend.$cpt
        !          1094:                ;;
        !          1095:      esac
        !          1096:   done
        !          1097:   exec <&-
        !          1098: 
        !          1099:   if test $pp_if_true != 0 -o $pp_if_false != 0; then
        !          1100:        pp_die "missing %endif at end of file"
        !          1101:   fi
        !          1102: 
        !          1103:   pp_lineno=
        !          1104: 
        !          1105:   pp_debug " name        = $name"
        !          1106:   pp_debug " version     = $version"
        !          1107:   pp_debug " summary     = $summary"
        !          1108:   pp_debug " description = $description"
        !          1109:   pp_debug " copyright   = $copyright"
        !          1110:   pp_debug ""
        !          1111:   pp_debug "\$pp_components: $pp_components"
        !          1112:   pp_debug "\$pp_services:   $pp_services"
        !          1113: }
        !          1114: 
        !          1115: pp_set_api_version() {
        !          1116:     case "$1" in
        !          1117:         1.0)    : ;;
        !          1118:         *)      pp_error "This version of polypackage is too old";;
        !          1119:     esac
        !          1120: }
        !          1121: 
        !          1122: pp_platform=
        !          1123: 
        !          1124: pp_set_platform () {
        !          1125:     if test -n "$pp_opt_platform"; then
        !          1126:        pp_contains "$pp_platforms" "$pp_opt_platform" ||
        !          1127:                pp_die "$pp_opt_platform: unknown platform"
        !          1128:        pp_platform="$pp_opt_platform"
        !          1129:     else
        !          1130:        uname_s=`uname -s 2>/dev/null`
        !          1131:        pp_platform=
        !          1132:        for p in $pp_platforms; do
        !          1133:            pp_debug "probing for platform $p"
        !          1134:            if eval pp_backend_${p}_detect "$uname_s"; then
        !          1135:                pp_platform="$p"
        !          1136:                break;
        !          1137:            fi
        !          1138:        done
        !          1139:        test -z "$pp_platform" &&
        !          1140:                pp_die "cannot detect platform (supported: $pp_platforms)"
        !          1141:     fi
        !          1142:     pp_debug "pp_platform = $pp_platform"
        !          1143: }
        !          1144: 
        !          1145: pp_expand_path=
        !          1146: 
        !          1147: pp_expand_test_usr_bin () {
        !          1148:        awk '$1 == "/usr" || $2 == "/usr" {usr++}
        !          1149:             $1 == "/bin" || $2 == "/bin" {bin++}
        !          1150:             END { if (usr == 1 && bin == 1) exit(0); else exit(1); }'
        !          1151: }
        !          1152: 
        !          1153: pp_set_expand_converter_or_reexec () {
        !          1154:     test -d /usr -a -d /bin ||
        !          1155:        pp_die "missing /usr or /bin"
        !          1156:     echo /usr /bin | pp_expand_test_usr_bin || pp_die "pp_expand_test_usr_bin?"
        !          1157:     if (eval "echo /{usr,bin}" | pp_expand_test_usr_bin) 2>/dev/null; then
        !          1158:        pp_expand_path=pp_expand_path_brace
        !          1159:     elif (eval "echo /@(usr|bin)" | pp_expand_test_usr_bin) 2>/dev/null; then
        !          1160:        pp_expand_path=pp_expand_path_at
        !          1161:     else
        !          1162:        test x"$pp_expand_rexec" != x"true" ||
        !          1163:            pp_die "problem finding shell that can do brace expansion"
        !          1164:        for shell in ksh ksh93 bash; do
        !          1165:            if ($shell -c 'echo /{usr,bin}' |
        !          1166:                        pp_expand_test_usr_bin) 2>/dev/null ||
        !          1167:               ($shell -c 'echo /@(usr|bin)' |
        !          1168:                        pp_expand_test_usr_bin) 2>/dev/null
        !          1169:            then
        !          1170:                 pp_debug "switching to shell $shell"
        !          1171:                pp_expand_rexec=true exec $shell "$0" "$@"
        !          1172:            fi
        !          1173:        done
        !          1174:        pp_die "cannot find a shell that does brace expansion"
        !          1175:     fi
        !          1176: }
        !          1177: 
        !          1178: pp_expand_path_brace () {
        !          1179:        typeset f
        !          1180:        eval "for f in $1; do echo \"\$f\"; done|sort -u"
        !          1181: }
        !          1182: 
        !          1183: pp_expand_path_at () {
        !          1184:        typeset f
        !          1185:        eval "for f in `
        !          1186:            echo "$1" | sed -e 's/{/@(/g' -e 's/}/)/g' -e 's/,/|/g'
        !          1187:                `; do echo \"\$f\"; done|sort -u"
        !          1188: }
        !          1189: 
        !          1190: pp_shlib_suffix='.so*'
        !          1191: 
        !          1192: pp_model_init () {
        !          1193:     #@ $pp_components: whitespace-delimited list of components seen in %files
        !          1194:     pp_components=
        !          1195:     #@ $pp_services: whitespace-delimited list of %service seen
        !          1196:     pp_services=
        !          1197: 
        !          1198:     rm -f $pp_wrkdir/%files.* \
        !          1199:           $pp_wrkdir/%post.* \
        !          1200:           $pp_wrkdir/%pre.* \
        !          1201:           $pp_wrkdir/%preun.* \
        !          1202:           $pp_wrkdir/%postup.* \
        !          1203:           $pp_wrkdir/%postun.* \
        !          1204:           $pp_wrkdir/%service.* \
        !          1205:           $pp_wrkdir/%set \
        !          1206:           $pp_wrkdir/%fixup
        !          1207: }
        !          1208: 
        !          1209: 
        !          1210: pp_have_component () {
        !          1211:        pp_contains "$pp_components" "$1"
        !          1212: }
        !          1213: 
        !          1214: pp_have_all_components () {
        !          1215:        pp_contains_all "$pp_components" "$@"
        !          1216: }
        !          1217: 
        !          1218: pp_add_component () {
        !          1219:        pp_add_to_list 'pp_components' "$1"
        !          1220: }
        !          1221: 
        !          1222: pp_add_service () {
        !          1223:        pp_add_to_list 'pp_services' "$1"
        !          1224: }
        !          1225: 
        !          1226: pp_service_init_vars () {
        !          1227:        cmd=
        !          1228:        pidfile=
        !          1229:        stop_signal=15          # SIGTERM
        !          1230:        user=root
        !          1231:        group=
        !          1232:        enable=yes              # make it so the service starts on boot
        !          1233:        optional=no             # Whether installing this service is optional
        !          1234:        pp_backend_init_svc_vars
        !          1235: }
        !          1236: 
        !          1237: pp_service_check_vars () {
        !          1238:        test -n "$cmd" ||
        !          1239:                pp_error "%service $1: cmd not defined"
        !          1240:        case "$enable" in
        !          1241:            yes|no) : ;;
        !          1242:            *) pp_error "%service $1: \$enable must be set to yes or no";;
        !          1243:        esac
        !          1244: }
        !          1245: 
        !          1246: pp_load_service_vars () {
        !          1247:        pp_service_init_vars
        !          1248:        . "$pp_wrkdir/%service.$1"
        !          1249:        pp_service_check_vars "$1"
        !          1250: }
        !          1251: 
        !          1252: pp_files_expand () {
        !          1253:     typeset _p _mode _group _owner _flags _path _optional _has_target _tree
        !          1254:     typeset _path _file _tgt _m _o _g _f _type _lm _ll _lo _lg _ls _lx
        !          1255:     typeset _ignore _a
        !          1256: 
        !          1257:     test $# -eq 0 && return
        !          1258: 
        !          1259:     pp_debug "pp_files_expand: path is: $1"
        !          1260: 
        !          1261:     case "$1" in "#"*) return;; esac
        !          1262:     _p="$1"; shift
        !          1263: 
        !          1264:     pp_debug "pp_files_expand: other arguments: $*"
        !          1265: 
        !          1266:     #-- the mode must be an octal number of at least three digits
        !          1267:     _mode="="
        !          1268:     _a=`eval echo \"$1\"`
        !          1269:     case "$_a" in
        !          1270:        *:*) :;;
        !          1271:        -|=|[01234567][01234567][01234567]*) _mode="$_a"; shift;;
        !          1272:     esac
        !          1273: 
        !          1274:     #-- the owner:group field may have optional parts
        !          1275:     _a=`eval echo \"$1\"`
        !          1276:     case "$_a" in
        !          1277:        *:*) _group=${_a#*:}; _owner=${_a%:*}; shift;;
        !          1278:        =|-) _group=$_a;      _owner=$_a; shift;;
        !          1279:        *)   _group=;         _owner=;;
        !          1280:     esac
        !          1281: 
        !          1282:     #-- process the flags argument
        !          1283:     _flags=
        !          1284:     _optional=false
        !          1285:     _has_target=false
        !          1286:     _ignore=false
        !          1287:     if test $# -gt 0; then
        !          1288:         _a=`eval echo \"$1\"`
        !          1289:        case ",$_a," in *,volatile,*) _flags="${_flags}v";; esac
        !          1290:        case ",$_a," in *,optional,*) _optional=true;; esac
        !          1291:        case ",$_a," in *,symlink,*) _has_target=true;; esac
        !          1292:        case ",$_a," in *,ignore-others,*) _flags="${_flags}i";; esac
        !          1293:        case ",$_a," in *,ignore,*) _ignore=true;; esac
        !          1294:        shift
        !          1295:     fi
        !          1296: 
        !          1297:     #-- process the target argument
        !          1298:     if $_has_target; then
        !          1299:        test $# -ne 0 || pp_error "$_p: missing target"
        !          1300:        _a=`eval echo \"$1\"`
        !          1301:        _target="$_a"
        !          1302:        shift
        !          1303:     fi
        !          1304: 
        !          1305:     pp_debug "pp_files_expand: $_mode|$_owner:$_group|$_flags|$_target|$*"
        !          1306: 
        !          1307:     test $# -eq 0 || pp_error "$_p: too many arguments"
        !          1308: 
        !          1309:     #-- process speciall suffixes
        !          1310:     tree=
        !          1311:     case "$_p" in
        !          1312:         *"/**")  _p="${_p%"/**"}"; tree="**";;
        !          1313:         *".%so") _p="${_p%".%so"}$pp_shlib_suffix";;
        !          1314:     esac
        !          1315: 
        !          1316:     #-- expand the path using the shell glob
        !          1317:     pp_debug "expanding .$_p ... with $pp_expand_path"
        !          1318:     (cd ${pp_destdir} && $pp_expand_path ".$_p") > $pp_wrkdir/tmp.files.exp
        !          1319: 
        !          1320:     #-- expand path/** by rewriting the glob output file
        !          1321:     case "$tree" in
        !          1322:         "") : ;;
        !          1323:         "**")
        !          1324:             pp_debug "expanding /** tree ..."
        !          1325:             while read _path; do
        !          1326:                 _path="${_path#.}"
        !          1327:                 pp_find_recurse "$pp_destdir${_path%/}"
        !          1328:             done < $pp_wrkdir/tmp.files.exp |
        !          1329:                  sort -u > $pp_wrkdir/tmp.files.exp2
        !          1330:             mv $pp_wrkdir/tmp.files.exp2 $pp_wrkdir/tmp.files.exp
        !          1331:             ;;
        !          1332:     esac
        !          1333: 
        !          1334:     while read _path; do
        !          1335:        _path="${_path#.}"
        !          1336:        _file="${pp_destdir}${_path}"
        !          1337:        _tgt=
        !          1338:        _m="$_mode"
        !          1339:        _o="${_owner:--}"
        !          1340:        _g="${_group:--}"
        !          1341:        _f="$_flags"
        !          1342: 
        !          1343:         case "$_path" in
        !          1344:             /*) :;;
        !          1345:             *)  pp_warn "$_path: inserting leading /"
        !          1346:                 _path="/$_path";;  # ensure leading /
        !          1347:         esac
        !          1348: 
        !          1349:         #-- sanity checks
        !          1350:         case "$_path" in
        !          1351:             */../*|*/..) pp_error "$_path: invalid .. in path";;
        !          1352:             */./*|*/.)   pp_warn  "$_path: invalid component . in path";;
        !          1353:             *//*)        pp_warn  "$_path: redundant / in path";;
        !          1354:         esac
        !          1355: 
        !          1356:        #-- set the type based on the real file's type
        !          1357:         if $_ignore; then
        !          1358:            _type=f _m=_ _o=_ _g=_
        !          1359:        elif test -h "$_file"; then
        !          1360:           case "$_path" in
        !          1361:                */) pp_warn "$_path (symlink $_file): removing trailing /"
        !          1362:                    _path="${_path%/}"
        !          1363:                    ;;
        !          1364:           esac
        !          1365:           _type=s
        !          1366:           if test x"$_target" != x"=" -a -n "$_target"; then
        !          1367:               _tgt="$_target"
        !          1368: pp_debug "symlink target is $_tgt"
        !          1369:           else
        !          1370:               _tgt=`pp_readlink "$_file"`;
        !          1371:                test -z "$_tgt" && pp_error "can't readlink $_file"
        !          1372:                case "$_tgt" in
        !          1373:                     ${pp_destdir}/*)
        !          1374:                        pp_warn "stripped \$destdir from symlink ($_path)"
        !          1375:                        _tgt="${_tgt#$pp_destdir}";;
        !          1376:                esac
        !          1377:           fi
        !          1378:           _m=777
        !          1379:        elif test -d "$_file"; then
        !          1380:           #-- display a warning if the user forgot the trailing /
        !          1381:           case "$_path" in
        !          1382:                */) :;;
        !          1383:                *) pp_warn "$_path (matching $_file): adding trailing /"
        !          1384:                   _path="$_path/";;
        !          1385:           esac
        !          1386:           _type=d
        !          1387:           $_has_target && pp_error "$_file: not a symlink"
        !          1388:        elif test -f "$_file"; then
        !          1389:           case "$_path" in
        !          1390:                */) pp_warn "$_path (matching $_file): removing trailing /"
        !          1391:                    _path="${_path%/}"
        !          1392:                    ;;
        !          1393:           esac
        !          1394:           _type=f
        !          1395:           $_has_target && pp_error "$_file: not a symlink"
        !          1396:        else
        !          1397:           $_optional && continue
        !          1398:           pp_error "$_file: missing"
        !          1399:           _type=f
        !          1400:        fi
        !          1401: 
        !          1402:        #-- convert '=' shortcuts into mode/owner/group from ls
        !          1403:        case ":$_m:$_o:$_g:" in *:=:*)
        !          1404:            if LS_OPTIONS=--color=never /bin/ls -ld "$_file" \
        !          1405:                    > $pp_wrkdir/ls.tmp
        !          1406:            then
        !          1407:                 read _lm _ll _lo _lg _ls _lx < $pp_wrkdir/ls.tmp
        !          1408:                 test x"$_m" = x"=" && _m=`pp_mode_from_ls "$_lm"`
        !          1409:                 test x"$_o" = x"=" && _o="$_lo"
        !          1410:                 test x"$_g" = x"=" && _g="$_lg"
        !          1411:             else
        !          1412:                 pp_error "cannot read $_file"
        !          1413:                 test x"$_m" = x"=" && _m=-
        !          1414:                 test x"$_o" = x"=" && _o=-
        !          1415:                 test x"$_g" = x"=" && _g=-
        !          1416:             fi
        !          1417:            ;;
        !          1418:        esac
        !          1419: 
        !          1420:        test -n "$_f" || _f=-
        !          1421: 
        !          1422:        #-- sanity checks
        !          1423:        test -n "$_type" || pp_die "_type empty"
        !          1424:        test -n "$_path" || pp_die "_path empty"
        !          1425:        test -n "$_m" || pp_die "_m empty"
        !          1426:        test -n "$_o" || pp_die "_o empty"
        !          1427:        test -n "$_g" || pp_die "_g empty"
        !          1428: 
        !          1429:        #-- setuid/gid files must be given an explicit owner/group (or =)
        !          1430:        case "$_o:$_g:$_m" in
        !          1431:            -:*:[4657][1357]??|-:*:[4657]?[1357]?|-:*:[4657]??[1357])
        !          1432:                pp_error "$_path: setuid file ($_m) missing explicit owner";;
        !          1433:            *:-:[2367][1357]??|*:-:[2367]?[1357]?|*:-:[2367]??[1357])
        !          1434:                pp_error "$_path: setgid file ($_m) missing explicit group";;
        !          1435:        esac
        !          1436: 
        !          1437:        # convert numeric uids into usernames; only works for /etc/passwd
        !          1438:        case "$_o" in [0-9]*) _o=`pp_getpwuid $_o`;; esac
        !          1439:        case "$_g" in [0-9]*) _g=`pp_getgrgid $_g`;; esac
        !          1440: 
        !          1441:        pp_debug "$_type $_m $_o $_g $_f $_path" $_tgt
        !          1442:        $_ignore || echo "$_type $_m $_o $_g $_f $_path" $_tgt
        !          1443:         pp_note_file_used "$_path"
        !          1444:         case "$_f" in *i*) echo "$_path" >> $pp_wrkdir/ign.files;; esac
        !          1445:     done < $pp_wrkdir/tmp.files.exp
        !          1446: }
        !          1447: 
        !          1448: pp_files_check_duplicates () {
        !          1449:     typeset _path
        !          1450:     if test -s $pp_wrkdir/all.files; then
        !          1451:         sort < $pp_wrkdir/all.files | uniq -d > $pp_wrkdir/duplicate.files
        !          1452:        if test -f $pp_wrkdir/ign.awk; then
        !          1453:            # Remove ignored files
        !          1454:            mv $pp_wrkdir/duplicate.files $pp_wrkdir/duplicate.files.ign
        !          1455:            sed -e 's/^/_ _ _ _ _ /' < $pp_wrkdir/duplicate.files.ign |
        !          1456:                awk -f $pp_wrkdir/ign.awk |
        !          1457:                sed -e 's/^_ _ _ _ _ //' > $pp_wrkdir/duplicate.files
        !          1458:        fi
        !          1459:         while read _path; do
        !          1460:             pp_warn "$_path: file declared more than once"
        !          1461:         done <$pp_wrkdir/duplicate.files
        !          1462:     fi
        !          1463: }
        !          1464: 
        !          1465: pp_files_check_coverage () {
        !          1466:     pp_find_recurse "$pp_destdir" | sort > $pp_wrkdir/coverage.avail
        !          1467:     if test -s $pp_wrkdir/all.files; then
        !          1468:         sort -u < $pp_wrkdir/all.files
        !          1469:     else
        !          1470:         :
        !          1471:     fi > $pp_wrkdir/coverage.used
        !          1472:     join -v1 $pp_wrkdir/coverage.avail $pp_wrkdir/coverage.used \
        !          1473:         > $pp_wrkdir/coverage.not-packaged
        !          1474:     if test -s $pp_wrkdir/coverage.not-packaged; then
        !          1475:         pp_warn "The following files/directories were found but not packaged:"
        !          1476:         sed -e 's,^,    ,' <  $pp_wrkdir/coverage.not-packaged >&2
        !          1477:     fi
        !          1478:     join -v2 $pp_wrkdir/coverage.avail $pp_wrkdir/coverage.used \
        !          1479:         > $pp_wrkdir/coverage.not-avail
        !          1480:     if test -s $pp_wrkdir/coverage.not-avail; then
        !          1481:         pp_warn "The following files/directories were named but not found:"
        !          1482:         sed -e 's,^,    ,' <  $pp_wrkdir/coverage.not-avail >&2
        !          1483:     fi
        !          1484: }
        !          1485: 
        !          1486: pp_files_ignore_others () {
        !          1487:     typeset p f
        !          1488: 
        !          1489:     test -s $pp_wrkdir/ign.files || return
        !          1490: 
        !          1491:     #-- for each file in ign.files, we remove it from all the
        !          1492:     #   other %files.* lists, except where it has an i flag.
        !          1493:     #   rather than scan each list multiple times, we build
        !          1494:     #   an awk script
        !          1495: 
        !          1496:     pp_debug "stripping ignore files"
        !          1497: 
        !          1498:     while read p; do
        !          1499:         echo '$6 == "'"$p"'" && $5 !~ /i/ { next }'
        !          1500:     done < $pp_wrkdir/ign.files > $pp_wrkdir/ign.awk
        !          1501:     echo '{ print }' >> $pp_wrkdir/ign.awk
        !          1502: 
        !          1503:     $pp_opt_debug && cat $pp_wrkdir/ign.awk
        !          1504: 
        !          1505:     for f in $pp_wrkdir/%files.*; do
        !          1506:        mv $f $f.ign
        !          1507:         awk -f $pp_wrkdir/ign.awk < $f.ign > $f || pp_error "awk"
        !          1508:     done
        !          1509: }
        !          1510: 
        !          1511: pp_service_scan_groups () {
        !          1512:     typeset svc
        !          1513: 
        !          1514:     #-- scan for "group" commands, and build a list of groups
        !          1515:     pp_service_groups=
        !          1516:     if test -n "$pp_services"; then
        !          1517:         for svc in $pp_services; do
        !          1518:            group=
        !          1519:            . $pp_wrkdir/%service.$svc
        !          1520:            if test -n "$group"; then
        !          1521:                pp_contains "$pp_services" "$group" && pp_error \
        !          1522:                    "%service $svc: group name $group in use by a service"
        !          1523:                pp_add_to_list 'pp_service_groups' "$group"
        !          1524:                echo "$svc" >> $pp_wrkdir/%svcgrp.$group
        !          1525:            fi
        !          1526:         done
        !          1527:     fi
        !          1528: }
        !          1529: 
        !          1530: pp_service_get_svc_group () {
        !          1531:     (tr '\012' ' ' < $pp_wrkdir/%svcgrp.$1 ; echo) | sed -e 's/ $//'
        !          1532: }
        !          1533: 
        !          1534: for _sufx in _init '' _names _cleanup _install_script \
        !          1535:     _init_svc_vars _function _probe _vas_platforms
        !          1536: do
        !          1537:  eval "pp_backend$_sufx () { pp_debug pp_backend$_sufx; pp_backend_\${pp_platform}$_sufx \"\$@\"; }"
        !          1538: done
        !          1539: 
        !          1540: 
        !          1541: pp_platforms="$pp_platforms aix"
        !          1542: 
        !          1543: pp_backend_aix_detect () {
        !          1544:        test x"$1" = x"AIX"
        !          1545: }
        !          1546: 
        !          1547: pp_backend_aix_init () {
        !          1548:         pp_aix_detect_arch
        !          1549:         pp_aix_detect_os
        !          1550: 
        !          1551:        pp_aix_bosboot=         # components that need bosboot
        !          1552:        pp_aix_lang=en_US
        !          1553:        pp_aix_copyright=
        !          1554:         pp_aix_start_services_after_install=false
        !          1555:         pp_aix_init_services_after_install=true
        !          1556: 
        !          1557:         pp_aix_sudo=sudo       # AIX package tools must run as root
        !          1558: 
        !          1559:         case "$pp_aix_os" in
        !          1560:             *) pp_readlink_fn=pp_ls_readlink;;  # XXX
        !          1561:         esac
        !          1562: 
        !          1563:        pp_aix_abis_seen=
        !          1564: }
        !          1565: 
        !          1566: pp_aix_detect_arch () {
        !          1567:        pp_aix_arch_p=`uname -p 2>/dev/null`
        !          1568:        case "$pp_aix_arch_p"  in
        !          1569:           "")      pp_debug "can't get processor type from uname -p"
        !          1570:                     pp_aix_arch_p=powerpc
        !          1571:                     pp_aix_arch=R;;  # guess (lsattr -l proc0 ??)
        !          1572:           powerpc) pp_aix_arch=R;;
        !          1573:           *)       pp_aix_arch_p=intel
        !          1574:                     pp_aix_arch=I;;  # XXX? verify
        !          1575:        esac
        !          1576: 
        !          1577:        case "`/usr/sbin/lsattr -El proc0 -a type -F value`" in
        !          1578:            PowerPC_POWER*) pp_aix_arch_std=ppc64;;
        !          1579:            PowerPC*) pp_aix_arch_std=ppc;;
        !          1580:            *) pp_aix_arch_std=unknown;;
        !          1581:        esac
        !          1582: }
        !          1583: 
        !          1584: pp_aix_detect_os () {
        !          1585:         typeset r v
        !          1586: 
        !          1587:         r=`uname -r`
        !          1588:         v=`uname -v`
        !          1589:         pp_aix_os=aix$v$r
        !          1590: }
        !          1591: 
        !          1592: pp_aix_version_fix () {
        !          1593:     typeset v
        !          1594:     v=`echo $1 | tr -c -d '[0-9].\012'`
        !          1595:     if test x"$v" != x"$1"; then
        !          1596:         pp_warn "stripped version '$1' to '$v'"
        !          1597:     fi
        !          1598:     case $v in
        !          1599:         ""|*..*|.*|*.) pp_error "malformed '$1'"
        !          1600:                  echo "0.0.0.0";;
        !          1601:         *.*.*.*.*)
        !          1602:                  # 5 components are only valid for fileset updates, not base
        !          1603:                  # filesets (full packages). We trim 5+ components down to 4.
        !          1604:                  pp_warn "version '$1' has too many dots for AIX, truncating"
        !          1605:                  echo "$v" | cut -d. -f1-4;;
        !          1606:         *.*.*.*) echo "$v";;
        !          1607:         *.*.*) echo "$v.0";;
        !          1608:         *.*) echo "$v.0.0";;
        !          1609:         *) echo "$v.0.0.0";;
        !          1610:     esac
        !          1611: }
        !          1612: 
        !          1613: pp_aix_select () {
        !          1614:        case "$1" in
        !          1615:            -user) op="";;
        !          1616:            -root) op="!";;
        !          1617:            *) pp_die "pp_aix_select: bad argument";;
        !          1618:        esac
        !          1619:        #pp_debug awk '$5 '$op' /^\/(usr|opt)(\/|$)/ { print; }'
        !          1620:        #awk '$5 '$op' /^\/(usr|opt)(\/|$)/ { print; }'
        !          1621:        awk $op'($6 ~ /^\/usr\// || $6 ~ /^\/opt\//) { print; }'
        !          1622: }
        !          1623: 
        !          1624: pp_aix_copy_root () {
        !          1625:     typeset t m o g f p st target
        !          1626:     while read t m o g f p st; do
        !          1627:         case "$t" in
        !          1628:            d) pp_create_dir_if_missing "$1${p%/}";;
        !          1629:            f) pp_add_transient_file "$1$p"
        !          1630:              pp_verbose ln "$pp_destdir$p" "$pp_destdir$1$p" ||
        !          1631:                pp_error "can't link $p into $1";;
        !          1632:            *) pp_warn "pp_aix_copy_root: filetype $t not handled";;
        !          1633:         esac
        !          1634:     done
        !          1635: }
        !          1636: 
        !          1637: 
        !          1638: pp_aix_size () {
        !          1639:     typeset prefix t m o g f p st
        !          1640: 
        !          1641:     prefix="$1"
        !          1642:     while read t m o g f p st; do
        !          1643:       case "$t" in f) du -a "$pp_destdir$p";; esac
        !          1644:     done | sed -e 's!/[^/]*$!!' | sort +1 |
        !          1645:     awk '{ if ($2 != d)
        !          1646:            { if (sz) print d,sz;
        !          1647:              d=$2; sz=0 }
        !          1648:            sz += $1; }
        !          1649:          END { if (sz) print d,sz }' |
        !          1650:     sed -n -e "s!^$pp_destdir!$prefix!p"
        !          1651: }
        !          1652: 
        !          1653: pp_aix_list () {
        !          1654:     awk '{ print "." pfx $6; }' pfx="$1"
        !          1655: }
        !          1656: 
        !          1657: pp_aix_make_liblpp () {
        !          1658:     typeset out dn fl f
        !          1659: 
        !          1660:     out="$1"; shift
        !          1661:     dn=`dirname "$2"`
        !          1662:     fl=
        !          1663:     for f
        !          1664:     do
        !          1665:        case "$f" in "$dn/"*) fl="$fl `basename $f`" ;;
        !          1666:                     *) pp_die "liblpp name $f not in $dn/";; esac
        !          1667:     done
        !          1668:     (cd "$dn" && pp_verbose  ar -c -g -r "$out" $fl) || pp_error "ar error"
        !          1669: }
        !          1670: 
        !          1671: pp_aix_make_script () {
        !          1672:     rm -f "$1"
        !          1673:     echo "#!/bin/sh" > "$1"
        !          1674:     cat >> "$1"
        !          1675:     echo "exit 0" >> "$1"
        !          1676:     chmod +x "$1"
        !          1677: }
        !          1678: 
        !          1679: pp_aix_inventory () {
        !          1680:     typeset fileset t m o g f p st type
        !          1681: 
        !          1682:     fileset="$1"
        !          1683:     while read t m o g f p st; do
        !          1684:       case "$p" in *:*) pp_error "path $p contains colon";; esac
        !          1685:       echo "$p:"
        !          1686:       case "$t" in
        !          1687:        f)   type=FILE;      defm=644 ;;
        !          1688:        s)   type=SYMLINK;   defm=777 ;;
        !          1689:        d)   type=DIRECTORY; defm=755 ;;
        !          1690:       esac
        !          1691:       echo " type = $type"
        !          1692:       echo " class = inventory,apply,$fileset"
        !          1693:       if test x"$m" = x"-"; then m="$defm"; fi
        !          1694:       if test x"$o" = x"-"; then o="root"; fi
        !          1695:       if test x"$g" = x"-"; then g="system"; fi
        !          1696:       echo " owner = $o"
        !          1697:       echo " group = $g"
        !          1698: 
        !          1699:       case "$m" in ????)
        !          1700:        m=`echo $m|sed -e 's/^1/TCB,/' \
        !          1701:                       -e 's/^[23]/TCB,SGID,/' \
        !          1702:                       -e 's/^[45]/TCB,SUID,/' \
        !          1703:                       -e 's/^[67]/TCB,SUID,SGID,/'`;;  # vtx bit ignored
        !          1704:       esac
        !          1705:       echo " mode = $m"
        !          1706:       case "$t" in
        !          1707:        f) if test ! -f "$pp_destdir$p"; then
        !          1708:                pp_error "$p: missing file"
        !          1709:           fi
        !          1710:           case "$flags" in
        !          1711:            *v*)
        !          1712:              echo " size = VOLATILE"
        !          1713:              echo " checksum = VOLATILE"
        !          1714:              ;;
        !          1715:            *)
        !          1716:              if test -r "$pp_destdir$p"; then
        !          1717:                echo " size = $size"
        !          1718:                 pp_verbose  sum -r < "$pp_destdir$p" |
        !          1719:                  sed -e 's/.*/ checksum = "&"/'
        !          1720:              fi
        !          1721:              ;;
        !          1722:           esac;;
        !          1723:        s)
        !          1724:           echo " target = $st"
        !          1725:           ;;
        !          1726:       esac
        !          1727: 
        !          1728:       #-- Record ABI types seen
        !          1729:       case "$t" in
        !          1730:         f) if test -r "$pp_destdir$p"; then
        !          1731:            case "`file "$pp_destdir$p"`" in
        !          1732:                *"executable (RISC System/6000)"*) abi=ppc;;
        !          1733:                *"64-bit XCOFF executable"*)       abi=ppc64;;
        !          1734:                *) abi=;;
        !          1735:            esac
        !          1736:            if test -n "$abi"; then
        !          1737:                pp_add_to_list pp_aix_abis_seen $abi
        !          1738:            fi
        !          1739:           fi;;
        !          1740:       esac
        !          1741: 
        !          1742:     done
        !          1743: }
        !          1744: 
        !          1745: pp_aix_depend ()
        !          1746: {
        !          1747:     if test -s "$1"; then
        !          1748:        pp_warn "aix dependencies not implemented"
        !          1749:     fi
        !          1750: }
        !          1751: 
        !          1752: pp_aix_add_service () {
        !          1753:        typeset svc cmd_cmd cmd_arg f
        !          1754:        svc="$1"
        !          1755: 
        !          1756:        pp_load_service_vars $svc
        !          1757: 
        !          1758:        set -- $cmd
        !          1759:        cmd_cmd="$1"; shift
        !          1760:        cmd_arg="$pp_aix_mkssys_cmd_args";
        !          1761: 
        !          1762:        case "$stop_signal" in
        !          1763:                HUP) stop_signal=1;;
        !          1764:                INT) stop_signal=2;;
        !          1765:                QUIT) stop_signal=3;;
        !          1766:                KILL) stop_signal=9;;
        !          1767:                TERM) stop_signal=15;;
        !          1768:                USR1) stop_signal=30;;
        !          1769:                USR2) stop_signal=31;;
        !          1770:                "")
        !          1771:                  pp_error "%service $svc: stop_signal not set";;
        !          1772:                [a-zA-Z]*)
        !          1773:                  pp_error "%service $svc: bad stop_signal ($stop_signal)";;
        !          1774:        esac
        !          1775: 
        !          1776:        test -z "$pidfile" || pp_error "aix requires empty pidfile (non daemon)"
        !          1777: 
        !          1778:        pp_add_component run
        !          1779:        if test "$user" = "root"; then
        !          1780:            uid=0
        !          1781:        else
        !          1782:             uid="\"\`/usr/bin/id -u $user\`\""
        !          1783:        fi
        !          1784: 
        !          1785: 
        !          1786:         #-- add command text to create/remove the service
        !          1787:        cat <<-. >> $pp_wrkdir/%post.$svc
        !          1788: svc=$svc
        !          1789: uid=0
        !          1790: cmd_cmd=$daemon
        !          1791: cmd_arg="$cmd_arg"
        !          1792: stop_signal=$stop_signal
        !          1793: force_signal=9
        !          1794: srcgroup="$pp_aix_mkssys_group"
        !          1795: 
        !          1796: lssrc -s \$svc > /dev/null 2>&1
        !          1797: if [ \$? -eq 0 ]; then
        !          1798:   lssrc -s \$svc | grep "active" > /dev/null 2>&1
        !          1799:   if [ \$? -eq 0 ]; then
        !          1800:     stopsrc -s \$svc > /dev/null 2>&1
        !          1801:   fi
        !          1802:   rmsys -s \$svc > /dev/null 2>&1
        !          1803: fi
        !          1804: 
        !          1805: mkssys -s \$svc -u \$uid -p "\$cmd_cmd" \${cmd_arg:+-a "\$cmd_arg"} -S -n \$stop_signal -f 9 ${pp_aix_mkssys_args} \${srcgroup:+-G \$srcgroup}
        !          1806: .
        !          1807: 
        !          1808:         #-- add code to start the service on reboot
        !          1809:         ${pp_aix_init_services_after_install} &&
        !          1810:           cat <<-. >> $pp_wrkdir/%post.$svc
        !          1811: mkitab "\$svc:2:once:/usr/bin/startsrc -s \$svc" > /dev/null 2>&1
        !          1812: .
        !          1813: 
        !          1814:        ${pp_aix_start_services_after_install} &&
        !          1815:           cat <<-. >> $pp_wrkdir/%post.$svc
        !          1816: startsrc -s \$svc
        !          1817: .
        !          1818: 
        !          1819: if [ -f "$pp_wrkdir/%post.run" ];then
        !          1820:     cat $pp_wrkdir/%post.run >> $pp_wrkdir/%post.$svc
        !          1821: fi
        !          1822: mv $pp_wrkdir/%post.$svc $pp_wrkdir/%post.run
        !          1823: 
        !          1824: 
        !          1825:         ${pp_aix_init_services_after_install} &&
        !          1826:            pp_prepend $pp_wrkdir/%preun.$svc <<-.
        !          1827: rmitab $svc
        !          1828: .
        !          1829:        pp_prepend $pp_wrkdir/%preun.$svc <<-.
        !          1830: stopsrc -s $svc >/dev/null 2>&1
        !          1831: rmssys -s $svc
        !          1832: .
        !          1833: 
        !          1834: if [ -f "$pp_wrkdir/%preun.run" ];then
        !          1835:     cat $pp_wrkdir/%preun.run >> $pp_wrkdir/%preun.$svc
        !          1836: fi
        !          1837: mv $pp_wrkdir/%preun.$svc $pp_wrkdir/%preun.run
        !          1838: }
        !          1839: 
        !          1840: pp_backend_aix () {
        !          1841:         typeset briefex instuser instroot svc cmp outbff
        !          1842:         typeset user_wrkdir root_wrkdir
        !          1843:         typeset user_files root_files
        !          1844: 
        !          1845:        test -n "$pp_destdir" ||
        !          1846:           pp_error "AIX backend requires the '--destdir' option"
        !          1847: 
        !          1848:        instuser="/usr/lpp/$name"
        !          1849:        instroot="$instuser/inst_root"
        !          1850:        pp_aix_bff_name=${pp_aix_bff_name:-$name}
        !          1851: 
        !          1852:        # Here is the component mapping:
        !          1853:        #  run -> $pp_aix_bff_name.rte ('Run time environment')
        !          1854:        #  doc -> $pp_aix_bff_name.doc (non-standard)
        !          1855:        #  dev -> $pp_aix_bff_name.adt ('Application developer toolkit')
        !          1856:        #  dbg -> $pp_aix_bff_name.diag ('Diagnostics')
        !          1857: 
        !          1858:        test `echo "$summary" | wc -c ` -gt 40 && pp_error "\$summary too long"
        !          1859: 
        !          1860:        user_wrkdir=$pp_wrkdir/u
        !          1861:        root_wrkdir=$pp_wrkdir/r
        !          1862:        pp_verbose  rm -rf $user_wrkdir $root_wrkdir
        !          1863:        pp_verbose  mkdir -p $user_wrkdir $root_wrkdir
        !          1864: 
        !          1865:        for svc in $pp_services .; do
        !          1866:            test . = "$svc" && continue
        !          1867:             pp_aix_add_service $svc
        !          1868:        done
        !          1869: 
        !          1870:         {
        !          1871:          echo "4 $pp_aix_arch I $name {"
        !          1872: 
        !          1873:          for cmp in $pp_components; do
        !          1874:            case "$cmp" in
        !          1875:                run) ex=rte  briefex="runtime";;
        !          1876:                doc) ex=doc  briefex="documentation";;
        !          1877:                dev) ex=adt  briefex="developer toolkit";;
        !          1878:                dbg) ex=diag briefex="diagnostics";;
        !          1879:            esac
        !          1880: 
        !          1881:            user_files=$pp_wrkdir/%files.$cmp.u
        !          1882:            root_files=$pp_wrkdir/%files.$cmp.r
        !          1883: 
        !          1884:            pp_aix_select -user < $pp_wrkdir/%files.$cmp > $user_files
        !          1885:            pp_aix_select -root < $pp_wrkdir/%files.$cmp > $root_files
        !          1886: 
        !          1887:             # Default to USR only unless there are root files,
        !          1888:             # or a post/pre/check script associated
        !          1889:            content=U
        !          1890:             if test -s $root_files \
        !          1891:                     -o -s $pp_wrkdir/%pre.$cmp \
        !          1892:                     -o -s $pp_wrkdir/%post.$cmp \
        !          1893:                     -o -s $pp_wrkdir/%preun.$cmp \
        !          1894:                     -o -s $pp_wrkdir/%check.$cmp
        !          1895:             then
        !          1896:                 content=B
        !          1897:             fi
        !          1898: 
        !          1899:             if $pp_opt_debug; then
        !          1900:                 echo "$cmp USER %files:"
        !          1901:                 cat $user_files
        !          1902:                 echo "$cmp ROOT %files:"
        !          1903:                 cat $root_files
        !          1904:             fi >&2
        !          1905: 
        !          1906:            bosboot=N; pp_contains_any "$pp_aix_bosboot" $cmp && bosboot=b
        !          1907: 
        !          1908:             echo $pp_aix_bff_name.$ex \
        !          1909:                  ${pp_aix_version:-`pp_aix_version_fix "$version"`} \
        !          1910:                 1 $bosboot $content \
        !          1911:                 $pp_aix_lang "$summary $briefex"
        !          1912:            echo "["
        !          1913: 
        !          1914:            pp_aix_depend $pp_wrkdir/%depend.$cmp
        !          1915: 
        !          1916:            echo "%"
        !          1917: 
        !          1918:            # generate per-directory size information
        !          1919:            pp_aix_size < $user_files
        !          1920:            pp_aix_size $instroot < $root_files
        !          1921: 
        !          1922:            pp_aix_list            < $user_files  > $user_wrkdir/$pp_aix_bff_name.$ex.al
        !          1923:            pp_aix_list $instroot  < $root_files >> $user_wrkdir/$pp_aix_bff_name.$ex.al
        !          1924:            pp_aix_list            < $root_files  > $root_wrkdir/$pp_aix_bff_name.$ex.al
        !          1925: 
        !          1926:             if $pp_opt_debug; then
        !          1927:                 echo "$cmp USER $pp_aix_bff_name.$ex.al:"
        !          1928:                 cat $user_wrkdir/$pp_aix_bff_name.$ex.al
        !          1929:                 echo "$cmp ROOT $pp_aix_bff_name.$ex.al:"
        !          1930:                 cat $root_wrkdir/$pp_aix_bff_name.$ex.al
        !          1931:             fi >&2
        !          1932: 
        !          1933:            pp_aix_inventory $pp_aix_bff_name.$ex < $user_files \
        !          1934:                                        > $user_wrkdir/$pp_aix_bff_name.$ex.inventory
        !          1935:            pp_aix_inventory $pp_aix_bff_name.$ex < $root_files \
        !          1936:                                        > $root_wrkdir/$pp_aix_bff_name.$ex.inventory
        !          1937: 
        !          1938:             if $pp_opt_debug; then
        !          1939:                 pp_debug "$cmp USER $pp_aix_bff_name.$ex.inventory:"
        !          1940:                 cat $user_wrkdir/$pp_aix_bff_name.$ex.inventory
        !          1941:                 pp_debug "$cmp ROOT $pp_aix_bff_name.$ex.inventory:"
        !          1942:                 cat $root_wrkdir/$pp_aix_bff_name.$ex.inventory
        !          1943:             fi >&2
        !          1944: 
        !          1945:            if test x"" != x"${pp_aix_copyright:-$copyright}"; then
        !          1946:                echo "${pp_aix_copyright:-$copyright}" > $user_wrkdir/$pp_aix_bff_name.$ex.copyright
        !          1947:                echo "${pp_aix_copyright:-$copyright}" > $root_wrkdir/$pp_aix_bff_name.$ex.copyright
        !          1948:            fi
        !          1949: 
        !          1950:            #-- assume that post/pre uninstall scripts only make
        !          1951:            #   sense when installed in a root context
        !          1952: 
        !          1953:            if test -r $pp_wrkdir/%pre.$cmp; then
        !          1954:                        pp_aix_make_script $user_wrkdir/$pp_aix_bff_name.$ex.pre_i \
        !          1955:                 < $pp_wrkdir/%pre.$cmp
        !          1956:            fi
        !          1957: 
        !          1958:            if test -r $pp_wrkdir/%post.$cmp; then
        !          1959:                pp_aix_make_script $root_wrkdir/$pp_aix_bff_name.$ex.post_i \
        !          1960:                        < $pp_wrkdir/%post.$cmp
        !          1961:            fi
        !          1962: 
        !          1963:            if test -r $pp_wrkdir/%preun.$cmp; then
        !          1964:                pp_aix_make_script $root_wrkdir/$pp_aix_bff_name.$ex.unpost_i \
        !          1965:                        < $pp_wrkdir/%preun.$cmp
        !          1966:            fi
        !          1967: 
        !          1968:            # remove empty files
        !          1969:            for f in $user_wrkdir/$pp_aix_bff_name.$ex.* $root_wrkdir/$pp_aix_bff_name.$ex.*; do
        !          1970:              if test ! -s "$f"; then
        !          1971:                 pp_debug "removing empty $f"
        !          1972:                 rm -f "$f"
        !          1973:               fi
        !          1974:            done
        !          1975: 
        !          1976:            # copy/link the root files so we can do an easy backup later
        !          1977:            pp_aix_copy_root $instroot < $root_files
        !          1978: 
        !          1979:            echo "%"
        !          1980:            echo "]"
        !          1981:          done
        !          1982:          echo "}"
        !          1983:        } > $pp_wrkdir/lpp_name
        !          1984: 
        !          1985:         if $pp_opt_debug; then
        !          1986:             echo "/lpp_name :"
        !          1987:             cat $pp_wrkdir/lpp_name
        !          1988:         fi >&2
        !          1989: 
        !          1990:         #-- copy the /lpp_name file to the destdir
        !          1991:         pp_add_transient_file /lpp_name
        !          1992:         cp $pp_wrkdir/lpp_name $pp_destdir/lpp_name
        !          1993: 
        !          1994:         #-- copy the liblpp.a files under destdir for packaging
        !          1995:        (cd $user_wrkdir && pp_verbose  ar -c -g -r liblpp.a $name.*) ||
        !          1996:                pp_error "ar error"
        !          1997:        if test -s $user_wrkdir/liblpp.a; then
        !          1998:            pp_add_transient_file $instuser/liblpp.a
        !          1999:           pp_verbose cp $user_wrkdir/liblpp.a $pp_destdir$instuser/liblpp.a ||
        !          2000:                pp_error "cannot create user liblpp.a"
        !          2001:        fi
        !          2002:        (cd $root_wrkdir && pp_verbose  ar -c -g -r liblpp.a $name.*) ||
        !          2003:                pp_error "ar error"
        !          2004:        if test -s $root_wrkdir/liblpp.a; then
        !          2005:            pp_add_transient_file $instroot/liblpp.a
        !          2006:           pp_verbose cp $root_wrkdir/liblpp.a $pp_destdir$instroot/liblpp.a ||
        !          2007:                pp_error "cannot create root liblpp.a"
        !          2008:        fi
        !          2009: 
        !          2010:         { echo ./lpp_name
        !          2011:          test -s $user_wrkdir/liblpp.a && echo .$instuser/liblpp.a
        !          2012:          test -s $root_wrkdir/liblpp.a && echo .$instroot/liblpp.a
        !          2013:          cat $user_wrkdir/$name.*.al   # includes the relocated root files!
        !          2014:        } > $pp_wrkdir/bff.list
        !          2015: 
        !          2016:        if test -n "$pp_aix_abis_seen" -a x"$pp_aix_arch_std" = x"auto"; then
        !          2017:            case "$pp_aix_abis_seen" in
        !          2018:                "ppc ppc64"|"ppc64 ppc")
        !          2019:                    pp_aix_arch_std=ppc64
        !          2020:                    ;;
        !          2021:                ppc|ppc64)
        !          2022:                    pp_aix_arch_std=$pp_aix_abis_seen
        !          2023:                    ;;
        !          2024:                *" "*)
        !          2025:                    pp_warn "multiple architectures detected: $pp_aix_abis_seen"
        !          2026:                    pp_aix_arch_std=unknown
        !          2027:                    ;;
        !          2028:                "")
        !          2029:                    pp_warn "no binary executables detected; using noarch"
        !          2030:                    pp_aix_arch_std=noarch
        !          2031:                    ;;
        !          2032:                *)
        !          2033:                    pp_warn "unknown architecture detected $pp_aix_abis_seen"
        !          2034:                    pp_aix_arch_std=$pp_aix_abis_seen
        !          2035:                    ;;
        !          2036:            esac
        !          2037:        fi
        !          2038: 
        !          2039:        . $pp_wrkdir/%fixup
        !          2040: 
        !          2041:         outbff=`pp_backend_aix_names`
        !          2042:         pp_debug "creating: $pp_wrkdir/$outbff"
        !          2043:        (cd $pp_destdir && pp_verbose  /usr/sbin/backup -i -q -p -f -) \
        !          2044:           < $pp_wrkdir/bff.list \
        !          2045:          > $pp_wrkdir/$outbff || pp_error "backup failed"
        !          2046:         $pp_aix_sudo /usr/sbin/installp -l -d $pp_wrkdir/$outbff
        !          2047: }
        !          2048: 
        !          2049: pp_backend_aix_cleanup () {
        !          2050:     :
        !          2051: }
        !          2052: 
        !          2053: pp_backend_aix_names () {
        !          2054:        echo "$name.${pp_aix_version:-`pp_aix_version_fix "$version"`}.bff"
        !          2055: }
        !          2056: 
        !          2057: pp_backend_aix_install_script () {
        !          2058:        typeset pkgname platform
        !          2059:         #
        !          2060:         # The script should take a first argument being the
        !          2061:         # operation; further arguments refer to components or services
        !          2062:         #
        !          2063:         # list-components           -- lists components in the pkg
        !          2064:         # install component...      -- installs the components
        !          2065:         # uninstall component...    -- uninstalles the components
        !          2066:         # list-services             -- lists the services in the pkg
        !          2067:         # start service...          -- starts the name service
        !          2068:         # stop service...           -- stops the named services
        !          2069:         # print-platform            -- prints the platform group
        !          2070:         #
        !          2071:         pkgname="`pp_backend_aix_names`"
        !          2072:        platform="`pp_backend_aix_probe`"   # XXX should be derived from files
        !          2073: 
        !          2074:         fsets=
        !          2075:         for cmp in $pp_components; do
        !          2076:            case "$cmp" in
        !          2077:                run) ex=rte;;
        !          2078:                doc) ex=doc;;
        !          2079:                dev) ex=adt;;
        !          2080:                dbg) ex=diag;;
        !          2081:            esac
        !          2082:             fsets="$fsets $name.$ex"
        !          2083:         done
        !          2084: 
        !          2085:         echo '#!/bin/sh'
        !          2086:         pp_install_script_common
        !          2087: 
        !          2088:         cat <<-.
        !          2089: 
        !          2090:             cpt_to_fileset () {
        !          2091:                 test x"\$*" = x"all" &&
        !          2092:                     set -- $pp_components
        !          2093:                 for cpt
        !          2094:                 do
        !          2095:                     case "\$cpt" in
        !          2096:                         run) echo "$name.rte";;
        !          2097:                         doc) echo "$name.doc";;
        !          2098:                         dev) echo "$name.adt";;
        !          2099:                         dbg) echo "$name.diag";;
        !          2100:                         *) usage;;
        !          2101:                     esac
        !          2102:                 done
        !          2103:             }
        !          2104: 
        !          2105:            test \$# -eq 0 && usage
        !          2106:             op="\$1"; shift
        !          2107: 
        !          2108:             case "\$op" in
        !          2109:                 list-components)
        !          2110:                     test \$# -eq 0 || usage \$op
        !          2111:                     echo "$pp_components"
        !          2112:                     ;;
        !          2113:                 list-services)
        !          2114:                     test \$# -eq 0 || usage \$op
        !          2115:                     echo "$pp_services"
        !          2116:                     ;;
        !          2117:                 list-files)
        !          2118:                     test \$# -ge 1 || usage \$op
        !          2119:                     echo \${PP_PKGDESTDIR:-.}/$pkgname
        !          2120:                     ;;
        !          2121:                 install)
        !          2122:                     test \$# -ge 1 || usage \$op
        !          2123:                     verbose /usr/sbin/installp -acX -V0 -F \
        !          2124:                         -d \${PP_PKGDESTDIR:-.}/$pkgname \
        !          2125:                         \`cpt_to_fileset "\$@"\`
        !          2126:                     ;;
        !          2127:                 uninstall)
        !          2128:                     test \$# -ge 1 || usage \$op
        !          2129:                     verbose /usr/sbin/installp -u -e/dev/null \
        !          2130:                        -V0 \`cpt_to_fileset "\$@"\`
        !          2131:                     ;;
        !          2132:                 start|stop)
        !          2133:                     test \$# -ge 1 || usage \$op
        !          2134:                     ec=0
        !          2135:                     for svc
        !          2136:                     do
        !          2137:                         verbose \${op}src -s \$svc || ec=1
        !          2138:                     done
        !          2139:                     exit \$ec
        !          2140:                     ;;
        !          2141:                 print-platform)
        !          2142:                     echo "$platform"
        !          2143:                    ;;
        !          2144:                 *)
        !          2145:                     usage;;
        !          2146:             esac
        !          2147: .
        !          2148: }
        !          2149: 
        !          2150: pp_backend_aix_init_svc_vars () {
        !          2151:     :
        !          2152: }
        !          2153: 
        !          2154: pp_backend_aix_probe () {
        !          2155:        echo "${pp_aix_os}-${pp_aix_arch_std}"
        !          2156: }
        !          2157: 
        !          2158: pp_backend_aix_vas_platforms () {
        !          2159:     case "${pp_aix_arch_std}" in
        !          2160:        ppc*)   :;;
        !          2161:        *)      pp_die "unknown architecture ${pp_aix_arch_std}";;
        !          2162:     esac
        !          2163:     case "${pp_aix_os}" in
        !          2164:        aix43)  echo "aix-43";;
        !          2165:        aix51)  echo "aix-51 aix-43";;
        !          2166:        aix52)  echo "aix-51 aix-43";;
        !          2167:        aix53)  echo "aix-53 aix-51 aix-43";;
        !          2168:        aix61)  echo "aix-53 aix-51 aix-43";;
        !          2169:        *)      pp_die "unknown system ${pp_aix_os}";;
        !          2170:     esac
        !          2171: }
        !          2172: pp_backend_aix_function () {
        !          2173:     case $1 in
        !          2174:     pp_mkgroup) cat <<'.';;
        !          2175:             /usr/sbin/lsgroup "$1" >/dev/null &&
        !          2176:                return 0
        !          2177:            echo "Creating group $1"
        !          2178:             /usr/bin/mkgroup -A "$1"
        !          2179: .
        !          2180:     pp_mkuser:depends) echo pp_mkgroup;;
        !          2181:     pp_mkuser) cat <<'.';;
        !          2182:             /usr/sbin/lsuser "$1" >/dev/null &&
        !          2183:                return 0
        !          2184:            pp_mkgroup "${2:-$1}" || return 1
        !          2185:            echo "Creating user $1"
        !          2186:            /usr/bin/mkuser \
        !          2187:                login=false \
        !          2188:                rlogin=false \
        !          2189:                account_locked=true \
        !          2190:                home="${3:-/nohome.$1}" \
        !          2191:                pgrp="${2:-$1}" \
        !          2192:                "$1"
        !          2193: .
        !          2194:     pp_havelib) cat <<'.';;
        !          2195:             case "$2" in
        !          2196:                 "")    pp_tmp_name="lib$1.so";;
        !          2197:                 *.*.*) pp_tmp_name="lib$1.so.$2";;
        !          2198:                 *.*)   pp_tmp_name="lib$1.so.$2.0";;
        !          2199:                 *)     pp_tmp_name="lib$1.so.$2";;
        !          2200:             esac
        !          2201:             for pp_tmp_dir in `echo "/usr/lib:/lib${3:+:$3}" | tr : ' '`; do
        !          2202:                 test -r "$pp_tmp_dir/$pp_tmp_name" -a \
        !          2203:                    -r "$pp_tmp_dir/lib$1.so" && return 0
        !          2204:             done
        !          2205:             return 1
        !          2206: .
        !          2207:     *) false;;
        !          2208:     esac
        !          2209: }
        !          2210: 
        !          2211: pp_platforms="$pp_platforms sd"
        !          2212: 
        !          2213: pp_backend_sd_detect () {
        !          2214:     test x"$1" = x"HP-UX"
        !          2215: }
        !          2216: 
        !          2217: pp_backend_sd_init () {
        !          2218:     pp_sd_sudo=
        !          2219:     pp_sd_startlevels=2
        !          2220:     pp_sd_stoplevels=auto
        !          2221:     pp_sd_config_file=
        !          2222:     pp_sd_vendor=
        !          2223:     pp_sd_vendor_tag=Quest
        !          2224:     pp_sd_default_start=1           # config_file default start value
        !          2225: 
        !          2226:     pp_readlink_fn=pp_ls_readlink   # HPUX has no readlink
        !          2227:     pp_shlib_suffix='.sl'           # .so on most other platforms
        !          2228: 
        !          2229:     pp_sd_detect_os
        !          2230: }
        !          2231: 
        !          2232: pp_sd_detect_os () {
        !          2233:     typeset revision
        !          2234: 
        !          2235:     revision=`uname -r`
        !          2236:     pp_sd_os="${revision#?.}"
        !          2237:     test -z "$pp_sd_os" &&
        !          2238:         pp_warn "cannot detect OS version"
        !          2239:     pp_sd_os_std="hpux`echo $pp_sd_os | tr -d .`"
        !          2240: 
        !          2241:     case "`uname -m`" in
        !          2242:        9000/[678]??) pp_sd_arch_std=hppa;;
        !          2243:        ia64) pp_sd_arch_std=ia64;;
        !          2244:        *) pp_sd_arch_std=unknown;;
        !          2245:     esac
        !          2246: }
        !          2247: 
        !          2248: pp_sd_write_files () {
        !          2249:     typeset t m o g f p st line dm
        !          2250:     while read t m o g f p st; do
        !          2251:         line="                file"
        !          2252:         case "$f" in *v*) line="$line -v";; esac    # FIXME for uninstall
        !          2253:        case ${pp_sd_os} in
        !          2254:            10.*)
        !          2255:                case $t in
        !          2256:                    f) dm=644;;
        !          2257:                    d) p=${p%/}; dm=755;;
        !          2258:                esac
        !          2259:                ;;
        !          2260:            *)
        !          2261:                case $t in
        !          2262:                    f) dm=644;;
        !          2263:                    d) line="$line -t d"; p=${p%/}; dm=755;;
        !          2264:                    s) line="$line -t s";;
        !          2265:                esac
        !          2266:                ;;
        !          2267:        esac
        !          2268: 
        !          2269:         test x"$o" = x"-" && o=root
        !          2270:         test x"$g" = x"-" && g=sys
        !          2271:         test x"$m" = x"-" && m=$dm
        !          2272: 
        !          2273:         case $t in
        !          2274:             s) echo "$line $st $p";;
        !          2275:             *) echo "$line -o $o -g $g -m $m $pp_destdir$p $p";;
        !          2276:         esac
        !          2277: 
        !          2278:     done
        !          2279: }
        !          2280: 
        !          2281: pp_sd_service_group_script () {
        !          2282:     typeset grp svcs scriptpath out
        !          2283:     grp="$1"
        !          2284:     svcs="$2"
        !          2285:     scriptpath="/sbin/init.d/$grp"
        !          2286:     out="$pp_destdir$scriptpath"
        !          2287: 
        !          2288:     pp_add_file_if_missing $scriptpath run 755 || return 0
        !          2289: 
        !          2290:     cat <<-. > $out
        !          2291:        #!/sbin/sh
        !          2292:        # generated by pp $pp_version
        !          2293:        svcs="$svcs"
        !          2294: .
        !          2295: 
        !          2296:     cat <<-'.' >> $out
        !          2297:         #-- starts services in order.. stops them all if any break
        !          2298:         pp_start () {
        !          2299:             undo=
        !          2300:             for svc in $svcs; do
        !          2301:                 /sbin/init.d/$svc start
        !          2302:                case $? in
        !          2303:                  0|4)
        !          2304:                    undo="$svc $undo"
        !          2305:                    ;;
        !          2306:                  *)
        !          2307:                     if test -n "$undo"; then
        !          2308:                         for svc in $undo; do
        !          2309:                            /sbin/init.d/$svc stop
        !          2310:                         done
        !          2311:                         return 1
        !          2312:                     fi
        !          2313:                    ;;
        !          2314:                 esac
        !          2315:             done
        !          2316:             return 0
        !          2317:         }
        !          2318: 
        !          2319:         #-- stops services in reverse
        !          2320:         pp_stop () {
        !          2321:             reverse=
        !          2322:             for svc in $svcs; do
        !          2323:                 reverse="$svc $reverse"
        !          2324:             done
        !          2325:             rc=0
        !          2326:             for svc in $reverse; do
        !          2327:                 /sbin/init.d/$svc stop || rc=$?
        !          2328:             done
        !          2329:             return $rc
        !          2330:         }
        !          2331: 
        !          2332:         case $1 in
        !          2333:             start_msg) echo "Starting $svcs";;
        !          2334:             stop_msg)  echo "Stopping $svcs";;
        !          2335:            start)     pp_start;;
        !          2336:            stop)      pp_stop;;
        !          2337:             *)        echo "usage: $0 {start|stop|start_msg|stop_msg}"
        !          2338:                        exit 1;;
        !          2339:         esac
        !          2340: .
        !          2341: }
        !          2342: 
        !          2343: pp_sd_service_script () {
        !          2344:     typeset svc config_file config_value scriptpath out
        !          2345: 
        !          2346:     svc="$1"
        !          2347:     scriptpath="/sbin/init.d/$svc"
        !          2348: 
        !          2349:     config_file=${pp_sd_config_file:-/etc/rc.config.d/$svc}
        !          2350:     sd_config_var=`echo run-$svc | tr '[a-z]-' '[A-Z]_'`
        !          2351:     sd_config_value=${pp_sd_default_start:-0}
        !          2352:     pp_load_service_vars "$svc"
        !          2353: 
        !          2354:     test -n "$user" -a x"$user" != x"root" &&
        !          2355:         cmd="SHELL=/usr/bin/sh /usr/bin/su $user -c \"exec `echo $cmd | sed -e 's,[$\\\`],\\&,g'`\""
        !          2356:     if test -z "$pidfile"; then
        !          2357:         pidfile="/var/run/$svc.pid"
        !          2358:         cmd="$cmd & echo \$! > \$pidfile"
        !          2359:     fi
        !          2360: 
        !          2361:     pp_debug "config file is $config_file"
        !          2362: 
        !          2363:     pp_add_file_if_missing $scriptpath run 755
        !          2364:     pp_add_file_if_missing $config_file run 644 v
        !          2365: 
        !          2366:     cat <<-. >> $pp_destdir$config_file
        !          2367: 
        !          2368:        # Controls whether the $svc service is started
        !          2369:        $sd_config_var=$sd_config_value
        !          2370: .
        !          2371: 
        !          2372:     if test ! -f $pp_destdir$scriptpath; then
        !          2373:     cat <<-. > $pp_destdir$scriptpath
        !          2374:        #!/sbin/sh
        !          2375:        # generated by pp $pp_version
        !          2376: 
        !          2377:        svc="$svc"
        !          2378:        pidfile="$pidfile"
        !          2379:        config_file="$config_file"
        !          2380: 
        !          2381:        pp_start () {
        !          2382:            $cmd
        !          2383:        }
        !          2384: 
        !          2385:        pp_disabled () {
        !          2386:            test \${$sd_config_var:-0} -eq 0
        !          2387:        }
        !          2388: 
        !          2389:        pp_stop () {
        !          2390:            if test ! -s "$pidfile"; then
        !          2391:                echo "Unable to stop $svc (no pid file)"
        !          2392:                return 1
        !          2393:            else
        !          2394:                read pid < "$pidfile"
        !          2395:                if kill -0 "$pid" 2>/dev/null; then
        !          2396:                    if kill -${stop_signal:-TERM} "$pid"; then
        !          2397:                        rm -f "$pidfile"
        !          2398:                        return 0
        !          2399:                    else
        !          2400:                        echo "Unable to stop $svc"
        !          2401:                        return 1
        !          2402:                    fi
        !          2403:                else
        !          2404:                    rm -f "$pidfile"
        !          2405:                    return 0
        !          2406:                fi
        !          2407:            fi
        !          2408:        }
        !          2409: 
        !          2410:        pp_running () {
        !          2411:            if test ! -s "$pidfile"; then
        !          2412:                return 1
        !          2413:            else
        !          2414:                read pid < "$pidfile"
        !          2415:                kill -0 "$pid" 2>/dev/null
        !          2416:            fi
        !          2417:        }
        !          2418: 
        !          2419:        case $1 in
        !          2420:            start_msg) echo "Starting the $svc service";;
        !          2421:            stop_msg)  echo "Stopping the $svc service";;
        !          2422:            start)
        !          2423:                    if test -f "$config_file"; then
        !          2424:                        . $config_file
        !          2425:                    fi
        !          2426:                    if pp_disabled; then
        !          2427:                        exit 2
        !          2428:                    elif pp_running; then
        !          2429:                        echo "$svc already running";
        !          2430:                        exit 0
        !          2431:                    elif pp_start; then
        !          2432:                        echo "$svc started";
        !          2433:                        # rc(1M) says we should exit 4, but nobody expects it!
        !          2434:                        exit 0
        !          2435:                    else
        !          2436:                        exit 1
        !          2437:                    fi;;
        !          2438:            stop)   if pp_stop; then
        !          2439:                        echo "$svc stopped";
        !          2440:                        exit 0
        !          2441:                    else
        !          2442:                        exit 1
        !          2443:                    fi;;
        !          2444:            *) echo "usage: $0 {start|stop|start_msg|stop_msg}"
        !          2445:               exit 1;;
        !          2446:        esac
        !          2447: .
        !          2448:     fi
        !          2449: }
        !          2450: 
        !          2451: pp_sd_make_service () {
        !          2452:         typeset level startpriority stoppriority startlevels stoplevels
        !          2453:         typeset svc svcvar symtype
        !          2454: 
        !          2455:         svc="$1"
        !          2456:        svcvar=`pp_makevar $svc`
        !          2457: 
        !          2458:        case ${pp_sd_os} in
        !          2459:            10.*) symtype="file";;
        !          2460:            *) symtype="file -t s";;
        !          2461:        esac
        !          2462: 
        !          2463:         # TODO: Figure out why this check is here
        !          2464:         #-- don't do anything if the script exists
        !          2465:         #if test -s "$pp_destdir/sbin/init.d/$svc"; then
        !          2466:         #    pp_error "$pp_destdir/sbin/init.d/$svc exists"
        !          2467:         #    return
        !          2468:         #fi
        !          2469: 
        !          2470:         # symlink the script, depending on the priorities chosen
        !          2471:         eval startpriority='${pp_sd_startpriority_'$svcvar'}'
        !          2472:         eval stoppriority='${pp_sd_stoppriority_'$svcvar'}'
        !          2473:         test -z "$startpriority" && startpriority="${pp_sd_startpriority:-50}"
        !          2474:         test -z "$stoppriority" && stoppriority="${pp_sd_stoppriority:-50}"
        !          2475: 
        !          2476:         eval startlevels='${pp_sd_startlevels_'$svcvar'}'
        !          2477:         test -z "$startlevels" && startlevels="$pp_sd_startlevels"
        !          2478: 
        !          2479:         eval stoplevels='${pp_sd_stoplevels_'$svcvar'}'
        !          2480:         test -z "$stoplevels" && stoplevels="$pp_sd_stoplevels"
        !          2481: 
        !          2482:         # create the script and config file
        !          2483:         pp_sd_service_script $svc
        !          2484: 
        !          2485:         # fix the priority up
        !          2486:         case "$startpriority" in
        !          2487:             ???) :;;
        !          2488:             ??) startpriority=0$startpriority;;
        !          2489:             ?) startpriority=00$startpriority;;
        !          2490:         esac
        !          2491:         case "$stoppriority" in
        !          2492:             ???) :;;
        !          2493:             ??) stoppriority=0$stoppriority;;
        !          2494:             ?) stoppriority=00$stoppriority;;
        !          2495:         esac
        !          2496: 
        !          2497:         if test x"$stoplevels" = x"auto"; then
        !          2498:             stoplevels=
        !          2499:             test -z "$startlevels" || for level in $startlevels; do
        !          2500:                 stoplevels="$stoplevels `expr $level - 1`"
        !          2501:             done
        !          2502:         fi
        !          2503: 
        !          2504:         # create the symlinks
        !          2505:         test -z "$startlevels" || for level in $startlevels; do
        !          2506:             echo "                ${symtype}" \
        !          2507:                     "/sbin/init.d/$svc" \
        !          2508:                     "/sbin/rc$level.d/S$startpriority$svc"
        !          2509:         done
        !          2510:         test -z "$stoplevels" || for level in $stoplevels; do
        !          2511:             echo "                ${symtype}" \
        !          2512:                     "/sbin/init.d/$svc" \
        !          2513:                     "/sbin/rc$level.d/K$stoppriority$svc"
        !          2514:         done
        !          2515: }
        !          2516: 
        !          2517: pp_sd_control () {
        !          2518:     typeset ctrl script
        !          2519:     typeset cpt
        !          2520: 
        !          2521:     ctrl="$1"; shift
        !          2522:     cpt="$1"; shift
        !          2523:     script="$pp_wrkdir/control.$ctrl.$cpt"
        !          2524:     cat <<. >$script
        !          2525: .
        !          2526:     cat "$@" >> $script
        !          2527:     echo "exit 0" >> $script
        !          2528:     /usr/bin/chmod +x $script
        !          2529:     echo "                $ctrl $script"
        !          2530: }
        !          2531: 
        !          2532: pp_backend_sd () {
        !          2533:     typeset psf cpt svc outfile release swp_flags
        !          2534: 
        !          2535:     psf=$pp_wrkdir/psf
        !          2536:     release="?.${pp_sd_os%.[0-9][0-9]}.*"
        !          2537: 
        !          2538:     echo "depot" > $psf
        !          2539:     echo "layout_version 1.0" >>$psf
        !          2540: 
        !          2541:     #-- vendor
        !          2542:     cat <<. >>$psf
        !          2543:         vendor
        !          2544:             tag             $pp_sd_vendor_tag
        !          2545:             title           "${pp_sd_vendor:-$vendor}"
        !          2546:         end
        !          2547: 
        !          2548:         product
        !          2549:             tag             $name
        !          2550:             revision        $version
        !          2551:             vendor_tag      $pp_sd_vendor_tag
        !          2552:             is_patch        false
        !          2553:             title           "$summary"
        !          2554:             copyright       "$copyright"
        !          2555:             machine_type    *
        !          2556:             os_name         HP-UX
        !          2557:             os_release      $release
        !          2558:             os_version      ?
        !          2559:             directory       /
        !          2560:             is_locatable    false
        !          2561: .
        !          2562:     test -n "$description" \
        !          2563:         && echo $description > $pp_wrkdir/description \
        !          2564:         && cat <<. >> $psf
        !          2565:             description     < $pp_wrkdir/description
        !          2566: .
        !          2567: 
        !          2568:     # make convenience service groups
        !          2569:     if test -n "$pp_service_groups"; then
        !          2570:        for grp in $pp_service_groups; do
        !          2571:            pp_sd_service_group_script \
        !          2572:                $grp "`pp_service_get_svc_group $grp`"
        !          2573:        done
        !          2574:     fi
        !          2575: 
        !          2576:     for cpt in $pp_components; do
        !          2577:         cat <<. >>$psf
        !          2578:             fileset
        !          2579:                 tag             ${pp_sd_fileset_tag:-$cpt}
        !          2580:                 title           "${summary:-cpt}"
        !          2581:                 revision        $version
        !          2582: .
        !          2583: 
        !          2584:        #-- make sure services are shut down during uninstall
        !          2585:         if test $cpt = run -a -n "$pp_services"; then
        !          2586:             for svc in $pp_services; do
        !          2587:                 pp_prepend $pp_wrkdir/%preun.$cpt <<-.
        !          2588:                        /sbin/init.d/$svc stop
        !          2589: .
        !          2590:             done
        !          2591:         fi
        !          2592: 
        !          2593:         #-- we put the post/preun code into configure/unconfigure
        !          2594:         # and not postinstall/preremove, because configure/unconfigure
        !          2595:         # scripts are run on the hosts where the package is installed,
        !          2596:         # not loaded (a subtle difference).
        !          2597:         test -s $pp_wrkdir/%pre.$cpt &&
        !          2598:             pp_sd_control checkinstall $cpt $pp_wrkdir/%pre.$cpt >> $psf
        !          2599:         test -s $pp_wrkdir/%post.$cpt &&
        !          2600:             pp_sd_control configure $cpt $pp_wrkdir/%post.$cpt >> $psf
        !          2601:         test -s $pp_wrkdir/%preun.$cpt &&
        !          2602:             pp_sd_control unconfigure $cpt $pp_wrkdir/%preun.$cpt >> $psf
        !          2603:         test -s $pp_wrkdir/%postun.$cpt &&
        !          2604:             pp_sd_control postremove $cpt $pp_wrkdir/%postun.$cpt >> $psf
        !          2605:         test -s $pp_wrkdir/%check.$cpt &&
        !          2606:             pp_sd_control checkinstall $cpt $pp_wrkdir/%check.$cpt >> $psf
        !          2607: 
        !          2608:         if test $cpt = run -a -n "$pp_services"; then
        !          2609:             for svc in $pp_services; do
        !          2610:                 #-- service names are 10 chars max on hpux
        !          2611:                 case "$svc" in ???????????*)
        !          2612:                     pp_warn "service name '$svc' is too long for hpux";;
        !          2613:                 esac
        !          2614:                 pp_sd_make_service $svc >> $psf
        !          2615:             done
        !          2616:             #pp_sd_make_service_config
        !          2617:         fi
        !          2618: 
        !          2619:         pp_sd_write_files < $pp_wrkdir/%files.$cpt >> $psf
        !          2620: 
        !          2621:         #-- end fileset clause
        !          2622:         cat <<. >>$psf
        !          2623:             end
        !          2624: .
        !          2625: 
        !          2626:     done
        !          2627: 
        !          2628:     #-- end product clause
        !          2629:     cat <<. >>$psf
        !          2630:         end
        !          2631: .
        !          2632: 
        !          2633:     $pp_opt_debug && cat $psf >&2
        !          2634: 
        !          2635:     test -s $pp_wrkdir/%fixup && . $pp_wrkdir/%fixup
        !          2636: 
        !          2637:     outfile=`pp_backend_sd_names`
        !          2638:     case ${pp_sd_os} in
        !          2639:        10.*)
        !          2640:            swp_flags="-x target_type=tape"
        !          2641:            ;;
        !          2642:        *)
        !          2643:            swp_flags="-x media_type=tape"
        !          2644:            ;;
        !          2645:     esac
        !          2646:     if pp_verbose ${pp_sd_sudo} /usr/sbin/swpackage -s $psf $swp_flags \
        !          2647:         @ $pp_wrkdir/$outfile
        !          2648:     then
        !          2649:         pp_verbose ${pp_sd_sudo} /usr/sbin/swlist -l file -s $pp_wrkdir/$outfile
        !          2650:     else
        !          2651:         pp_error "swpackage failed"
        !          2652:     fi
        !          2653: }
        !          2654: 
        !          2655: pp_backend_sd_cleanup () {
        !          2656:     :
        !          2657: }
        !          2658: 
        !          2659: pp_backend_sd_names () {
        !          2660:     echo "$name-$version.$pp_sd_arch_std.depot"
        !          2661: }
        !          2662: 
        !          2663: pp_backend_sd_install_script () {
        !          2664:     typeset pkgname platform
        !          2665: 
        !          2666:     pkgname=`pp_backend_sd_names`
        !          2667:     platform="`pp_backend_sd_probe`"
        !          2668: 
        !          2669:     echo "#!/bin/sh"
        !          2670:     pp_install_script_common
        !          2671:     cat <<.
        !          2672: 
        !          2673:         cpt_to_tags () {
        !          2674:             test x"\$*" = x"all" && set -- $pp_components
        !          2675:             for cpt
        !          2676:             do
        !          2677:                 echo "$name.\$cpt"
        !          2678:             done
        !          2679:         }
        !          2680: 
        !          2681:         test \$# -eq 0 && usage
        !          2682:         op="\$1"; shift
        !          2683: 
        !          2684:         case "\$op" in
        !          2685:             list-components)
        !          2686:                 test \$# -eq 0 || usage \$op
        !          2687:                 echo "$pp_components"
        !          2688:                 ;;
        !          2689:             list-services)
        !          2690:                 test \$# -eq 0 || usage \$op
        !          2691:                 echo "$pp_services"
        !          2692:                 ;;
        !          2693:             list-files)
        !          2694:                 test \$# -ge 1 || usage \$op
        !          2695:                 echo \${PP_PKGDESTDIR:-.}/$pkgname
        !          2696:                 ;;
        !          2697:             install)
        !          2698:                 test \$# -ge 1 || usage \$op
        !          2699:                 verbose /usr/sbin/swinstall -x verbose=0 \
        !          2700:                     -s \${PP_PKGDESTDIR:-\`pwd\`}/$pkgname \
        !          2701:                     \`cpt_to_tags "\$@"\`
        !          2702:                 ;;
        !          2703:             uninstall)
        !          2704:                 test \$# -ge 1 || usage \$op
        !          2705:                 verbose /usr/sbin/swremove -x verbose=0 \
        !          2706:                     \`cpt_to_tags "\$@"\`
        !          2707:                 ;;
        !          2708:             start|stop)
        !          2709:                 test \$# -ge 1 || usage \$op
        !          2710:                 ec=0
        !          2711:                 for svc
        !          2712:                 do
        !          2713:                     verbose /sbin/init.d/\$svc \$op
        !          2714:                     [ \$? -eq 4 -o \$? -eq 0 ] || ec=1
        !          2715:                 done
        !          2716:                 exit \$ec
        !          2717:                 ;;
        !          2718:             print-platform)
        !          2719:                echo "$platform"
        !          2720:                ;;
        !          2721:             *)
        !          2722:                 usage
        !          2723:                 ;;
        !          2724:         esac
        !          2725: .
        !          2726: }
        !          2727: 
        !          2728: pp_backend_sd_probe () {
        !          2729:     echo "${pp_sd_os_std}-${pp_sd_arch_std}"
        !          2730: }
        !          2731: 
        !          2732: pp_backend_sd_vas_platforms () {
        !          2733:     case "`pp_backend_sd_probe`" in
        !          2734:        hpux*-hppa) echo hpux-pa;;
        !          2735:        hpux*-ia64) echo hpux-ia64 hpux-pa;;
        !          2736:        *)          pp_die "unknown system `pp_backend_sd_probe`";;
        !          2737:     esac
        !          2738: }
        !          2739: 
        !          2740: pp_backend_sd_init_svc_vars () {
        !          2741:     :
        !          2742: }
        !          2743: pp_backend_sd_function () {
        !          2744:     case $1 in
        !          2745:         pp_mkgroup) cat <<'.';;
        !          2746:            /usr/sbin/groupmod "$1" 2>/dev/null ||
        !          2747:                /usr/sbin/groupadd "$1"
        !          2748: .
        !          2749:         pp_mkuser:depends) echo pp_mkgroup;;
        !          2750:         pp_mkuser) cat <<'.';;
        !          2751:            pp_mkgroup "${2:-$1}" || return 1
        !          2752:            /usr/sbin/useradd \
        !          2753:                -g "${2:-$1}" \
        !          2754:                -d "${3:-/nonexistent}" \
        !          2755:                -s "${4:-/bin/false}" \
        !          2756:                "$1"
        !          2757: .
        !          2758:         pp_havelib) cat <<'.';;
        !          2759:             for pp_tmp_dir in `echo /usr/lib${3:+:$3} | tr : ' '`; do
        !          2760:                 test -r "$pp_tmp_dir/lib$1${2:+.$2}.sl" && return 0
        !          2761:             done
        !          2762:             return 1
        !          2763: .
        !          2764:         *) false;;
        !          2765:     esac
        !          2766: }
        !          2767: 
        !          2768: pp_platforms="$pp_platforms solaris"
        !          2769: 
        !          2770: pp_backend_solaris_detect () {
        !          2771:        test x"$1" = x"SunOS"
        !          2772: }
        !          2773: 
        !          2774: pp_backend_solaris_init () {
        !          2775:        pp_solaris_category=
        !          2776:        pp_solaris_istates="s S 1 2 3"  # run-states when install is ok
        !          2777:        pp_solaris_rstates="s S 1 2 3"  # run-states when remove is ok
        !          2778:        pp_solaris_maxinst=
        !          2779:        pp_solaris_vendor=
        !          2780:        pp_solaris_pstamp=
        !          2781:        pp_solaris_copyright=
        !          2782:        pp_solaris_name=
        !          2783:        pp_solaris_desc=
        !          2784:        pp_solaris_package_arch=auto
        !          2785: 
        !          2786:         pp_solaris_detect_os
        !          2787:         pp_solaris_detect_arch
        !          2788: 
        !          2789:         pp_solaris_init_svc
        !          2790: 
        !          2791:         #-- readlink not reliably available on Solaris
        !          2792:        pp_readlink_fn=pp_ls_readlink
        !          2793: }
        !          2794: 
        !          2795: pp_solaris_detect_os () {
        !          2796:         typeset osrel
        !          2797: 
        !          2798:         osrel=`/usr/bin/uname -r`
        !          2799:         case "$osrel" in
        !          2800:            5.[0-6])    pp_solaris_os="sol2${osrel#5.}";;
        !          2801:            5.*)        pp_solaris_os="sol${osrel#5.}";;
        !          2802:         esac
        !          2803:         test -z "$pp_solaris_os" &&
        !          2804:              pp_warn "can't determine OS suffix from uname -r"
        !          2805: 
        !          2806: }
        !          2807: 
        !          2808: pp_solaris_detect_arch () {
        !          2809:        pp_solaris_arch=`/usr/bin/optisa amd64 sparcv9 i386 sparc`
        !          2810:        [ -z "$pp_solaris_arch" ] &&
        !          2811:            pp_error "can't determine processor architecture"
        !          2812:        case "$pp_solaris_arch" in
        !          2813:            amd64)   pp_solaris_arch_std=x86_64;;
        !          2814:            i386)    pp_solaris_arch_std=i386;;
        !          2815:            sparcv9) pp_solaris_arch_std=sparc64;;
        !          2816:            sparc)   pp_solaris_arch_std=sparc;;
        !          2817:            *)       pp_solaris_arch_std=unknown;;
        !          2818:        esac
        !          2819: }
        !          2820: 
        !          2821: pp_solaris_is_request_script_necessary () {
        !          2822:     typeset has_optional_services
        !          2823: 
        !          2824:     has_optional_services=no
        !          2825:     for _svc in $pp_services; do
        !          2826:        pp_load_service_vars $_svc
        !          2827:        if test "$optional" = "yes"; then
        !          2828:            has_optional_services=yes
        !          2829:        fi
        !          2830:     done
        !          2831: 
        !          2832:     # If the package has no optional services and only one component, don't
        !          2833:     # create a request script at all.
        !          2834:     if test "$has_optional_services" = "no" &&
        !          2835:        test `echo $pp_components | wc -w` -eq 1; then
        !          2836:        return 1 # no
        !          2837:     fi
        !          2838: 
        !          2839:     return 0 # yes
        !          2840: }
        !          2841: 
        !          2842: pp_solaris_request () {
        !          2843:     typeset _cmp _svc
        !          2844: 
        !          2845:     #-- The common part of the request script contains the ask() function
        !          2846:     #   and resets the CLASSES list to empty
        !          2847:     cat <<'.'
        !          2848:        trap 'exit 3' 15
        !          2849:        ask () {
        !          2850:           ans=`ckyorn -d "$1" \
        !          2851:                 -p "Do you want to $2"` \
        !          2852:             || exit $?
        !          2853:           case "$ans" in y*|Y*) return 0;; *) return 1;; esac
        !          2854:        }
        !          2855:        CLASSES=
        !          2856: .
        !          2857:     #-- each of our components adds itself to the CLASSES list
        !          2858:     for _cmp in $pp_components; do
        !          2859:       case "$_cmp" in
        !          2860:             run) :;;
        !          2861:             doc) echo 'ask y "install the documentation files" &&';;
        !          2862:             dev) echo 'ask y "install the development files" &&';;
        !          2863:             dbg) echo 'ask n "install the diagnostic files" &&';;
        !          2864:       esac
        !          2865:       echo '    CLASSES="$CLASSES '$_cmp'"'
        !          2866:     done
        !          2867: 
        !          2868:     #-- the request script writes the CLASSES var to its output
        !          2869:     cat <<'.'
        !          2870:        echo "CLASSES=$CLASSES" > $1
        !          2871: .
        !          2872: 
        !          2873:     if test -n "$pp_services"; then
        !          2874:         echo 'SERVICES='
        !          2875:         for _svc in $pp_services; do
        !          2876:            pp_load_service_vars $_svc
        !          2877:            if test "$enable" = "yes"; then
        !          2878:                _default_prompt=y
        !          2879:            else
        !          2880:                _default_prompt=n
        !          2881:            fi
        !          2882:            if test "$optional" = "yes"; then
        !          2883:                echo 'ask '$_default_prompt' "install '$_svc' service" &&'
        !          2884:            fi
        !          2885:             echo '    SERVICES="$SERVICES '$_svc'"'
        !          2886:         done
        !          2887:         echo 'echo "SERVICES=$SERVICES" >> $1'
        !          2888:     fi
        !          2889: 
        !          2890: }
        !          2891: 
        !          2892: pp_solaris_procedure () {
        !          2893:     cat <<.
        !          2894: 
        !          2895:         #-- $2 for $1 component of $name
        !          2896:         case " \$CLASSES " in *" $1 "*)
        !          2897: .
        !          2898:     cat
        !          2899:     cat <<.
        !          2900:         ;; esac
        !          2901: .
        !          2902: }
        !          2903: 
        !          2904: pp_solaris_depend () {
        !          2905:     typeset _name _vers
        !          2906:     while read _name _vers; do
        !          2907:        if test -n "$_name"; then
        !          2908:            echo "P $_name $_name"
        !          2909:            test -n "$_vers" && echo " $_vers"
        !          2910:        fi
        !          2911:     done
        !          2912: }
        !          2913: 
        !          2914: pp_solaris_space() {
        !          2915:     echo "$2:$3:$1" >> $pp_wrkdir/space.cumulative
        !          2916: }
        !          2917: 
        !          2918: pp_solaris_sum_space () {
        !          2919:     if test -s $pp_wrkdir/space.cumulative; then
        !          2920:         sort -t: +2 < $pp_wrkdir/space.cumulative |
        !          2921:         awk -F: 'NR==1{n=$3}{if($3==n){b+=$1;i+=$2}else{print n" "b" "i;b=$1;i=$2;n=$3}}END{print n" "b" "i}' > $pp_wrkdir/space
        !          2922:     fi
        !          2923: }
        !          2924: 
        !          2925: pp_solaris_proto () {
        !          2926:        typeset t m o g f p st
        !          2927:        typeset abi
        !          2928: 
        !          2929:        while read t m o g f p st; do
        !          2930:          if test x"$o" = x"-"; then
        !          2931:             o="root"
        !          2932:           fi
        !          2933:          if test x"$g" = x"-"; then
        !          2934:             g="bin"
        !          2935:           fi
        !          2936:          case "$t" in
        !          2937:            f) test x"$m" = x"-" && m=444
        !          2938:               case "$f" in
        !          2939:                *v*) echo "v $1 $p=$pp_destdir$p $m $o $g";;
        !          2940:                *)   echo "f $1 $p=$pp_destdir$p $m $o $g";;
        !          2941:               esac
        !          2942:               if test -r "$pp_destdir$p"; then
        !          2943:                  #-- Use file to record ABI types seen
        !          2944:                  case "`file "$pp_destdir$p"`" in
        !          2945:                    *"ELF 32"*80386*) abi=i386;;
        !          2946:                    *"ELF 64"*AMD*) abi=x86_64;;
        !          2947:                    *"ELF 32"*SPARC*) abi=sparc;;
        !          2948:                    *"ELF 64"*SPARC*) abi=sparc64;;
        !          2949:                    *) abi=;;
        !          2950:                  esac
        !          2951:                  if test -n "$abi"; then
        !          2952:                    pp_add_to_list pp_solaris_abis_seen $abi
        !          2953:                  fi
        !          2954:               fi
        !          2955:                ;;
        !          2956:            d) test x"$m" = x"-" && m=555
        !          2957:               echo "d $1 $p $m $o $g"
        !          2958:                ;;
        !          2959:            s) test x"$m" = x"-" && m=777
        !          2960:                test x"$m" = x"777" ||
        !          2961:                   pp_warn "$p: invalid mode $m for symlink, should be 777 or -"
        !          2962:               echo "s $1 $p=$st $m $o $g"
        !          2963:                ;;
        !          2964:          esac
        !          2965:        done
        !          2966: }
        !          2967: 
        !          2968: pp_backend_solaris () {
        !          2969:         typeset _cmp _svc _grp
        !          2970: 
        !          2971:        prototype=$pp_wrkdir/prototype
        !          2972:        : > $prototype
        !          2973: 
        !          2974:        pkginfo=$pp_wrkdir/pkginfo
        !          2975:        : > $pkginfo
        !          2976:        echo "i pkginfo=$pkginfo" >> $prototype
        !          2977: 
        !          2978:         case "${pp_solaris_name:-$name}" in
        !          2979:             [0-9]*)
        !          2980:                 pp_error "Package name '${pp_solaris_name:-$name}'" \
        !          2981:                         "cannot start with a number"
        !          2982:                 ;;
        !          2983:             ???????????????*)
        !          2984:                 pp_warn "Package name '${pp_solaris_name:-$name}'" \
        !          2985:                         "too long for Solaris 2.6 or 2.7 (max 9 characters)"
        !          2986:                 ;;
        !          2987:             ??????????*)
        !          2988:                 pp_warn "Package name '${pp_solaris_name:-$name}'" \
        !          2989:                         "too long for 2.7 Solaris (max 9 characters)"
        !          2990:                 ;;
        !          2991:         esac
        !          2992: 
        !          2993:         #-- generate the package info file
        !          2994:        echo "VERSION=$version" >> $pkginfo
        !          2995:        echo "PKG=${pp_solaris_name:-$name}" >> $pkginfo
        !          2996:        echo "CLASSES=$pp_components" >> $pkginfo
        !          2997:        echo "BASEDIR=/" >> $pkginfo
        !          2998:        echo "NAME=$name $version" >> $pkginfo
        !          2999:        echo "CATEGORY=${pp_solaris_category:-application}" >> $pkginfo
        !          3000: 
        !          3001:        desc="${pp_solaris_desc:-$description}"
        !          3002:        test -n "$desc" &&
        !          3003:          echo "DESC=$desc" >> $pkginfo
        !          3004: 
        !          3005:        test -n "$pp_solaris_rstates" &&
        !          3006:          echo "RSTATES=$pp_solaris_rstates" >> $pkginfo
        !          3007:        test -n "$pp_solaris_istates" &&
        !          3008:          echo "ISTATES=$pp_solaris_istates" >> $pkginfo
        !          3009:        test -n "$pp_solaris_maxinst" &&
        !          3010:          echo "MAXINST=$pp_solaris_maxinst" >> $pkginfo
        !          3011:        test -n "${pp_solaris_vendor:-$vendor}" &&
        !          3012:          echo "VENDOR=${pp_solaris_vendor:-$vendor}" >> $pkginfo
        !          3013:        test -n "$pp_solaris_pstamp" &&
        !          3014:          echo "PSTAMP=$pp_solaris_pstamp" >> $pkginfo
        !          3015: 
        !          3016:        if test -n "${pp_solaris_copyright:-$copyright}"; then
        !          3017:            echo "${pp_solaris_copyright:-$copyright}" > $pp_wrkdir/copyright
        !          3018:            echo "i copyright=$pp_wrkdir/copyright" >> $prototype
        !          3019:        fi
        !          3020: 
        !          3021:         #-- scripts to run before and after install
        !          3022:         : > $pp_wrkdir/postinstall
        !          3023:         : > $pp_wrkdir/preremove
        !          3024:        for _cmp in $pp_components; do
        !          3025:         #-- add the preinstall scripts in definition order
        !          3026:         if test -s $pp_wrkdir/%pre.$_cmp; then
        !          3027:             pp_solaris_procedure $_cmp preinst < $pp_wrkdir/%pre.$_cmp \
        !          3028:                 >> $pp_wrkdir/preinstall
        !          3029:         fi
        !          3030:         #-- add the postinstall scripts in definition order
        !          3031:         if test -s $pp_wrkdir/%post.$_cmp; then
        !          3032:             pp_solaris_procedure $_cmp postinst < $pp_wrkdir/%post.$_cmp \
        !          3033:                 >> $pp_wrkdir/postinstall
        !          3034:         fi
        !          3035:         #-- add the preremove rules in reverse definition order
        !          3036:         if test -s $pp_wrkdir/%preun.$_cmp; then
        !          3037:             pp_solaris_procedure $_cmp preremove < $pp_wrkdir/%preun.$_cmp |
        !          3038:                     pp_prepend $pp_wrkdir/preremove
        !          3039:         fi
        !          3040:         #-- Add the check script in definition order
        !          3041:         if test -s $pp_wrkdir/%check.$_cmp; then
        !          3042:             pp_solaris_procedure $_cmp checkinstall \
        !          3043:                         < $pp_wrkdir/%check.$_cmp \
        !          3044:                        >> $pp_wrkdir/checkinstall
        !          3045:         fi
        !          3046:         #-- All dependencies are merged together for Solaris pkgs
        !          3047:         test -s $pp_wrkdir/%depend.$_cmp &&
        !          3048:               pp_solaris_depend < $pp_wrkdir/%depend.$_cmp > $pp_wrkdir/depend
        !          3049:        done
        !          3050: 
        !          3051: 
        !          3052:        if pp_solaris_is_request_script_necessary; then
        !          3053:            pp_solaris_request > $pp_wrkdir/request
        !          3054:        fi
        !          3055: 
        !          3056:         test -n "$pp_services" &&
        !          3057:             for _svc in $pp_services; do
        !          3058:                 pp_load_service_vars $_svc
        !          3059:                 pp_solaris_smf $_svc
        !          3060:                 pp_solaris_make_service $_svc
        !          3061:                 pp_solaris_install_service $_svc | pp_prepend $pp_wrkdir/postinstall
        !          3062:                 pp_solaris_remove_service $_svc | pp_prepend $pp_wrkdir/preremove
        !          3063:                 unset pp_svc_xml_file
        !          3064:             done
        !          3065: 
        !          3066:         test -n "$pp_service_groups" &&
        !          3067:            for _grp in $pp_service_groups; do
        !          3068:                pp_solaris_make_service_group \
        !          3069:                    $_grp "`pp_service_get_svc_group $_grp`"
        !          3070:            done
        !          3071: 
        !          3072:         #-- if installf was used; we need to indicate a termination
        !          3073:         grep installf $pp_wrkdir/postinstall >/dev/null &&
        !          3074:             echo 'installf -f $PKGINST' >> $pp_wrkdir/postinstall
        !          3075: 
        !          3076:         pp_solaris_sum_space
        !          3077: 
        !          3078:         # NB: pkginfo and copyright are added earlier
        !          3079:         for f in compver depend space checkinstall \
        !          3080:                  preinstall request postinstall \
        !          3081:                  preremove postremove; do
        !          3082:             if test -s $pp_wrkdir/$f; then
        !          3083:                case $f in
        !          3084:                    *install|*remove|request)
        !          3085:                        # turn scripts into a proper shell scripts
        !          3086:                        mv $pp_wrkdir/$f $pp_wrkdir/$f.tmp
        !          3087:                        { echo "#!/bin/sh";
        !          3088:                          echo "# $f script for ${pp_solaris_name:-$name}-$version"
        !          3089:                          cat $pp_wrkdir/$f.tmp
        !          3090:                          echo "exit 0"; } > $pp_wrkdir/$f
        !          3091:                        chmod +x $pp_wrkdir/$f
        !          3092:                        rm -f $pp_wrkdir/$f.tmp
        !          3093:                        ;;
        !          3094:                esac
        !          3095:                 if $pp_opt_debug; then
        !          3096:                     pp_debug "contents of $f:"
        !          3097:                     cat $pp_wrkdir/$f >&2
        !          3098:                 fi
        !          3099:                 echo "i $f=$pp_wrkdir/$f" >> $prototype
        !          3100:             fi
        !          3101:         done
        !          3102: 
        !          3103:         #-- create the prototype file which lists the files to install
        !          3104:         # do this as late as possible because files could be added
        !          3105:        pp_solaris_abis_seen=
        !          3106:        for _cmp in $pp_components; do
        !          3107:          pp_solaris_proto $_cmp < $pp_wrkdir/%files.$_cmp
        !          3108:        done >> $prototype
        !          3109: 
        !          3110:        if test x"$pp_solaris_package_arch" = x"auto"; then
        !          3111:            if pp_contains "$pp_solaris_abis_seen" sparc64; then
        !          3112:                pp_solaris_package_arch_std="sparc64"
        !          3113:                echo "ARCH=sparcv9" >> $pkginfo
        !          3114:            elif pp_contains "$pp_solaris_abis_seen" sparc; then
        !          3115:                pp_solaris_package_arch_std="sparc"
        !          3116:                echo "ARCH=sparc" >> $pkginfo
        !          3117:            elif pp_contains "$pp_solaris_abis_seen" x86_64; then
        !          3118:                pp_solaris_package_arch_std="x86_64"
        !          3119:                echo "ARCH=amd64" >> $pkginfo
        !          3120:            elif pp_contains "$pp_solaris_abis_seen" i386; then
        !          3121:                pp_solaris_package_arch_std="i386"
        !          3122:                echo "ARCH=i386" >> $pkginfo
        !          3123:            else
        !          3124:                pp_warn "No ELF files found: not supplying an ARCH type"
        !          3125:                pp_solaris_package_arch_std="noarch"
        !          3126:            fi
        !          3127:        else
        !          3128:            pp_solaris_package_arch_std="$pp_solaris_package_arch"
        !          3129:            echo "ARCH=$pp_solaris_package_arch" >> $pkginfo
        !          3130:        fi
        !          3131: 
        !          3132:        mkdir $pp_wrkdir/pkg
        !          3133: 
        !          3134:        . $pp_wrkdir/%fixup
        !          3135: 
        !          3136: if $pp_opt_debug; then
        !          3137:   echo "$pkginfo::"; cat $pkginfo
        !          3138:   echo "$prototype::"; cat $prototype
        !          3139: fi >&2
        !          3140: 
        !          3141:        pkgmk -d $pp_wrkdir/pkg -f $prototype \
        !          3142:                || { error "pkgmk failed"; return; }
        !          3143:        pkgtrans -s $pp_wrkdir/pkg \
        !          3144:                $pp_wrkdir/`pp_backend_solaris_names` \
        !          3145:                 ${pp_solaris_name:-$name} \
        !          3146:                || { error "pkgtrans failed"; return; }
        !          3147: }
        !          3148: 
        !          3149: pp_backend_solaris_cleanup () {
        !          3150:        :
        !          3151: }
        !          3152: 
        !          3153: pp_backend_solaris_names () {
        !          3154:        echo ${pp_solaris_name:-$name}-$version-${pp_solaris_package_arch_std:-$pp_solaris_arch}.pkg
        !          3155: }
        !          3156: 
        !          3157: pp_backend_solaris_install_script () {
        !          3158:         typeset pkgname platform
        !          3159: 
        !          3160:        platform="${pp_solaris_os:-solaris}-${pp_solaris_package_arch_std:-$pp_solaris_arch}"
        !          3161: 
        !          3162:         echo "#! /sbin/sh"
        !          3163:         pp_install_script_common
        !          3164:         pkgname=`pp_backend_solaris_names`
        !          3165: 
        !          3166:         cat <<.
        !          3167:             tmpnocheck=/tmp/nocheck\$\$
        !          3168:             tmpresponse=/tmp/response\$\$
        !          3169:             trap 'rm -f \$tmpnocheck \$tmpresponse' 0
        !          3170: 
        !          3171:             make_tmpfiles () {
        !          3172:                 cat <<-.. > \$tmpresponse
        !          3173:                         CLASSES=\$*
        !          3174:                         SERVICES=$pp_services
        !          3175: ..
        !          3176:                 cat <<-.. > \$tmpnocheck
        !          3177:                        mail=
        !          3178:                        instance=overwrite
        !          3179:                        partial=nocheck
        !          3180:                        runlevel=nocheck
        !          3181:                        idepend=nocheck
        !          3182:                        rdepend=nocheck
        !          3183:                        space=nocheck
        !          3184:                        setuid=nocheck
        !          3185:                        conflict=nocheck
        !          3186:                        action=nocheck
        !          3187:                        basedir=default
        !          3188: ..
        !          3189:             }
        !          3190: 
        !          3191:             test \$# -eq 0 && usage
        !          3192:             op="\$1"; shift
        !          3193: 
        !          3194:             case "\$op" in
        !          3195:                 list-components)
        !          3196:                     test \$# -eq 0 || usage \$op
        !          3197:                     echo "$pp_components"
        !          3198:                     ;;
        !          3199:                 list-services)
        !          3200:                     test \$# -eq 0 || usage \$op
        !          3201:                     echo "$pp_services"
        !          3202:                     ;;
        !          3203:                 list-files)
        !          3204:                     test \$# -ge 1 || usage \$op
        !          3205:                     echo \${PP_PKGDESTDIR:-.}/$pkgname
        !          3206:                     ;;
        !          3207:                 install)
        !          3208:                     test \$# -ge 1 || usage \$op
        !          3209:                     make_tmpfiles "\$@"
        !          3210:                     verbose /usr/sbin/pkgadd -n -d \${PP_PKGDESTDIR:-.}/$pkgname \
        !          3211:                         -r \$tmpresponse \
        !          3212:                         -a \$tmpnocheck \
        !          3213:                         ${pp_solaris_name:-$name}
        !          3214:                     ;;
        !          3215:                 uninstall)
        !          3216:                     test \$# -ge 1 || usage \$op
        !          3217:                     make_tmpfiles "\$@"
        !          3218:                     verbose /usr/sbin/pkgrm -n \
        !          3219:                         -a \$tmpnocheck \
        !          3220:                         ${pp_solaris_name:-$name}
        !          3221:                     ;;
        !          3222:                 start|stop)
        !          3223:                     test \$# -ge 1 || usage \$op
        !          3224:                     ec=0
        !          3225:                     for svc
        !          3226:                     do
        !          3227:                         verbose /etc/init.d/\$svc \$op || ec=1
        !          3228:                     done
        !          3229:                     exit \$ec
        !          3230:                     ;;
        !          3231:                 print-platform)
        !          3232:                    echo "$platform"
        !          3233:                    ;;
        !          3234:                 *)
        !          3235:                     usage
        !          3236:                     ;;
        !          3237:             esac
        !          3238: .
        !          3239: }
        !          3240: 
        !          3241: pp_solaris_dynlib_depend () {
        !          3242:        xargs ldd 2>/dev/null |
        !          3243:        sed -e '/^[^    ]*:$/d' -e 's,.*=>[      ]*,,' -e 's,^[         ]*,,' |
        !          3244:        sort -u |
        !          3245:        grep -v '^/usr/platform/' | (
        !          3246:          set -- ""; shift
        !          3247:          while read p; do
        !          3248:            set -- "$@" -p "$p"
        !          3249:            if [ $# -gt 32 ]; then
        !          3250:                echo "$# is $#" >&2
        !          3251:                pkgchk -l "$@"
        !          3252:                set -- ""; shift
        !          3253:            fi
        !          3254:          done
        !          3255:          [ $# -gt 0 ] && pkgchk -l "$@"
        !          3256:        )|
        !          3257:        awk '/^Current status:/{p=0} p==1 {print $1} /^Referenced by/ {p=1}' |
        !          3258:        sort -u |
        !          3259:        xargs -l32 pkginfo -x |
        !          3260:        awk 'NR % 2 == 1 { name=$1; } NR%2 == 0 { print name, $2 }'
        !          3261: }
        !          3262: 
        !          3263: pp_solaris_add_dynlib_depends () {
        !          3264:     typeset tmp
        !          3265:     tmp=$pp_wrkdir/tmp.dynlib
        !          3266: 
        !          3267:     for _cmp in $pp_components; do
        !          3268:        awk '{print destdir $6}' destdir="$pp_destdir" \
        !          3269:                < $pp_wrkdir/%files.$_cmp |
        !          3270:        pp_solaris_dynlib_depend > $tmp
        !          3271:        if test -s $tmp; then
        !          3272:            cat $tmp >> $pp_wrkdir/%depend.$_cmp
        !          3273:        fi
        !          3274:        rm -f $tmp
        !          3275:     done
        !          3276: }
        !          3277: 
        !          3278: pp_backend_solaris_probe () {
        !          3279:     echo "${pp_solaris_os}-${pp_solaris_arch_std}"
        !          3280: }
        !          3281: 
        !          3282: pp_backend_solaris_vas_platforms () {
        !          3283:     case `pp_backend_solaris_probe` in
        !          3284:        sol10-sparc* | sol9-sparc* | sol8-sparc*)
        !          3285:                        echo solaris8-sparc solaris7-sparc solaris26-sparc;;
        !          3286:        sol7-sparc*)    echo                solaris7-sparc solaris26-sparc;;
        !          3287:        sol26-sparc*)   echo                               solaris26-sparc;;
        !          3288:        sol8-*86)       echo solaris8-x86;;
        !          3289:        sol10-*86 | sol10-x86_64)
        !          3290:                        echo solaris10-x64 solaris8-x86;;
        !          3291:        *)              pp_die "unknown system `pp_backend_solaris_probe`";;
        !          3292:     esac
        !          3293: }
        !          3294: pp_backend_solaris_function() {
        !          3295:     case $1 in
        !          3296:         pp_mkgroup) cat<<'.';;
        !          3297:            /usr/sbin/groupmod "$1" 2>/dev/null && return 0
        !          3298:             /usr/sbin/groupadd "$1"
        !          3299: .
        !          3300:         pp_mkuser:depends) echo pp_mkgroup;;
        !          3301:         pp_mkuser) cat<<'.';;
        !          3302:            id "$1" >/dev/null 2>/dev/null && return 0
        !          3303:            pp_mkgroup "${2:-$1}" || return 1
        !          3304:            /usr/sbin/useradd \
        !          3305:                -g "${2:-$1}" \
        !          3306:                -d "${3:-/nonexistent}" \
        !          3307:                -s "${4:-/bin/false}" \
        !          3308:                "$1"
        !          3309: .
        !          3310:     *) false;;
        !          3311:     esac
        !          3312: }
        !          3313: 
        !          3314: pp_backend_solaris_init_svc_vars () {
        !          3315:     _smf_category=${pp_solaris_smf_category:-application}
        !          3316:     _smf_method_envvar_name=${smf_method_envvar_name:-"PP_SMF_SERVICE"}
        !          3317:     pp_solaris_service_shell=/sbin/sh
        !          3318: }
        !          3319: 
        !          3320: pp_solaris_init_svc () {
        !          3321:     smf_version=1
        !          3322:     smf_type=service
        !          3323:     solaris_user=
        !          3324:     solaris_stop_signal=
        !          3325:     solaris_sysv_init_start=S70     # invocation order for start scripts
        !          3326:     solaris_sysv_init_kill=K30      # invocation order for kill scripts
        !          3327:     solaris_sysv_init_start_states="2" # states to install start link
        !          3328:     solaris_sysv_init_kill_states="S 0 1"  # states to install kill link
        !          3329: 
        !          3330:     #
        !          3331:     # To have the service be installed to start automatically,
        !          3332:     #   %service foo
        !          3333:     #   solaris_sysv_init_start_states="S 0 1 2"
        !          3334:     #
        !          3335: }
        !          3336: 
        !          3337: pp_solaris_smf () {
        !          3338:     typeset f _pp_solaris_service_script svc _pp_solaris_manpage
        !          3339: 
        !          3340:     pp_solaris_name=${pp_solaris_name:-$name}
        !          3341:     pp_solaris_manpath=${pp_solaris_manpath:-"/usr/share/man"}
        !          3342:     smf_start_timeout=${smf_start_timeout:-60}
        !          3343:     smf_stop_timeout=${smf_stop_timeout:-60}
        !          3344:     smf_restart_timeout=${smf_restart_timeout:-60}
        !          3345: 
        !          3346:     svc=${pp_solaris_smf_service_name:-$1}
        !          3347:     _pp_solaris_service_script=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
        !          3348:     _pp_solaris_manpage=${pp_solaris_manpage:-$pp_solaris_smf_service_name}
        !          3349: 
        !          3350:     if [ -z $pp_svc_xml_file ]; then
        !          3351:         pp_svc_xml_file="/var/svc/manifest/$_smf_category/$svc.xml"
        !          3352:         echo "## Generating the smf service manifest file for $pp_svc_xml_file"
        !          3353:     else
        !          3354:         echo "## SMF service manifest file already defined at $pp_svc_xml_file"
        !          3355:         if [ -z $pp_solaris_smf_service_name ] || [ -z $pp_solaris_smf_category ] || [ -z $pp_solaris_service_script ] || [ -z $smf_method_envvar_name ]; then
        !          3356:           pp_error "All required variables are not set.\n"\
        !          3357:                    "When using a custom manifest file all of the following variables must be set:\n"\
        !          3358:                    "pp_solaris_smf_service_name, pp_solaris_smf_category, pp_solaris_service_script and smf_method_envvar_name.\n\n"\
        !          3359:                    "Example:\n"\
        !          3360:                    " \$pp_solaris_smf_category=application\n"\
        !          3361:                    " \$pp_solaris_smf_service_name=pp\n\n"\
        !          3362:                    "  <service name='application/pp' type='service' version='1'>\n\n"\
        !          3363:                    "Example:\n"\
        !          3364:                    " \$pp_solaris_service_script=/etc/init.d/pp\n\n"\
        !          3365:                    "  <exec_method type='method' name='start' exec='/etc/init.d/pp' />\n\n"\
        !          3366:                    "Example:\n"\
        !          3367:                    " \$smf_method_envvar_name=PP_SMF_SERVICE\n\n"\
        !          3368:                    "  <method_environment>\n"\
        !          3369:                    "    <envvar name='PP_SMF_SERVICE' value='1'/>\n"\
        !          3370:                    "  </method_environment>\n"
        !          3371: 
        !          3372:           return 1
        !          3373:         fi
        !          3374:         return 0
        !          3375:     fi
        !          3376: 
        !          3377:     f=$pp_svc_xml_file
        !          3378:     pp_add_file_if_missing $f ||
        !          3379:         return 0
        !          3380: 
        !          3381:     _pp_solaris_smf_dependencies="
        !          3382:           <dependency name='pp_local_filesystems'
        !          3383:                 grouping='require_all'
        !          3384:                 restart_on='none'
        !          3385:                 type='service'>
        !          3386:                 <service_fmri value='svc:/system/filesystem/local'/>
        !          3387:           </dependency>
        !          3388: 
        !          3389:           <dependency name='pp_single-user'
        !          3390:                 grouping='require_all'
        !          3391:                 restart_on='none'
        !          3392:                 type='service'>
        !          3393:                 <service_fmri value='svc:/milestone/single-user' />
        !          3394:           </dependency>
        !          3395: "
        !          3396:     _pp_solaris_smf_dependencies=${pp_solaris_smf_dependencies:-$_pp_solaris_smf_dependencies}
        !          3397: 
        !          3398:     cat <<-. >$pp_destdir$f
        !          3399: <?xml version="1.0"?>
        !          3400: <!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
        !          3401: <!--
        !          3402:        $copyright
        !          3403:         Generated by PolyPackage $pp_version
        !          3404: -->
        !          3405: 
        !          3406:     <service_bundle type='manifest' name='${pp_solaris_name}:${svc}' >
        !          3407:           <service name='$_smf_category/$svc'
        !          3408:                 type='$smf_type'
        !          3409:                 version='$smf_version'>
        !          3410: 
        !          3411:           <create_default_instance enabled='false'/>
        !          3412: 
        !          3413:           <single_instance />
        !          3414: 
        !          3415:           $_pp_solaris_smf_dependencies
        !          3416: 
        !          3417:           $pp_solaris_smf_additional_dependencies
        !          3418: 
        !          3419:           <method_context>
        !          3420:                 <method_credential user='${solaris_user:-$user}' />
        !          3421:                 <method_environment>
        !          3422:                     <envvar name='$_smf_method_envvar_name' value='1'/>
        !          3423:                 </method_environment>
        !          3424:           </method_context>
        !          3425: 
        !          3426:           <exec_method type='method' name='start'
        !          3427:                 exec='$_pp_solaris_service_script start'
        !          3428:                 timeout_seconds='$smf_start_timeout' />
        !          3429: 
        !          3430:           <exec_method type='method' name='stop'
        !          3431:                 exec='$_pp_solaris_service_script stop'
        !          3432:                 timeout_seconds='$smf_stop_timeout' />
        !          3433: 
        !          3434:           <exec_method type='method' name='restart'
        !          3435:                 exec='$_pp_solaris_service_script restart'
        !          3436:                 timeout_seconds='$smf_restart_timeout' />
        !          3437: 
        !          3438:           <template>
        !          3439:               <common_name>
        !          3440:                   <loctext xml:lang='C'>$description</loctext>
        !          3441:               </common_name>
        !          3442:               <documentation>
        !          3443:                   <manpage title='$pp_solaris_manpage' section='1' manpath='$pp_solaris_manpath'/>
        !          3444:               </documentation>
        !          3445:           </template>
        !          3446:         </service>
        !          3447:     </service_bundle>
        !          3448: .
        !          3449: }
        !          3450: 
        !          3451: pp_solaris_make_service_group () {
        !          3452:     typeset group out file svcs svc
        !          3453: 
        !          3454:     group="$1"
        !          3455:     svcs="$2"
        !          3456:     file="/etc/init.d/$group"
        !          3457:     out="$pp_destdir$file"
        !          3458: 
        !          3459:     #-- return if the script is supplued already
        !          3460:     pp_add_file_if_missing "$file" run 755 || return 0
        !          3461: 
        !          3462:     echo "#! /sbin/sh" > $out
        !          3463:     echo "# polypkg service group script for these services:" >> $out
        !          3464:     echo "svcs=\"$svcs\"" >> $out
        !          3465: 
        !          3466:     cat <<'.' >>$out
        !          3467: 
        !          3468:        #-- starts services in order.. stops them all if any break
        !          3469:        pp_start () {
        !          3470:            undo=
        !          3471:            for svc in $svcs; do
        !          3472:                if /etc/init.d/$svc start; then
        !          3473:                    undo="$svc $undo"
        !          3474:                else
        !          3475:                    if test -n "$undo"; then
        !          3476:                        for svc in $undo; do
        !          3477:                           /etc/init.d/$svc stop
        !          3478:                        done
        !          3479:                        return 1
        !          3480:                    fi
        !          3481:                fi
        !          3482:            done
        !          3483:            return 0
        !          3484:        }
        !          3485: 
        !          3486:        #-- stops services in reverse
        !          3487:        pp_stop () {
        !          3488:            reverse=
        !          3489:            for svc in $svcs; do
        !          3490:                reverse="$svc $reverse"
        !          3491:            done
        !          3492:            rc=0
        !          3493:            for svc in $reverse; do
        !          3494:                /etc/init.d/$svc stop || rc=$?
        !          3495:            done
        !          3496:            return $rc
        !          3497:        }
        !          3498: 
        !          3499:        #-- returns true only if all services return true status
        !          3500:        pp_status () {
        !          3501:            rc=0
        !          3502:            for svc in $svcs; do
        !          3503:                /etc/init.d/$svc status || rc=$?
        !          3504:            done
        !          3505:            return $rc
        !          3506:        }
        !          3507: 
        !          3508:         case "$1" in
        !          3509:             start)   pp_start;;
        !          3510:             stop)    pp_stop;;
        !          3511:             status)  pp_status;;
        !          3512:             restart) pp_stop && pp_start;;
        !          3513:             *)       echo "usage: $0 {start|stop|restart|status}" >&2; exit 1;;
        !          3514:         esac
        !          3515: .
        !          3516: }
        !          3517: 
        !          3518: pp_solaris_make_service () {
        !          3519:     typeset file out _cmd svc
        !          3520: 
        !          3521:     svc="${pp_solaris_smf_service_name:-$1}"
        !          3522:     file=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
        !          3523:     out="$pp_destdir$file"
        !          3524: 
        !          3525:     #-- return if we don't need to create the init script
        !          3526:     pp_add_file_if_missing "$file" run 755 ||
        !          3527:         return 0
        !          3528: 
        !          3529:     echo "#! /sbin/sh" >$out
        !          3530:     echo "#-- This service init file generated by polypkg" >>$out
        !          3531: 
        !          3532:     #-- Start SMF integration.
        !          3533:     if [ -n "$pp_svc_xml_file" ] ; then
        !          3534:         cat <<_EOF >>$out
        !          3535: if [ -x /usr/sbin/svcadm ] && [ "x\$1" != "xstatus" ] && [ "t\$$_smf_method_envvar_name" = "t" ] ; then
        !          3536:     case "\$1" in
        !          3537:         start)
        !          3538:             echo "starting $svc"
        !          3539:             /usr/sbin/svcadm clear svc:/$_smf_category/$svc:default >/dev/null 2>&1
        !          3540:             /usr/sbin/svcadm enable -s $_smf_category/$svc
        !          3541:             RESULT=\$?
        !          3542:             if [ "\$RESULT" -ne 0 ] ; then
        !          3543:                 echo "Error \$RESULT starting $svc"
        !          3544:                 fi
        !          3545:             ;;
        !          3546:         stop)
        !          3547:             echo "stopping $svc"
        !          3548:             /usr/sbin/svcadm disable -ts $_smf_category/$svc
        !          3549:             ;;
        !          3550:         restart)
        !          3551:             echo "restarting $svc"
        !          3552:             /usr/sbin/svcadm disable -ts $_smf_category/$svc
        !          3553:             /usr/sbin/svcadm clear svc:/$_smf_category/$svc:default >/dev/null 2>&1
        !          3554:             /usr/sbin/svcadm enable -s $_smf_category/$svc
        !          3555:             RESULT=\$?
        !          3556:             if [ "\$RESULT" -ne 0 ] ; then
        !          3557:                 echo "Error \$RESULT starting $svc"
        !          3558:                     fi
        !          3559:                     ;;
        !          3560:         *)
        !          3561:             echo "Usage: $file {start|stop|restart|status}"
        !          3562:             exit 1
        !          3563:     esac
        !          3564:     exit 0
        !          3565: fi
        !          3566: _EOF
        !          3567:     fi
        !          3568: 
        !          3569:     #-- construct a start command that builds a pid file as needed
        !          3570:     #   and forks the daemon
        !          3571:     _cmd="$cmd";
        !          3572:     if test -z "$pidfile"; then
        !          3573:        # The service does not define a pidfile, so we have to make
        !          3574:        # our own up. On Solaris systems where there is no /var/run
        !          3575:        # we must use /tmp to guarantee the pid files are removed after
        !          3576:        # a system crash.
        !          3577:        cat <<. >>$out
        !          3578:            pp_piddir="/var/run"
        !          3579:            test -d "\$pp_piddir/." || pp_piddir="/tmp"
        !          3580:            pidfile="\$pp_piddir/$svc.pid"
        !          3581: .
        !          3582:         _cmd="$cmd & echo \$! > \$pidfile"
        !          3583:     else
        !          3584:        # The service is able to write its own PID file
        !          3585:        cat <<. >>$out
        !          3586:            pidfile="$pidfile"
        !          3587: .
        !          3588:     fi
        !          3589: 
        !          3590:     if test "${user:-root}" != "root"; then
        !          3591:         _cmd="su $user -c exec $_cmd";
        !          3592:     fi
        !          3593: 
        !          3594:     cat <<. >>$out
        !          3595:        stop_signal="${stop_signal:-TERM}"
        !          3596:        svc="${svc}"
        !          3597: 
        !          3598:         # generated command to run $svc as a daemon process
        !          3599:         pp_exec () { $_cmd; }
        !          3600: .
        !          3601: 
        !          3602:     #-- write the invariant section of the init script
        !          3603:     cat <<'.' >>$out
        !          3604: 
        !          3605:         # returns true if $svc is running
        !          3606:         pp_running () {
        !          3607:             test -r "$pidfile" &&
        !          3608:             read pid junk < "$pidfile" &&
        !          3609:             test ${pid:-0} -gt 1 &&
        !          3610:             kill -0 "$pid" 2>/dev/null
        !          3611:         }
        !          3612: 
        !          3613:         # prints a message describing $svc's running state
        !          3614:         pp_status () {
        !          3615:             if pp_running; then
        !          3616:                 echo "service $svc is running (pid $pid)"
        !          3617:                 return 0
        !          3618:             elif test -f "$pidfile"; then
        !          3619:                 echo "service $svc is not running, but pid file exists"
        !          3620:                 return 2
        !          3621:             else
        !          3622:                 echo "service $svc is not running"
        !          3623:                 return 1
        !          3624:             fi
        !          3625:         }
        !          3626: 
        !          3627:         # starts $svc
        !          3628:         pp_start () {
        !          3629:             if pp_running; then
        !          3630:                 echo "service $svc already running" >&2
        !          3631:                 return 0
        !          3632:             fi
        !          3633:             echo "starting $svc... \c"
        !          3634:             if pp_exec; then
        !          3635:                 echo "done."
        !          3636:             else
        !          3637:                 echo "ERROR."
        !          3638:                 exit 1
        !          3639:             fi
        !          3640:         }
        !          3641: 
        !          3642:         # stops $svc
        !          3643:         pp_stop () {
        !          3644:             if pp_running; then
        !          3645:                 echo "stopping $svc... \c"
        !          3646:                 if kill -$stop_signal $pid; then
        !          3647:                     rm -f "$pidfile"
        !          3648:                     echo "done."
        !          3649:                 else
        !          3650:                     echo "ERROR."
        !          3651:                     return 1
        !          3652:                 fi
        !          3653:             else
        !          3654:                 echo "service $svc already stopped" >&2
        !          3655:                 return 0
        !          3656:             fi
        !          3657:         }
        !          3658: 
        !          3659:         umask 022
        !          3660:         case "$1" in
        !          3661:             start)   pp_start;;
        !          3662:             stop)    pp_stop;;
        !          3663:             status)  pp_status;;
        !          3664:             restart) pp_stop && pp_start;;
        !          3665:             *)       echo "usage: $0 {start|stop|restart|status}" >&2; exit 1;;
        !          3666:         esac
        !          3667: .
        !          3668: }
        !          3669: 
        !          3670: pp_solaris_remove_service () {
        !          3671:     typeset file svc
        !          3672: 
        !          3673:     svc="${pp_solaris_smf_service_name:-$1}"
        !          3674:     file=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
        !          3675: 
        !          3676:     echo '
        !          3677: '$file' stop >/dev/null 2>/dev/null
        !          3678: if [ "x${PKG_INSTALL_ROOT}" = 'x' ]; then
        !          3679:     if [ -x /usr/sbin/svcadm ] ; then
        !          3680:         # Likely un-needed, but just in case.
        !          3681:         /usr/sbin/svcadm disable -s '$svc' 2>/dev/null
        !          3682:         /usr/sbin/svccfg delete '$svc' 2>/dev/null
        !          3683:     fi
        !          3684: fi
        !          3685:     '
        !          3686: }
        !          3687: 
        !          3688: pp_solaris_install_service () {
        !          3689:     typeset s k l file svc
        !          3690: 
        !          3691:     svc="${pp_solaris_smf_service_name:-$1}"
        !          3692:     file=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
        !          3693: 
        !          3694:     s="${solaris_sysv_init_start}$svc"
        !          3695:     k="${solaris_sysv_init_kill}$svc"
        !          3696: 
        !          3697:     echo '
        !          3698: if [ "x${PKG_INSTALL_ROOT}" != "x" ]; then
        !          3699:   if [ -x ${PKG_INSTALL_ROOT}/usr/sbin/svcadm ]; then
        !          3700:     echo "/usr/sbin/svccfg import '$pp_svc_xml_file' 2>/dev/null" >> ${PKG_INSTALL_ROOT}/var/svc/profile/upgrade
        !          3701:   else'
        !          3702:     test -n "${solaris_sysv_init_start_states}" &&
        !          3703:         for state in ${solaris_sysv_init_start_states}; do
        !          3704:             l="/etc/rc$state.d/$s"
        !          3705:             echo "echo '$l'"
        !          3706:             echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
        !          3707:             pp_solaris_space /etc/rc$state.d 0 1
        !          3708:         done
        !          3709:     test -n "${solaris_sysv_init_kill_states}" &&
        !          3710:         for state in ${solaris_sysv_init_kill_states}; do
        !          3711:             l="/etc/rc$state.d/$k"
        !          3712:             echo "echo '$l'"
        !          3713:             echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
        !          3714:             pp_solaris_space /etc/rc$state.d 0 1
        !          3715:         done
        !          3716:     echo '
        !          3717:   fi
        !          3718: else
        !          3719:     if [ -x /usr/sbin/svcadm ]; then
        !          3720:         echo "Registering '$svc' with SMF"
        !          3721:         /usr/sbin/svcadm disable -s '$svc' 2>/dev/null
        !          3722:         /usr/sbin/svccfg delete '$svc' 2>/dev/null
        !          3723:         /usr/sbin/svccfg import '$pp_svc_xml_file'
        !          3724:     else'
        !          3725:     test -n "${solaris_sysv_init_start_states}" &&
        !          3726:         for state in ${solaris_sysv_init_start_states}; do
        !          3727:             l="/etc/rc$state.d/$s"
        !          3728:             echo "echo '$l'"
        !          3729:             echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
        !          3730:             pp_solaris_space /etc/rc$state.d 0 1
        !          3731:         done
        !          3732:     test -n "${solaris_sysv_init_kill_states}" &&
        !          3733:         for state in ${solaris_sysv_init_kill_states}; do
        !          3734:             l="/etc/rc$state.d/$k"
        !          3735:             echo "echo '$l'"
        !          3736:             echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
        !          3737:             pp_solaris_space /etc/rc$state.d 0 1
        !          3738:         done
        !          3739:     echo '
        !          3740:     fi
        !          3741: fi'
        !          3742: }
        !          3743: 
        !          3744: pp_platforms="$pp_platforms deb"
        !          3745: 
        !          3746: pp_backend_deb_detect () {
        !          3747:     test -f /etc/debian_version
        !          3748: }
        !          3749: 
        !          3750: pp_deb_cmp_full_name () {
        !          3751:     local prefix
        !          3752:     prefix="${pp_deb_name:-$name}"
        !          3753:     case "$1" in
        !          3754:         run) echo "${prefix}" ;;
        !          3755:         dbg) echo "${prefix}-${pp_deb_dbg_pkgname}";;
        !          3756:         dev) echo "${prefix}-${pp_deb_dev_pkgname}";;
        !          3757:         doc) echo "${prefix}-${pp_deb_doc_pkgname}";;
        !          3758:         *)   pp_error "unknown component '$1'";
        !          3759:     esac
        !          3760: }
        !          3761: 
        !          3762: pp_backend_deb_init () {
        !          3763:     pp_deb_dpkg_version="2.0"
        !          3764:     pp_deb_name=
        !          3765:     pp_deb_version=
        !          3766:     pp_deb_release=
        !          3767:     pp_deb_arch=
        !          3768:     pp_deb_arch_std=
        !          3769:     pp_deb_maintainer=support@quest.com
        !          3770:     pp_deb_copyright=
        !          3771:     pp_deb_distro=
        !          3772:     pp_deb_control_description=
        !          3773:     pp_deb_summary=
        !          3774:     pp_deb_description=
        !          3775:     pp_deb_dbg_pkgname="dbg"
        !          3776:     pp_deb_dev_pkgname="dev"
        !          3777:     pp_deb_doc_pkgname="doc"
        !          3778:     pp_deb_section=contrib # Free software that depends on non-free software
        !          3779: 
        !          3780:     # Detect the host architecture
        !          3781:     pp_deb_detect_arch
        !          3782: 
        !          3783:     # Make sure any programs we require are installed
        !          3784:     pp_deb_check_required_programs
        !          3785: 
        !          3786:     # Set generated/interrogated platforms variables
        !          3787:     pp_deb_munge_description
        !          3788: }
        !          3789: 
        !          3790: pp_deb_check_required_programs () {
        !          3791:     local p needed notfound ok
        !          3792:     needed= notfound=
        !          3793:     for prog in dpkg dpkg-deb install md5sum fakeroot
        !          3794:     do
        !          3795:         if which $prog 2>/dev/null >/dev/null; then
        !          3796:            pp_debug "$prog: found"
        !          3797:        else
        !          3798:            pp_debug "$prog: not found"
        !          3799:            case "$prog" in
        !          3800:                dpkg|dpkg-deb)  p=dpkg;;
        !          3801:                install|md5sum) p=coreutils;;
        !          3802:                fakeroot)       p=fakeroot;;
        !          3803:                *)              pp_die "unexpected dpkg tool $prog";;
        !          3804:            esac
        !          3805:            notfound="$notfound $prog"
        !          3806:            pp_contains "$needed" "$p" || needed="$needed $p"
        !          3807:        fi
        !          3808:     done
        !          3809:     if [ -n "$notfound" ]; then
        !          3810:        pp_error "cannot find these programs: $notfound"
        !          3811:        pp_error "please install these packages: $needed"
        !          3812:     fi
        !          3813: }
        !          3814: 
        !          3815: pp_deb_munge_description () {
        !          3816:     # Insert a leading space on each line, replace blank lines with a
        !          3817:     #space followed by a full-stop.
        !          3818:     pp_deb_control_description=`echo ${pp_deb_description:-$description} | \
        !          3819:         sed "s,^\(.*\)$, \1, " \
        !          3820:         | sed "s,^[ \t]*$, .,g"`
        !          3821: 
        !          3822: }
        !          3823: 
        !          3824: pp_deb_detect_arch () {
        !          3825:    pp_deb_arch=`dpkg --print-architecture`
        !          3826:    pp_deb_arch_std=`uname -m`
        !          3827: }
        !          3828: 
        !          3829: pp_deb_sanitize_version() {
        !          3830:     echo "$@" | tr -d -c '[:alnum:].+-:~'
        !          3831: }
        !          3832: 
        !          3833: pp_deb_version_final() {
        !          3834:     if test -n "$pp_deb_version"; then
        !          3835:         # Don't sanitize; assume the user is sane (hah!)
        !          3836:         echo "$pp_deb_version"
        !          3837:     else
        !          3838:         pp_deb_sanitize_version "$version"
        !          3839:     fi
        !          3840: }
        !          3841: 
        !          3842: pp_deb_make_control() {
        !          3843:     package_name=`pp_deb_cmp_full_name "$1"`
        !          3844:     cat <<-.
        !          3845:        Package: ${package_name}
        !          3846:        Version: `pp_deb_version_final`-${pp_deb_release:-1}
        !          3847:        Section: ${pp_deb_section:-contrib}
        !          3848:        Priority: optional
        !          3849:        Architecture: ${pp_deb_arch}
        !          3850:        Maintainer: ${pp_deb_maintainer:-$maintainer}
        !          3851:        Description: ${pp_deb_summary:-$summary}
        !          3852:        ${pp_deb_control_description}
        !          3853: .
        !          3854:     if test -s $pp_wrkdir/%depend."$1"; then
        !          3855:        sed -ne '/^[    ]*$/!s/^[       ]*/Depends: /p' \
        !          3856:            < $pp_wrkdir/%depend."$1"
        !          3857:     fi
        !          3858: }
        !          3859: 
        !          3860: pp_deb_make_md5sums() {
        !          3861:     local cmp="$1"; shift
        !          3862:     local pkg_dir
        !          3863: 
        !          3864:     pkg_dir=$pp_wrkdir/`pp_deb_cmp_full_name $cmp`
        !          3865:     (cd $pkg_dir && md5sum "$@") > $pkg_dir/DEBIAN/md5sums ||
        !          3866:        pp_error "cannot make md5sums"
        !          3867: }
        !          3868: 
        !          3869: pp_deb_make_package_maintainer_script() {
        !          3870:     local output="$1"
        !          3871:     local source="$2"
        !          3872:     local desc="$3"
        !          3873: 
        !          3874:     # See if we need to create this script at all
        !          3875:     if [ -s "$source" ]
        !          3876:     then
        !          3877: 
        !          3878:         # Create header
        !          3879:         cat <<-. >$output || pp_error "Cannot create $output"
        !          3880:        #!/bin/sh
        !          3881:        # $desc
        !          3882:        # Generated by PolyPackage $pp_version
        !          3883: 
        !          3884: .
        !          3885: 
        !          3886:         cat $source >> "$output" || pp_error "Cannot append to $output"
        !          3887: 
        !          3888:         # Set perms
        !          3889:         chmod 755 "$output" || pp_error "Cannot chmod $output"
        !          3890:     fi
        !          3891: }
        !          3892: 
        !          3893: pp_deb_handle_services() {
        !          3894:     local svc
        !          3895: 
        !          3896:     #-- add service start/stop code
        !          3897:     if test -n "$pp_services"; then
        !          3898:         #-- record the uninstall commands in reverse order
        !          3899:         for svc in $pp_services; do
        !          3900:             pp_load_service_vars $svc
        !          3901: 
        !          3902:             # Create init script (unless one exists)
        !          3903:             pp_deb_service_make_init_script $svc
        !          3904: 
        !          3905:             #-- append %post code to install the svc
        !          3906:            test x"yes" = x"$enable" &&
        !          3907:             cat<<-. >> $pp_wrkdir/%post.run
        !          3908:                # Install the service links
        !          3909:                /usr/sbin/update-rc.d $svc defaults
        !          3910: .
        !          3911: 
        !          3912:             #-- prepend %preun code to stop svc
        !          3913:             cat<<-. | pp_prepend $pp_wrkdir/%preun.run
        !          3914:                # Stop the $svc service
        !          3915:                if test -x /usr/sbin/invoke-rc.d; then
        !          3916:                    /usr/sbin/invoke-rc.d $svc stop
        !          3917:                else
        !          3918:                    /etc/init.d/$svc stop
        !          3919:                fi
        !          3920:                # Remove the service links
        !          3921:                /usr/sbin/update-rc.d -f $svc remove
        !          3922: .
        !          3923:         done
        !          3924:         #pp_deb_service_remove_common | pp_prepend $pp_wrkdir/%preun.run
        !          3925:     fi
        !          3926: 
        !          3927: }
        !          3928: pp_deb_fakeroot () {
        !          3929:     if test -s $pp_wrkdir/fakeroot.save; then
        !          3930:        fakeroot -i $pp_wrkdir/fakeroot.save -s $pp_wrkdir/fakeroot.save "$@"
        !          3931:     else
        !          3932:        fakeroot -s $pp_wrkdir/fakeroot.save "$@"
        !          3933:     fi
        !          3934: }
        !          3935: 
        !          3936: pp_deb_make_DEBIAN() {
        !          3937:     local cmp="${1:-run}"
        !          3938:     local data cmp_full_name
        !          3939:     local old_umask
        !          3940: 
        !          3941:     old_umask=`umask`
        !          3942:     umask 0022
        !          3943:     cmp_full_name=`pp_deb_cmp_full_name $cmp`
        !          3944:     data=$pp_wrkdir/$cmp_full_name
        !          3945: 
        !          3946:     # Create DEBIAN dir $data/DEBIAN
        !          3947:     mkdir -p $data/DEBIAN
        !          3948: 
        !          3949:     # Create control file
        !          3950:     pp_deb_make_control $cmp > $data/DEBIAN/control
        !          3951: 
        !          3952:     # Copy in conffiles
        !          3953:     if test -f $pp_wrkdir/%conffiles.$cmp; then
        !          3954:        cp $pp_wrkdir/%conffiles.$cmp $data/DEBIAN/conffiles
        !          3955:     fi
        !          3956: 
        !          3957:     # Create postinst
        !          3958:     pp_deb_make_package_maintainer_script "$data/DEBIAN/postinst" \
        !          3959:         "$pp_wrkdir/%post.$cmp" "Post install script for $cmp_full_name"\
        !          3960:         || exit $?
        !          3961: 
        !          3962:     # Create prerm
        !          3963:     pp_deb_make_package_maintainer_script "$data/DEBIAN/prerm" \
        !          3964:         "$pp_wrkdir/%preun.$cmp" "Pre-uninstall script for $cmp_full_name"\
        !          3965:         || exit $?
        !          3966: 
        !          3967:     umask $old_umask
        !          3968: }
        !          3969: 
        !          3970: pp_deb_make_data() {
        !          3971:     local _l t m o g f p st data
        !          3972:     local data share_doc owner group
        !          3973:     cmp=$1
        !          3974:     data=$pp_wrkdir/`pp_deb_cmp_full_name $cmp`
        !          3975:     cat $pp_wrkdir/%files.${cmp} | while read t m o g f p st; do
        !          3976:        test x"$o" = x"-" && o=root
        !          3977:        test x"$g" = x"-" && g=root
        !          3978:         case "$t" in
        !          3979:         f) # Files
        !          3980:            pp_deb_fakeroot install -D -o $o -g $g -m ${m} $pp_destdir/$p $data/$p;
        !          3981:            if [ x"$f" = x"v" ]
        !          3982:            then
        !          3983:                # File marked as "volatile". Assume this means it's a conffile
        !          3984:               # TODO: check this as admins like modified conffiles to be left
        !          3985:               #       behind
        !          3986:                echo "$p" >> $pp_wrkdir/%conffiles.$cmp
        !          3987:            fi;;
        !          3988: 
        !          3989:         d) # Directories
        !          3990:            pp_deb_fakeroot install -m ${m} -o $o -g $g -d $data/$p;;
        !          3991: 
        !          3992:         s) # Symlinks
        !          3993:            # Remove leading / from vars
        !          3994:            rel_p=`echo $p | sed s,^/,,`
        !          3995:            rel_st=`echo $st | sed s,^/,,`
        !          3996:            # TODO: we are always doing absolute links here. We should follow
        !          3997:           # the debian policy of relative links when in the same top-level
        !          3998:           # directory
        !          3999:            (cd $data; ln -sf $st $rel_p);;
        !          4000:            *) pp_error "Unsupported data file type: $t";;
        !          4001:        esac
        !          4002:     done
        !          4003: 
        !          4004:     # If no copyright file is present add one. This is a debian requirement.
        !          4005:     share_doc="/usr/share/doc/`pp_deb_cmp_full_name $cmp`"
        !          4006:     if [ ! -f "$data/$share_doc/copyright" ]
        !          4007:     then
        !          4008:         echo "${pp_deb_copyright:-$copyright}" > "$pp_wrkdir/copyright"
        !          4009:         install -D -m 644 "$pp_wrkdir/copyright" "$data/$share_doc/copyright"
        !          4010:     fi
        !          4011: 
        !          4012: }
        !          4013: 
        !          4014: pp_deb_makedeb () {
        !          4015:     local cmp
        !          4016:     local package_build_dir
        !          4017: 
        !          4018:     cmp="$1"
        !          4019: 
        !          4020:     package_build_dir=$pp_wrkdir/`pp_deb_cmp_full_name $cmp`
        !          4021: 
        !          4022:     # Create package dir
        !          4023:     mkdir -p $package_build_dir
        !          4024: 
        !          4025:     # Copy in data
        !          4026:     pp_deb_make_data $cmp ||
        !          4027:        pp_die "Could not make DEBIAN data files for $cmp"
        !          4028: 
        !          4029:     # Make control files
        !          4030:     # must be done after copying data so conffiles are found
        !          4031:     pp_deb_make_DEBIAN $cmp ||
        !          4032:        pp_die "Could not make DEBIAN control files for $cmp"
        !          4033: 
        !          4034:     # Create md5sums
        !          4035:     pp_deb_make_md5sums $cmp `(cd $package_build_dir;
        !          4036:        find . -type f -a -not -name DEBIAN | sed "s,^\./,,")` ||
        !          4037:            pp_die "Could not make DEBIAN md5sums for $cmp"
        !          4038: }
        !          4039: 
        !          4040: pp_backend_deb () {
        !          4041:     local debname
        !          4042: 
        !          4043:     # Handle services
        !          4044:     pp_deb_handle_services $cmp
        !          4045: 
        !          4046:     for cmp in $pp_components
        !          4047:     do
        !          4048:         debname=`pp_deb_name $cmp`
        !          4049:         pp_deb_makedeb $cmp
        !          4050:     done
        !          4051: 
        !          4052:     . $pp_wrkdir/%fixup
        !          4053: 
        !          4054:     for cmp in $pp_components
        !          4055:     do
        !          4056:         debname=`pp_deb_name $cmp`
        !          4057:        # Create debian package
        !          4058:        pp_debug "Building `pp_deb_cmp_full_name $cmp` -> $output"
        !          4059:        pp_deb_fakeroot dpkg-deb \
        !          4060:            --build $pp_wrkdir/`pp_deb_cmp_full_name $cmp` \
        !          4061:            $pp_wrkdir/$debname ||
        !          4062:                pp_error "failed to create $cmp package"
        !          4063:     done
        !          4064: }
        !          4065: 
        !          4066: pp_backend_deb_cleanup () {
        !          4067:     # rm -rf $pp_wrkdir
        !          4068:     :
        !          4069: }
        !          4070: 
        !          4071: pp_deb_name () {
        !          4072:     local cmp="${1:-run}"
        !          4073:     echo `pp_deb_cmp_full_name $cmp`"_"`pp_deb_version_final`"-${pp_deb_release:-1}_${pp_deb_arch}.deb"
        !          4074: }
        !          4075: pp_backend_deb_names () {
        !          4076:     for cmp in $pp_components
        !          4077:     do
        !          4078:         pp_deb_name $cmp
        !          4079:     done
        !          4080: }
        !          4081: 
        !          4082: pp_backend_deb_install_script () {
        !          4083:     local cmp _cmp_full_name
        !          4084: 
        !          4085:     echo "#!/bin/sh"
        !          4086:     pp_install_script_common
        !          4087: 
        !          4088:     cat <<.
        !          4089: 
        !          4090:         cmp_to_pkgname () {
        !          4091:             test x"\$*" = x"all" &&
        !          4092:                 set -- $pp_components
        !          4093:             for cmp
        !          4094:             do
        !          4095:                 case \$cmp in
        !          4096: .
        !          4097:     for cmp in $pp_components; do
        !          4098:          echo "$cmp) echo '`pp_deb_cmp_full_name $cmp`';;"
        !          4099:     done
        !          4100:     cat <<.
        !          4101:                 *) usage;;
        !          4102:                 esac
        !          4103:             done
        !          4104:         }
        !          4105: 
        !          4106: 
        !          4107:         cmp_to_pathname () {
        !          4108:             test x"\$*" = x"all" &&
        !          4109:                 set -- $pp_components
        !          4110:             for cmp
        !          4111:             do
        !          4112:                 case \$cmp in
        !          4113: .
        !          4114:     for cmp in $pp_components; do
        !          4115:          echo "$cmp) echo \${PP_PKGDESTDIR:-.}/'`pp_deb_name $cmp`';;"
        !          4116:     done
        !          4117:     cat <<.
        !          4118:                 *) usage;;
        !          4119:                esac
        !          4120:             done
        !          4121:         }
        !          4122: 
        !          4123:         test \$# -eq 0 && usage
        !          4124:         op="\$1"; shift
        !          4125:         case "\$op" in
        !          4126:             list-components)
        !          4127:                 test \$# -eq 0 || usage \$op
        !          4128:                 echo $pp_components
        !          4129:                 ;;
        !          4130:             list-services)
        !          4131:                 test \$# -eq 0 || usage \$op
        !          4132:                 echo $pp_services
        !          4133:                 ;;
        !          4134:             list-files)
        !          4135:                 test \$# -ge 1 || usage \$op
        !          4136:                 cmp_to_pathname "\$@"
        !          4137:                 ;;
        !          4138:             install)
        !          4139:                 test \$# -ge 1 || usage \$op
        !          4140:                 dpkg --install \`cmp_to_pathname "\$@"\`
        !          4141:                 ;;
        !          4142:             uninstall)
        !          4143:                 test \$# -ge 1 || usage \$op
        !          4144:                 dpkg --remove \`cmp_to_pkgname "\$@"\`; :
        !          4145:                 ;;
        !          4146:             start|stop)
        !          4147:                 test \$# -ge 1 || usage \$op
        !          4148:                 ec=0
        !          4149:                 for svc
        !          4150:                 do
        !          4151:                     /etc/init.d/\$svc \$op || ec=1
        !          4152:                 done
        !          4153:                 exit \$ec
        !          4154:                 ;;
        !          4155:             print-platform)
        !          4156:                 test \$# -eq 0 || usage \$op
        !          4157:                echo "linux-${pp_deb_arch}"
        !          4158:                ;;
        !          4159:             *)
        !          4160:                 usage
        !          4161:                 ;;
        !          4162:         esac
        !          4163: .
        !          4164: }
        !          4165: 
        !          4166: pp_backend_deb_probe() {
        !          4167:     local arch distro release
        !          4168: 
        !          4169:     pp_deb_detect_arch
        !          4170: 
        !          4171:     # /etc/debian_version exists on Debian & Ubuntu, so it's no use
        !          4172:     # to us. Use lsb_release instead.
        !          4173: 
        !          4174:     case `(lsb_release -is || echo no-lsb) 2>/dev/null` in
        !          4175:         Debian)
        !          4176:             distro=deb
        !          4177:            ;;
        !          4178:         Ubuntu)
        !          4179:             distro=ubu
        !          4180:            ;;
        !          4181:        no-lsb)
        !          4182:            echo unknown-$pp_deb_arch_std
        !          4183:            return 0
        !          4184:            ;;
        !          4185:         *)
        !          4186:             distro=unknown
        !          4187:            ;;
        !          4188:     esac
        !          4189: 
        !          4190:     release=`lsb_release -rs`
        !          4191: 
        !          4192:     # If release is not numeric, use the codename
        !          4193:     case $release in
        !          4194:         *[!.0-9r]*)
        !          4195:            release=`lsb_release -cs`
        !          4196:            case $release in
        !          4197:                buzz)
        !          4198:                    release="11"
        !          4199:                    ;;
        !          4200:                rex)
        !          4201:                    release="12"
        !          4202:                    ;;
        !          4203:                bo)
        !          4204:                    release="13"
        !          4205:                    ;;
        !          4206:                hamm)
        !          4207:                    release="20"
        !          4208:                    ;;
        !          4209:                slink)
        !          4210:                    release="21"
        !          4211:                    ;;
        !          4212:                potato)
        !          4213:                    release="22"
        !          4214:                    ;;
        !          4215:                woody)
        !          4216:                    release="30"
        !          4217:                    ;;
        !          4218:                sarge)
        !          4219:                    release="31"
        !          4220:                    ;;
        !          4221:                etch)
        !          4222:                    release="40"
        !          4223:                    ;;
        !          4224:                lenny)
        !          4225:                    release="50"
        !          4226:                    ;;
        !          4227:                squeeze)
        !          4228:                    release="60"
        !          4229:                    ;;
        !          4230:            esac
        !          4231:            ;;
        !          4232:        *)
        !          4233:            # Remove trailing revision number and any dots
        !          4234:             release=`echo $release | cut -dr -f1 | tr -d .`
        !          4235:            ;;
        !          4236:     esac
        !          4237: 
        !          4238:     echo $distro$release-$pp_deb_arch_std
        !          4239: }
        !          4240: 
        !          4241: pp_backend_deb_vas_platforms () {
        !          4242:     case "$pp_deb_arch_std" in
        !          4243:        x86_64) echo "linux-x86_64.deb";; # DO NOT add linux-x86.deb here!!
        !          4244:        *86)    echo "linux-x86.deb";;
        !          4245:        *)      pp_die "unknown architecture ${pp_deb_arch_std}";;
        !          4246:     esac
        !          4247: }
        !          4248: pp_backend_deb_init_svc_vars () {
        !          4249:     # Default multi-user runlevel on Debian is 2; 3-5 are also multi-user
        !          4250:     pp_deb_default_start_runlevels="2 3 4 5"
        !          4251:     pp_deb_default_svc_description="No description"
        !          4252: }
        !          4253: 
        !          4254: pp_backend_deb_init_svc_vars () {
        !          4255: 
        !          4256:     reload_signal=
        !          4257:     start_runlevels=${pp_deb_default_start_runlevels}   # == lsb default-start
        !          4258:     stop_runlevels="0 1 6"                              # == lsb default-stop
        !          4259:     svc_description="${pp_deb_default_svc_description}" # == lsb short descr
        !          4260:     svc_process=
        !          4261: 
        !          4262:     lsb_required_start='$local_fs $network'
        !          4263:     lsb_should_start=
        !          4264:     lsb_required_stop=
        !          4265:     lsb_description=
        !          4266: 
        !          4267:     start_priority=50
        !          4268:     stop_priority=50            #-- stop_priority = 100 - start_priority
        !          4269: }
        !          4270: 
        !          4271: pp_deb_service_make_init_script () {
        !          4272:     local svc=$1
        !          4273:     local script=/etc/init.d/$svc
        !          4274:     local out=$pp_destdir$script
        !          4275:     local _process _cmd
        !          4276: 
        !          4277:     pp_add_file_if_missing $script run 755 || return 0
        !          4278: 
        !          4279:     #-- start out as an empty shell script
        !          4280:     cat <<-'.' >$out
        !          4281:        #!/bin/sh
        !          4282: .
        !          4283: 
        !          4284:     #-- determine the process name from $cmd unless $svc_process is given
        !          4285:     set -- $cmd
        !          4286:     #_process=${svc_process:-"$1"} --? WTF
        !          4287: 
        !          4288:     #-- construct a start command that builds a pid file if needed
        !          4289:     _cmd="$cmd";
        !          4290:     _cmd_path=`echo $cmd | cut -d" " -f1`
        !          4291:     _cmd_name=`basename $_cmd_path`
        !          4292:     _cmd_args=`echo $cmd | cut -d" " -f2-`
        !          4293:     test x"$_cmd_path" != x"$_cmd_args" || _cmd_args=
        !          4294: 
        !          4295:     #-- generate the LSB init info
        !          4296:     cat <<-. >>$out
        !          4297:        ### BEGIN INIT INFO
        !          4298:        # Provides: ${svc}
        !          4299:        # Required-Start: ${lsb_required_start}
        !          4300:        # Should-Start: ${lsb_should_start}
        !          4301:        # Required-Stop: ${lsb_required_stop}
        !          4302:        # Default-Start: ${start_runlevels}
        !          4303:        # Default-Stop: ${stop_runlevels}
        !          4304:        # Short-Description: ${svc_description}
        !          4305:        ### END INIT INFO
        !          4306:        # Generated by PolyPackage ${pp_version}
        !          4307:        # ${copyright}
        !          4308: 
        !          4309: .
        !          4310: 
        !          4311:     if test x"${svc_description}" = x"${pp_deb_default_svc_description}"; then
        !          4312:         svc_description=
        !          4313:     fi
        !          4314: 
        !          4315:     #-- write service-specific definitions
        !          4316:     cat <<. >>$out
        !          4317: NAME="${_cmd_name}"
        !          4318: DESC="${svc_description:-$svc service}"
        !          4319: USER="${user}"
        !          4320: GROUP="${group}"
        !          4321: PIDFILE="${pidfile}"
        !          4322: STOP_SIGNAL="${stop_signal}"
        !          4323: RELOAD_SIGNAL="${reload_signal}"
        !          4324: CMD="${_cmd}"
        !          4325: DAEMON="${_cmd_path}"
        !          4326: DAEMON_ARGS="${_cmd_args}"
        !          4327: SCRIPTNAME=${script}
        !          4328: .
        !          4329: 
        !          4330:     #-- write the generic part of the init script
        !          4331:     cat <<'.' >>$out
        !          4332: 
        !          4333: [ -x "$DAEMON" ] || exit 0
        !          4334: 
        !          4335: [ -r /etc/default/$NAME ] && . /etc/default/$NAME
        !          4336: 
        !          4337: [ -f /etc/default/rcS ] && . /etc/default/rcS
        !          4338: 
        !          4339: . /lib/lsb/init-functions
        !          4340: 
        !          4341: do_start()
        !          4342: {
        !          4343:        # Return
        !          4344:        #   0 if daemon has been started
        !          4345:        #   1 if daemon was already running
        !          4346:        #   2 if daemon could not be started
        !          4347:     if [ -n "$PIDFILE" ]
        !          4348:     then
        !          4349:         pidfile_opt="--pidfile $PIDFILE"
        !          4350:     else
        !          4351:         pidfile_opt="--make-pidfile --background --pidfile /var/run/$NAME.pid"
        !          4352:     fi
        !          4353:     if [ -n "$USER" ]
        !          4354:     then
        !          4355:         user_opt="--user $USER"
        !          4356:     fi
        !          4357:     if [ -n "$GROUP" ]
        !          4358:     then
        !          4359:         group_opt="--group $GROUP"
        !          4360:     fi
        !          4361:     if [ "$VERBOSE" = no ]
        !          4362:     then
        !          4363:         quiet_opt="--quiet"
        !          4364:     else
        !          4365:         quiet_opt="--verbose"
        !          4366:     fi
        !          4367: 
        !          4368:        start-stop-daemon --start $quiet_opt $pidfile_opt $user_opt --exec $DAEMON --test > /dev/null \
        !          4369:            || return 1
        !          4370: 
        !          4371:     # Note: there seems to be no way to tell whether the daemon will fork itself or not, so pass
        !          4372:     # --background for now
        !          4373:     start-stop-daemon --start $quiet_opt $pidfile_opt $user_opt --exec $DAEMON -- \
        !          4374:        $DAEMON_ARGS \
        !          4375:        || return 2
        !          4376: }
        !          4377: 
        !          4378: do_stop()
        !          4379: {
        !          4380:        # Return
        !          4381:        #   0 if daemon has been stopped
        !          4382:        #   1 if daemon was already stopped
        !          4383:        #   2 if daemon could not be stopped
        !          4384:        #   other if a failure occurred
        !          4385:     if [ -n "$PIDFILE" ]
        !          4386:     then
        !          4387:         pidfile_opt="--pidfile $PIDFILE"
        !          4388:     else
        !          4389:         pidfile_opt="--pidfile /var/run/$NAME.pid"
        !          4390:     fi
        !          4391:     if [ -n "$USER" ]
        !          4392:     then
        !          4393:         user_opt="--user $USER"
        !          4394:     fi
        !          4395:     if [ -n $STOP_SIGNAL ]
        !          4396:     then
        !          4397:         signal_opt="--signal $STOP_SIGNAL"
        !          4398:     fi
        !          4399:     if [ "$VERBOSE" = "no" ]
        !          4400:     then
        !          4401:         quiet_opt="--quiet"
        !          4402:     else
        !          4403:         quiet_opt="--verbose"
        !          4404:     fi
        !          4405:        start-stop-daemon --stop $quiet_opt $signal_opt --retry=TERM/30/KILL/5 $pidfile_opt --name $NAME
        !          4406:        RETVAL="$?"
        !          4407:        [ "$RETVAL" = 2 ] && return 2
        !          4408:        # Wait for children to finish too if this is a daemon that forks
        !          4409:        # and if the daemon is only ever run from this initscript.
        !          4410:        # If the above conditions are not satisfied then add some other code
        !          4411:        # that waits for the process to drop all resources that could be
        !          4412:        # needed by services started subsequently.  A last resort is to
        !          4413:        # sleep for some time.
        !          4414:        start-stop-daemon --stop $quiet_opt --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        !          4415:        [ "$?" = 2 ] && return 2
        !          4416:        # Many daemons don't delete their pidfiles when they exit.
        !          4417:        test -z $PIDFILE || rm -f $PIDFILE
        !          4418:        return "$RETVAL"
        !          4419: }
        !          4420: 
        !          4421: do_reload() {
        !          4422:        #
        !          4423:        # If the daemon can reload its configuration without
        !          4424:        # restarting (for example, when it is sent a SIGHUP),
        !          4425:        # then implement that here.
        !          4426:        #
        !          4427:     if [ -n "$PIDFILE" ]
        !          4428:     then
        !          4429:         pidfile_opt="--pidfile $PIDFILE"
        !          4430:     else
        !          4431:         pidfile_opt="--pidfile /var/run/$NAME.pid"
        !          4432:     fi
        !          4433:     if [ -n "$RELOAD_SIGNAL" ]
        !          4434:     then
        !          4435:            start-stop-daemon --stop --signal $RELOAD_SIGNAL $quiet_opt $pidfile_opt --name $NAME
        !          4436:     fi
        !          4437:        return 0
        !          4438: }
        !          4439: 
        !          4440: case "$1" in
        !          4441:   start)
        !          4442:        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        !          4443:        do_start
        !          4444:        case "$?" in
        !          4445:                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        !          4446:                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        !          4447:        esac
        !          4448:        ;;
        !          4449:   stop)
        !          4450:        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        !          4451:        do_stop
        !          4452:        case "$?" in
        !          4453:                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        !          4454:                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        !          4455:        esac
        !          4456:        ;;
        !          4457:   reload|force-reload)
        !          4458:     if [ -n "$RELOAD_SIGNAL" ]
        !          4459:     then
        !          4460:            log_daemon_msg "Reloading $DESC" "$NAME"
        !          4461:            do_reload
        !          4462:            log_end_msg $?
        !          4463:     else
        !          4464:         # Do a restart instead
        !          4465:         "$0" restart
        !          4466:     fi
        !          4467:        ;;
        !          4468:   restart)
        !          4469:        #
        !          4470:        # If the "reload" option is implemented then remove the
        !          4471:        # 'force-reload' alias
        !          4472:        #
        !          4473:        log_daemon_msg "Restarting $DESC" "$NAME"
        !          4474:        do_stop
        !          4475:        case "$?" in
        !          4476:          0|1)
        !          4477:                do_start
        !          4478:                case "$?" in
        !          4479:                        0) log_end_msg 0 ;;
        !          4480:                        1) log_end_msg 1 ;; # Old process is still running
        !          4481:                        *) log_end_msg 1 ;; # Failed to start
        !          4482:                esac
        !          4483:                ;;
        !          4484:          *)
        !          4485:                # Failed to stop
        !          4486:                log_end_msg 1
        !          4487:                ;;
        !          4488:        esac
        !          4489:        ;;
        !          4490:   *)
        !          4491:        #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
        !          4492:        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
        !          4493:        exit 3
        !          4494:        ;;
        !          4495: esac
        !          4496: 
        !          4497: :
        !          4498: .
        !          4499:     chmod 755 $out
        !          4500: }
        !          4501: pp_backend_deb_function() {
        !          4502:     case $1 in
        !          4503:         pp_mkgroup) cat<<'.';;
        !          4504:            /usr/sbin/groupmod "$1" 2>/dev/null && return 0
        !          4505:             /usr/sbin/groupadd "$1"
        !          4506: .
        !          4507:         pp_mkuser:depends) echo pp_mkgroup;;
        !          4508:         pp_mkuser) cat<<'.';;
        !          4509:            pp_tmp_system=
        !          4510:            id -u "$1" >/dev/null 2>/dev/null && return 0
        !          4511:            # deb 3.1's useradd changed API in 4.0. Gah!
        !          4512:            /usr/sbin/useradd --help 2>&1 | /bin/grep -q .--system &&
        !          4513:                pp_tmp_system=--system
        !          4514:            pp_mkgroup "${2:-$1}" || return 1
        !          4515:            /usr/sbin/useradd \
        !          4516:                -g "${2:-$1}" \
        !          4517:                -d "${3:-/nonexistent}" \
        !          4518:                -s "${4:-/bin/false}" \
        !          4519:                $pp_tmp_system \
        !          4520:                "$1"
        !          4521: .
        !          4522:         pp_havelib) cat<<'.';;
        !          4523:             for pp_tmp_dir in `echo "/usr/lib:/lib${3:+:$3}" | tr : ' '`; do
        !          4524:                 test -r "$pp_tmp_dir/lib$1.so{$2:+.$2}" && return 0
        !          4525:             done
        !          4526:             return 1
        !          4527: .
        !          4528:     *) false;;
        !          4529:     esac
        !          4530: }
        !          4531: 
        !          4532: pp_platforms="$pp_platforms kit"
        !          4533: 
        !          4534: pp_backend_kit_detect () {
        !          4535:     test x"$1" = x"OSF1"
        !          4536: }
        !          4537: 
        !          4538: pp_backend_kit_init () {
        !          4539:         pp_kit_name=
        !          4540:         pp_kit_package=
        !          4541:         pp_kit_desc=
        !          4542:         pp_kit_version=
        !          4543:         pp_kit_subset=
        !          4544:         pp_readlink_fn=pp_ls_readlink
        !          4545:         pp_kit_startlevels="2 3"
        !          4546:         pp_kit_stoplevels="0 2 3"
        !          4547: }
        !          4548: 
        !          4549: pp_backend_kit () {
        !          4550:     typeset mi_file k_file svc outfile
        !          4551:     typeset desc
        !          4552: 
        !          4553:     pp_backend_kit_names > /dev/null
        !          4554: 
        !          4555:     if test -z "$pp_kit_desc"; then
        !          4556:         pp_kit_desc="$description"
        !          4557:     fi
        !          4558: 
        !          4559:     mi_file="$pp_wrkdir/$pp_kit_subset.mi"
        !          4560:     k_file="$pp_wrkdir/$pp_kit_subset.k"
        !          4561:     scp_file="$pp_wrkdir/$pp_kit_subset.scp"
        !          4562: 
        !          4563:     desc="${pp_kit_desc:-$description}"
        !          4564: 
        !          4565:     cat <<-. >> $k_file
        !          4566:        NAME='$name'
        !          4567:        CODE=$pp_kit_name
        !          4568:        VERS=$pp_kit_version
        !          4569:        MI=$mi_file
        !          4570:        COMPRESS=0
        !          4571:        %%
        !          4572:        $pp_kit_subset  .       0       '$desc'
        !          4573: .
        !          4574: 
        !          4575:     if test -n "$pp_services"; then
        !          4576:         for svc in $pp_services; do
        !          4577:             pp_kit_make_service $svc
        !          4578:             pp_prepend $pp_wrkdir/%preun.run <<-.
        !          4579:                /sbin/init.d/$svc stop
        !          4580: .
        !          4581:          done
        !          4582:     fi
        !          4583: 
        !          4584:     pp_backend_kit_make_mi "$mi_file"
        !          4585:     pp_backend_kit_make_scp
        !          4586:     #rm -rf  $pp_wrkdir/kit_dest
        !          4587:     mkdir -p $pp_wrkdir/kit_dest
        !          4588:     pp_backend_kit_kits $k_file $pp_opt_destdir $pp_wrkdir/kit_dest
        !          4589:     tar cvf $pp_wrkdir/$pp_kit_subset.tar -C $pp_wrkdir/kit_dest .
        !          4590:     gzip -c $pp_wrkdir/$pp_kit_subset.tar > $pp_wrkdir/$pp_kit_subset.tar.gz
        !          4591:     #rm -rf $pp_wrkdir/$pp_kit_subset.tar $pp_wrkdir/scps
        !          4592: }
        !          4593: 
        !          4594: pp_backend_kit_make_mi () {
        !          4595:     # XXX this information should go into the .inv files
        !          4596:     typeset t m o g f p st line dm
        !          4597:     while read t m o g f p st; do
        !          4598:         case $t in
        !          4599:             f|d)
        !          4600:                 echo "0        .$p     $pp_kit_subset"
        !          4601:                 echo "        chmod $m $p" >> $pp_wrkdir/%post.run
        !          4602:                 if [ x"$o" = x"-" ] ; then
        !          4603:                     echo "        chown root $p" >> $pp_wrkdir/%post.run
        !          4604:                 else
        !          4605:                     echo "        chown $o $p" >> $pp_wrkdir/%post.run
        !          4606:                 fi
        !          4607:                 if [ x"$g" = x"-" ] ; then
        !          4608:                     echo "        chgrp 0 $p" >> $pp_wrkdir/%post.run
        !          4609:                 else
        !          4610:                     echo "        chgrp $g $p" >> $pp_wrkdir/%post.run
        !          4611:                 fi
        !          4612:                 ;;
        !          4613:             s)
        !          4614:                 echo "        ln -s $st $p" >> $pp_wrkdir/%post.run
        !          4615:                 echo "        rm -f $p" >> $pp_wrkdir/%preun.run
        !          4616:                 ;;
        !          4617:          esac
        !          4618:     done < $pp_wrkdir/%files.run | sort -k3  |uniq > $1
        !          4619: }
        !          4620: 
        !          4621: 
        !          4622: pp_backend_kit_make_scp () {
        !          4623:     scpdir="$pp_wrkdir/scps"
        !          4624:     mkdir "$scpdir" && touch "$scpdir"/$pp_kit_subset.scp
        !          4625:     cat <<EOF >"$scpdir"/$pp_kit_subset.scp
        !          4626: 
        !          4627:     . /usr/share/lib/shell/libscp
        !          4628: 
        !          4629:     case "\$ACT" in
        !          4630:     PRE_L)
        !          4631:     STL_ScpInit
        !          4632: 
        !          4633: 
        !          4634: 
        !          4635:     ;;
        !          4636:     POST_L)
        !          4637:         STL_ScpInit
        !          4638:         STL_LinkCreate
        !          4639: EOF
        !          4640: 
        !          4641:     cat $pp_wrkdir/%post.run >>"$scpdir"/$pp_kit_subset.scp
        !          4642:     cat >>"$scpdir"/$pp_kit_subset.scp <<EOF
        !          4643:     ;;
        !          4644:     PRE_D)
        !          4645:         STL_ScpInit
        !          4646:         STL_LinkRemove
        !          4647: EOF
        !          4648:     cat $pp_wrkdir/%preun.run >>"$scpdir"/$pp_kit_subset.scp
        !          4649:     cat >>"$scpdir"/$pp_kit_subset.scp <<EOF
        !          4650:         ;;
        !          4651:     POST_D)
        !          4652: 
        !          4653:         ;;
        !          4654:     C)
        !          4655:         STL_ScpInit
        !          4656: 
        !          4657:         case "\$1" in
        !          4658:         INSTALL)
        !          4659:         echo "Installation of the \$_DESC (\$_SUB) subset is complete."
        !          4660:         ;;
        !          4661:     DELETE)
        !          4662:         ;;
        !          4663:     esac
        !          4664: 
        !          4665:         ;;
        !          4666:     V)
        !          4667: 
        !          4668:         ;;
        !          4669:     esac
        !          4670: 
        !          4671:     exit 0
        !          4672: EOF
        !          4673:     chmod 744 "$scpdir"/$pp_kit_subset.scp
        !          4674: }
        !          4675: 
        !          4676: 
        !          4677: pp_backend_kit_cleanup () {
        !          4678:     :
        !          4679: }
        !          4680: 
        !          4681: pp_backend_kit_names () {
        !          4682:     if test -z "$pp_kit_name"; then
        !          4683:         pp_warn "pp_kit_name not specified, using XXX"
        !          4684:         pp_kit_name=XXX
        !          4685:     fi
        !          4686:     case "$pp_kit_name" in
        !          4687:         ???) : ok;;
        !          4688:         *) pp_error "\$pp_kit_name $pp_kit_name must be three characters";;
        !          4689:     esac
        !          4690:     if test -z "$pp_kit_package"; then
        !          4691:         pp_warn "pp_kit_package not specified, using YYYY"
        !          4692:         pp_kit_package=YYYY
        !          4693:     fi
        !          4694:     if test -z "$pp_kit_version"; then
        !          4695:         pp_kit_version=`echo $version|tr -d '.a-zA-Z'`
        !          4696:     fi
        !          4697:     case "$pp_kit_version" in
        !          4698:         [0-9]) pp_kit_version="${pp_kit_version}00";;
        !          4699:         [0-9][0-9]) pp_kit_version="${pp_kit_version}0";;
        !          4700:         [0-9][0-9][0-9]) : ok;;
        !          4701:         *) pp_error "\$pp_kit_version $pp_kit_version must be three digits, ";;
        !          4702:     esac
        !          4703:     if test -z "$pp_kit_subset"; then
        !          4704:         pp_kit_subset="$pp_kit_name$pp_kit_package$pp_kit_version"
        !          4705:     fi
        !          4706:     echo "$pp_kit_subset.tar.gz"
        !          4707: }
        !          4708: 
        !          4709: pp_backend_kit_install_script () {
        !          4710:     typeset pkgname platform
        !          4711: 
        !          4712:     pkgname=`pp_backend_kit_names`
        !          4713:     platform="`pp_backend_kit_probe`"
        !          4714: 
        !          4715:     echo "#!/bin/sh"
        !          4716:     pp_install_script_common
        !          4717:     cat <<.
        !          4718: 
        !          4719:         cpt_to_tags () {
        !          4720:             test x"\$*" = x"all" && set -- $pp_components
        !          4721:             for cpt
        !          4722:             do
        !          4723:                 echo "$name.\$cpt"
        !          4724:             done
        !          4725:         }
        !          4726: 
        !          4727:         test \$# -eq 0 && usage
        !          4728:         op="\$1"; shift
        !          4729: 
        !          4730:         case "\$op" in
        !          4731:             list-components)
        !          4732:                 test \$# -eq 0 || usage \$op
        !          4733:                 echo "$pp_components"
        !          4734:                 ;;
        !          4735:             list-services)
        !          4736:                 test \$# -eq 0 || usage \$op
        !          4737:                 echo "$pp_services"
        !          4738:                 ;;
        !          4739:             list-files)
        !          4740:                 test \$# -ge 1 || usage \$op
        !          4741:                 echo \${PP_PKGDESTDIR:-.}/$pkgname
        !          4742:                 ;;
        !          4743:             install)
        !          4744:                 test \$# -ge 1 || usage \$op
        !          4745:                 verbose echo \${PP_PKGDESTDIR:-\`pwd\`}/$pkgname \`cpt_to_tags "\$@"\`
        !          4746:                 #verbose swinstall -x verbose=0 -s \${PP_PKGDESTDIR:-\`pwd\`}/$pkgname \`cpt_to_tags "\$@"\`
        !          4747:                 ;;
        !          4748:             uninstall)
        !          4749:                 test \$# -ge 1 || usage \$op
        !          4750:                 verbose echo \`cpt_to_tags "\$@"\`
        !          4751:                 #verbose swremove -x verbose=0 \`cpt_to_tags "\$@"\`
        !          4752:                 ;;
        !          4753:             start|stop)
        !          4754:                 test \$# -ge 1 || usage \$op
        !          4755:                 ec=0
        !          4756:                 for svc
        !          4757:                 do
        !          4758:                     verbose /sbin/init.d/\$svc \$op
        !          4759:                     [ \$? -eq 4 -o \$? -eq 0 ] || ec=1
        !          4760:                 done
        !          4761:                 exit \$ec
        !          4762:                 ;;
        !          4763:             print-platform)
        !          4764:                echo "$platform"
        !          4765:                ;;
        !          4766:             *)
        !          4767:                 usage
        !          4768:                 ;;
        !          4769:         esac
        !          4770: .
        !          4771: }
        !          4772: 
        !          4773: pp_backend_kit_function () {
        !          4774:     case "$1" in
        !          4775:         pp_mkgroup) cat <<'.';;
        !          4776:             grep "^$1:" /etc/group >/dev/null ||
        !          4777:                 /usr/sbin/groupadd $1
        !          4778: .
        !          4779:         pp_mkuser) cat <<'.';;
        !          4780:             eval user=\$$#
        !          4781:             grep "^$user:" /etc/passwd >/dev/null ||
        !          4782:                 /usr/sbin/useradd -s /usr/bin/false "$@"
        !          4783: .
        !          4784:         pp_havelib) cat <<'.';;
        !          4785:             for dir in `echo /usr/lib${3+:$3} | tr : ' '`; do
        !          4786:                 test -r "$dir/lib$1.${2-sl}" && return 0
        !          4787:             done
        !          4788:             return 1
        !          4789: .
        !          4790:         *) pp_error "unknown function request: $1";;
        !          4791:     esac
        !          4792: }
        !          4793: 
        !          4794: pp_backend_kit_init_svc_vars () {
        !          4795:     :
        !          4796: }
        !          4797: 
        !          4798: pp_backend_kit_probe () {
        !          4799:     echo tru64-`uname -r | sed 's/V\([0-9]*\)\.\([0-9]*\)/\1\2/'`
        !          4800: }
        !          4801: 
        !          4802: pp_kit_service_group_script () {
        !          4803:     typeset grp svcs scriptpath out
        !          4804:     grp="$1"
        !          4805:     svcs="$2"
        !          4806:     scriptpath="/sbin/init.d/$grp"
        !          4807:     out="$pp_destdir$scriptpath"
        !          4808: 
        !          4809:     pp_add_file_if_missing $scriptpath run 755 || return 0
        !          4810: 
        !          4811:     cat <<-. > $out
        !          4812:        #!/sbin/sh
        !          4813:        # generated by pp $pp_version
        !          4814:        svcs="$svcs"
        !          4815: .
        !          4816: 
        !          4817: cat <<-'.' >> $out
        !          4818:        #-- starts services in order.. stops them all if any break
        !          4819:        pp_start () {
        !          4820:            undo=
        !          4821:            for svc in $svcs; do
        !          4822:                /sbin/init.d/$svc start
        !          4823:                case $? in
        !          4824:                    0|4)
        !          4825:                        undo="$svc $undo"
        !          4826:                        ;;
        !          4827:                    *)
        !          4828:                        if test -n "$undo"; then
        !          4829:                        for svc in $undo; do
        !          4830:                            /sbin/init.d/$svc stop
        !          4831:                        done
        !          4832:                        return 1
        !          4833:                        fi
        !          4834:                        ;;
        !          4835:                esac
        !          4836:            done
        !          4837:            return 0
        !          4838:        }
        !          4839: 
        !          4840:        #-- stops services in reverse
        !          4841:        pp_stop () {
        !          4842:            reverse=
        !          4843:                for svc in $svcs; do
        !          4844:                    reverse="$svc $reverse"
        !          4845:                done
        !          4846:                rc=0
        !          4847:                for svc in $reverse; do
        !          4848:                    /sbin/init.d/$svc stop || rc=$?
        !          4849:                done
        !          4850:                return $rc
        !          4851:        }
        !          4852: 
        !          4853:        case $1 in
        !          4854:            start_msg) echo "Starting $svcs";;
        !          4855:        stop_msg)  echo "Stopping $svcs";;
        !          4856:        start)     pp_start;;
        !          4857:        stop)      pp_stop;;
        !          4858:        *)         echo "usage: $0 {start|stop|start_msg|stop_msg}"
        !          4859:            exit 1;;
        !          4860:        esac
        !          4861: .
        !          4862: }
        !          4863: 
        !          4864: pp_kit_service_script () {
        !          4865:     typeset svc scriptpath out
        !          4866: 
        !          4867:     svc="$1"
        !          4868:     scriptpath="/sbin/init.d/$svc"
        !          4869: 
        !          4870:     pp_load_service_vars "$svc"
        !          4871: 
        !          4872:     test -n "$user" -a x"$user" != x"root" &&
        !          4873:     cmd="SHELL=/usr/bin/sh /usr/bin/su $user -c \"exec `echo $cmd | sed -e 's,[$\\\`],\\&,g'`\""
        !          4874:     if test -z "$pidfile"; then
        !          4875:         pidfile="/var/run/$svc.pid"
        !          4876:         cmd="$cmd & echo \$! > \$pidfile"
        !          4877:     fi
        !          4878: 
        !          4879:     pp_add_file_if_missing $scriptpath run 755
        !          4880: 
        !          4881:     cat <<-. > $pp_destdir$scriptpath
        !          4882:        svc="$svc"
        !          4883:        pidfile="$pidfile"
        !          4884: 
        !          4885:        pp_start () {
        !          4886:            $cmd
        !          4887:        }
        !          4888: .
        !          4889:     cat <<-'.' >>$pp_destdir$scriptpath
        !          4890:            pp_stop () {
        !          4891:                if test ! -s "$pidfile"; then
        !          4892:                    echo "Unable to stop $svc (no pid file)"
        !          4893:                        return 1
        !          4894:                else
        !          4895:                    read pid < "$pidfile"
        !          4896:                    if kill -0 "$pid" 2>/dev/null; then
        !          4897:                        if kill -${stop_signal:-TERM} "$pid"; then
        !          4898:                            rm -f "$pidfile"
        !          4899:                            return 0
        !          4900:                        else
        !          4901:                            echo "Unable to stop $svc"
        !          4902:                            return 1
        !          4903:                        fi
        !          4904:                    else
        !          4905:                        rm -f "$pidfile"
        !          4906:                        return 0
        !          4907:                    fi
        !          4908:                fi
        !          4909:            }
        !          4910: 
        !          4911:            pp_running () {
        !          4912:                if test ! -s "$pidfile"; then
        !          4913:                    return 1
        !          4914:                else
        !          4915:                    read pid < "$pidfile"
        !          4916:                    kill -0 "$pid" 2>/dev/null
        !          4917:                fi
        !          4918:            }
        !          4919:            case $1 in
        !          4920:                start_msg) echo "Starting the $svc service";;
        !          4921:                stop_msg)  echo "Stopping the $svc service";;
        !          4922:                start)
        !          4923:                    if pp_running; then
        !          4924:                        echo "$svc already running";
        !          4925:                        exit 0
        !          4926:                    elif pp_start; then
        !          4927:                        echo "$svc started";
        !          4928:        # rc(1M) says we should exit 4, but nobody expects it!
        !          4929:                        exit 0
        !          4930:                    else
        !          4931:                        exit 1
        !          4932:                    fi
        !          4933:                    ;;
        !          4934:                stop)
        !          4935:                    if pp_stop; then
        !          4936:                        echo "$svc stopped";
        !          4937:                        exit 0
        !          4938:                    else
        !          4939:                        exit 1
        !          4940:                    fi
        !          4941:                    ;;
        !          4942:                *) echo "usage: $0 {start|stop|start_msg|stop_msg}"
        !          4943:                   exit 1
        !          4944:                   ;;
        !          4945:            esac
        !          4946: .
        !          4947: }
        !          4948: 
        !          4949: pp_kit_make_service () {
        !          4950:     typeset level priority startlevels stoplevels
        !          4951:     typeset svc svcvar
        !          4952: 
        !          4953:     svc="$1"
        !          4954:     svcvar=`pp_makevar $svc`
        !          4955: 
        !          4956:     #-- don't do anything if the script exists
        !          4957:     if test -s "$pp_destdir/sbin/init.d/$svc"; then
        !          4958:         pp_error "$pp_destdir/sbin/init.d/$svc exists"
        !          4959:         return
        !          4960:     fi
        !          4961: 
        !          4962:     # symlink the script, depending on the priorities chosen
        !          4963:     eval priority='${pp_kit_priority_'$svcvar'}'
        !          4964:     test -z "$priority" && priority="${pp_kit_priority:-50}"
        !          4965: 
        !          4966:     eval startlevels='${pp_kit_startlevels_'$svcvar'}'
        !          4967:     test -z "$startlevels" && startlevels="$pp_kit_startlevels"
        !          4968: 
        !          4969:     eval stoplevels='${pp_kit_stoplevels_'$svcvar'}'
        !          4970:     test -z "$stoplevels" && stoplevels="$pp_kit_stoplevels"
        !          4971: 
        !          4972:     # create the script and config file
        !          4973:     pp_kit_service_script $svc
        !          4974: 
        !          4975:     # fix the priority up
        !          4976:     case "$priority" in
        !          4977:         ???) :;;
        !          4978:         ??) priority=0$priority;;
        !          4979:         ?) priority=00$priority;;
        !          4980:     esac
        !          4981: 
        !          4982:     if test x"$stoplevels" = x"auto"; then
        !          4983:         stoplevels=
        !          4984:         test -z "$startlevels" || for level in $startlevels; do
        !          4985:             stoplevels="$stoplevels `expr $level - 1`"
        !          4986:         done
        !          4987:     fi
        !          4988: 
        !          4989:     # create the symlinks
        !          4990:     test -z "$startlevels" || for level in $startlevels; do
        !          4991:         echo "        ln -s /sbin/init.d/$svc /sbin/rc$level.d/S$priority$svc" >>$pp_wrkdir/%post.run
        !          4992:         echo "        rm /sbin/rc$level.d/S$priority$svc" >>$pp_wrkdir/%preun.run
        !          4993:     done
        !          4994:     test -z "$stoplevels" || for level in $stoplevels; do
        !          4995:         echo "        ln -s /sbin/init.d/$svc /sbin/rc$level.d/K$priority$svc" >>$pp_wrkdir/%post.run
        !          4996:         echo "        rm -f /sbin/rc$level.d/K$priority$svc" >>$pp_wrkdir/%preun.run
        !          4997:     done
        !          4998: }
        !          4999: 
        !          5000: 
        !          5001: 
        !          5002: 
        !          5003: pp_backend_kit_sizes () {
        !          5004:     awk '
        !          5005:     BEGIN { root = usr = var = 0; }
        !          5006:     {
        !          5007:         if (substr($9, 1, 1) != "l")
        !          5008:             if (substr($10, 1, 6) == "./var/")
        !          5009:                 var += $2;
        !          5010:             else if (substr($10, 1, 10) == "./usr/var/")
        !          5011:                 var += $2
        !          5012:             else if (substr($10, 1, 6) == "./usr/")
        !          5013:                 usr += $2
        !          5014:             else
        !          5015:                 root += $2
        !          5016:     }
        !          5017:     END { printf "%d\t%d\t%d", root, usr, var }
        !          5018:     ' "$@"
        !          5019: }
        !          5020: 
        !          5021: pp_kit_kits_global () {
        !          5022:     line=`sed -n '/^%%/q;/^'$2'=/{s/^'$2'=//p;q;}' <"$1"`
        !          5023:     test -z "$line" && return 1
        !          5024:     eval "echo $line"
        !          5025:     :
        !          5026: }
        !          5027: 
        !          5028: pp_backend_kit_kits () {
        !          5029:     typeset KITFILE FROMDIR TODIR
        !          5030:     typeset SCPDIR
        !          5031: 
        !          5032:     SCPDIR="$pp_wrkdir/scps"
        !          5033: 
        !          5034:     PATH="/usr/lbin:/usr/bin:/etc:/usr/ucb:$PATH"; export PATH # XXX
        !          5035:     #umask 2 # XXX
        !          5036: 
        !          5037:     test $# -ge 3 || pp_die "pp_backend_kit_kits: too few arguments"
        !          5038:     KITFILE="$1"; shift
        !          5039:     FROMDIR="$1"; shift
        !          5040:     TODIR="$1"; shift
        !          5041: 
        !          5042:     test -f "$KITFILE" || pp_die "$KITFILE not found"
        !          5043:     test -d "$FROMDIR" || pp_die "$FROMDIR not found"
        !          5044:     test -d "$TODIR"   || pp_die "$TODIR not found"
        !          5045: 
        !          5046:     INSTCTRL="$TODIR/instctrl"
        !          5047:     mkdir -p "$INSTCTRL" || pp_die "cannot create instctrl directory"
        !          5048:     chmod 775 "$INSTCTRL"
        !          5049: 
        !          5050:     grep "%%" $KITFILE > /dev/null || pp_die "no %% in $KITFILE"
        !          5051: 
        !          5052:     typeset NAME CODE VERS MI ROOT COMPRESS
        !          5053:     typeset S_LIST ALLSUBS
        !          5054: 
        !          5055:     NAME=`pp_kit_kits_global "$KITFILE" NAME` || pp_die "no NAME in $KITFILE"
        !          5056:     CODE=`pp_kit_kits_global "$KITFILE" CODE` || pp_die "no CODE in $KITFILE"
        !          5057:     VERS=`pp_kit_kits_global "$KITFILE" VERS` || pp_die "no VERS in $KITFILE"
        !          5058:     MI=`pp_kit_kits_global "$KITFILE" MI` || pp_die "no MI in $KITFILE"
        !          5059:     ROOT=`pp_kit_kits_global "$KITFILE" ROOT`
        !          5060:     COMPRESS=`pp_kit_kits_global "$KITFILE" COMPRESS`
        !          5061: 
        !          5062:     test -f "$MI" || pp_die "Inventory file $MI not found"
        !          5063: 
        !          5064:     case "$ROOT" in
        !          5065:     *ROOT)
        !          5066:         test -f "$TODIR/$ROOT" ||
        !          5067:             pp_die "Root image $ROOT not found in $TODIR" ;;
        !          5068:     esac
        !          5069: 
        !          5070:     ALLSUBS=`awk 'insub==1 {print $1} /^%%/ {insub=1}' <"$KITFILE"`
        !          5071:     test $# -eq 0 && set -- $ALLSUBS
        !          5072: 
        !          5073:     pp_debug "Creating $# $NAME subsets."
        !          5074:     pp_debug "ALLSUBS=<$ALLSUBS>"
        !          5075: 
        !          5076:     if test x"$COMPRESS" = x"1"; then
        !          5077:         COMPRESS=:
        !          5078:     else
        !          5079:         COMPRESS=false
        !          5080:     fi
        !          5081: 
        !          5082:     #rm -f *.ctrl Volume*
        !          5083: 
        !          5084:     for SUB
        !          5085:     do
        !          5086:         test -z "$SUB" && pp_die "SUB is empty"
        !          5087: 
        !          5088:         typeset INV CTRL ROOTSIZE USRSIZE VARSIZE TSSUB
        !          5089:        #rm -f Volume*
        !          5090:        case $SUB in
        !          5091:             .*) :;;
        !          5092:            *)  pp_verbose rm -f "$TODIR/$SUB"* "$INSTCTRL/$SUB"*;;
        !          5093:         esac
        !          5094: 
        !          5095:         TSSUB="$pp_wrkdir/ts.$SUB"
        !          5096: 
        !          5097:        pp_debug "kits: Subset $SUB"
        !          5098: 
        !          5099:        INV="$SUB.inv"
        !          5100:        CTRL="$SUB.ctrl"
        !          5101:        pp_debug "kits: Generating media creation information..."
        !          5102: 
        !          5103:         # Invcutter takes as input
        !          5104:         #   SUB dir/path
        !          5105:         # and generates stl_inv(4) files, like this
        !          5106:         #   f 0 00000 0 0 100644 2/11/09 010 f dir/path none SUB
        !          5107:        grep "  $SUB\$" "$MI" |
        !          5108:             pp_verbose /usr/lbin/invcutter \
        !          5109:                 -v "$VERS" -f "$FROMDIR" > "$INSTCTRL/$INV" ||
        !          5110:             pp_die "failed to create $INSTCTRL/$INV"
        !          5111:         chmod 664 "$INSTCTRL/$INV"
        !          5112: 
        !          5113:         pp_backend_kit_sizes "$INSTCTRL/$INV" > "$pp_wrkdir/kit.sizes"
        !          5114:         read ROOTSIZE USRSIZE VARSIZE < "$pp_wrkdir/kit.sizes"
        !          5115: 
        !          5116:         # Prefix each line with $FROMDIR. This will be stripped
        !          5117:         awk '$1 != "d" {print from $10}' from="$FROMDIR/" \
        !          5118:             > "$TSSUB" < "$INSTCTRL/$INV" ||
        !          5119:             pp_die "failed"
        !          5120: 
        !          5121:         NVOLS=0
        !          5122: 
        !          5123:        pp_debug "kits: Creating $SUB control file..."
        !          5124: 
        !          5125:         sed '1,/^%%/d;/^'"$SUB"'/{p;q;}' < "$KITFILE" > "$pp_wrkdir/kit.line"
        !          5126:         read _SUB _IGNOR DEPS FLAGS DESC < "$pp_wrkdir/kit.line"
        !          5127:         if test -z "$_SUB"; then
        !          5128:             pp_warn "No such subset $SUB in $KITFILE"
        !          5129:             continue
        !          5130:        fi
        !          5131:         DEPS=`echo $DEPS | tr '|' ' '`
        !          5132:         case $FLAGS in
        !          5133:             FLGEXP*) pp_verbose FLAGS='"${'"$FLAGS"'}"' ;;
        !          5134:         esac
        !          5135:         case $DESC in
        !          5136:             *%*) DESC=`echo $DESC|awk -F% '{printf "%-36s%%%s\n", $1, $2}'`;;
        !          5137:         esac
        !          5138: 
        !          5139:        cat > "$INSTCTRL/$CTRL" <<-.
        !          5140:                NAME='$NAME $SUB'
        !          5141:                DESC=$DESC
        !          5142:                ROOTSIZE=$ROOTSIZE
        !          5143:                USRSIZE=$USRSIZE
        !          5144:                VARSIZE=$VARSIZE
        !          5145:                NVOLS=1:$NVOLS
        !          5146:                MTLOC=1:$TLOC
        !          5147:                DEPS="$DEPS"
        !          5148:                FLAGS=$FLAGS
        !          5149: .
        !          5150:         chmod 664 "$INSTCTRL/$CTRL"
        !          5151: 
        !          5152:        pp_debug "kits: Making tar image"
        !          5153: 
        !          5154:        pp_verbose tar cfPR "$TODIR/$SUB" "$FROMDIR/" "$TSSUB" ||
        !          5155:              pp_error "problem creating kit file"
        !          5156: 
        !          5157:         if $COMPRESS; then
        !          5158:             pp_debug "kits: Compressing"
        !          5159:             (cd "$TODIR" && compress -f -v "$SUB") ||
        !          5160:                 pp_die "problem compressing $TODIR/$SUB"
        !          5161:             SPC=`expr $SUB : '\(...\).*'`    # first three characters
        !          5162:             SVC=`expr $SUB : '.*\(...\)'`    # last three characters
        !          5163:             : > "$INSTCTRL/$SPC$SVC.comp"
        !          5164:             chmod 664 "$INSTCTRL/$SPC$SVC.comp"
        !          5165:             pp_debug "kits: Padding compressed file to 10kB" # wtf?
        !          5166:             rm -f "$TODIR/$SUB"
        !          5167:             pp_verbose \
        !          5168:             dd if="$TODIR/$SUB.Z" of="$TODIR/$SUB" bs=10k conv=sync ||
        !          5169:                 pp_die "problem moving compressed file"
        !          5170:             rm -f "$TODIR/$SUB.Z"
        !          5171:         fi
        !          5172:         chmod 664 "$TODIR/$SUB"
        !          5173: 
        !          5174:        if test -f "$SCPDIR/$SUB.scp"; then
        !          5175:                cp "$SCPDIR/$SUB.scp" "$INSTCTRL/$SUB.scp"
        !          5176:                 chmod 755 "$INSTCTRL/$SUB.scp"
        !          5177:        else
        !          5178:                pp_debug "kits: null subset control program for $SUB"
        !          5179:                : > "$INSTCTRL/$SUB.scp"
        !          5180:                chmod 744 "$INSTCTRL/$SUB.scp"
        !          5181:        fi
        !          5182: 
        !          5183:         pp_debug "kits: Finished creating media image for $SUB"
        !          5184:     done
        !          5185: 
        !          5186:     pp_debug "kits: Creating $CODE.image"
        !          5187: 
        !          5188:     case "$ROOT" in
        !          5189:     *ROOT)     ALLSUBS="$ROOT $ALLSUBS"
        !          5190:                 ;;
        !          5191:     esac
        !          5192: 
        !          5193:     (cd "$TODIR" && sum $ALLSUBS) > "$INSTCTRL/$CODE.image"
        !          5194:     chmod 664 "$INSTTRL/$CODE.image"
        !          5195:     pp_debug "kits: Creating INSTCTRL"
        !          5196:     (cd "$INSTCTRL" && tar cpvf - *) > "$TODIR/INSTCTRL"
        !          5197:     chmod 664 "$TODIR/INSTCTRL"
        !          5198:     cp "$INSTCTRL/$CODE.image" "$TODIR/$CODE.image"
        !          5199:     chmod 664 "$TODIR/$CODE.image"
        !          5200: 
        !          5201:     pp_debug "kits: Media image production complete"
        !          5202: }
        !          5203: 
        !          5204: pp_platforms="$pp_platforms rpm"
        !          5205: 
        !          5206: pp_backend_rpm_detect () {
        !          5207:     test x"$1" = x"Linux" -a ! -f /etc/debian_version
        !          5208: }
        !          5209: 
        !          5210: pp_backend_rpm_init () {
        !          5211: 
        !          5212:     pp_rpm_version=
        !          5213:     pp_rpm_summary=
        !          5214:     pp_rpm_description=
        !          5215:     pp_rpm_group="Applications/Internet"
        !          5216:     pp_rpm_license="Unspecified"
        !          5217:     pp_rpm_vendor=
        !          5218:     pp_rpm_url=
        !          5219:     pp_rpm_packager=
        !          5220:     pp_rpm_provides=
        !          5221:     pp_rpm_requires=
        !          5222:     pp_rpm_release=
        !          5223:     pp_rpm_epoch=
        !          5224:     pp_rpm_dev_group="Development/Libraries"
        !          5225:     pp_rpm_dbg_group="Development/Tools"
        !          5226:     pp_rpm_doc_group="Documentation"
        !          5227:     pp_rpm_dev_description=
        !          5228:     pp_rpm_dbg_description=
        !          5229:     pp_rpm_doc_description=
        !          5230:     pp_rpm_dev_requires=
        !          5231:     pp_rpm_dbg_requires=
        !          5232:     pp_rpm_doc_requires=
        !          5233:     pp_rpm_dev_provides=
        !          5234:     pp_rpm_dbg_provides=
        !          5235:     pp_rpm_doc_provides=
        !          5236: 
        !          5237:     pp_rpm_dbg_pkgname=debug
        !          5238:     pp_rpm_dev_pkgname=devel
        !          5239:     pp_rpm_doc_pkgname=doc
        !          5240: 
        !          5241:     pp_rpm_defattr_uid=root
        !          5242:     pp_rpm_defattr_gid=root
        !          5243: 
        !          5244:     pp_rpm_detect_arch
        !          5245:     pp_rpm_detect_distro
        !          5246:     pp_rpm_rpmbuild=`pp_rpm_detect_rpmbuild`
        !          5247: 
        !          5248:     # SLES8 doesn't always come with readlink
        !          5249:     test -x /usr/bin/readlink -o -x /bin/readlink ||
        !          5250:         pp_readlink_fn=pp_ls_readlink
        !          5251: }
        !          5252: 
        !          5253: pp_rpm_detect_arch () {
        !          5254:     pp_rpm_arch=auto
        !          5255: 
        !          5256:     #-- Find the default native architecture that RPM is configured to use
        !          5257:     cat <<-. >$pp_wrkdir/dummy.spec
        !          5258:        Name: dummy
        !          5259:        Version: 1
        !          5260:        Release: 1
        !          5261:        Summary: dummy
        !          5262:        Group: ${pp_rpm_group}
        !          5263:        License: ${pp_rpm_license}
        !          5264:        %description
        !          5265:        dummy
        !          5266: .
        !          5267:     $pp_opt_debug && cat $pp_wrkdir/dummy.spec
        !          5268:     pp_rpm_arch_local=`rpm -q --qf '%{arch}\n' --specfile $pp_wrkdir/dummy.spec`
        !          5269:     rm $pp_wrkdir/dummy.spec
        !          5270: 
        !          5271:     #-- Ask the kernel what machine architecture is in use
        !          5272:     local arch
        !          5273:     for arch in "`uname -m`" "`uname -p`"; do
        !          5274:        case "$arch" in
        !          5275:            i?86)
        !          5276:                pp_rpm_arch_std=i386
        !          5277:                break
        !          5278:                ;;
        !          5279:            x86_64|ppc|ppc64|ia64|s390|s390x)
        !          5280:                pp_rpm_arch_std="$arch"
        !          5281:                break
        !          5282:                ;;
        !          5283:            powerpc)
        !          5284:                # Probably AIX
        !          5285:                case "`/usr/sbin/lsattr -El proc0 -a type -F value`" in
        !          5286:                    PowerPC_POWER*)     pp_rpm_arch_std=ppc64;;
        !          5287:                    *)                  pp_rpm_arch_std=ppc;;
        !          5288:                esac
        !          5289:                break
        !          5290:                ;;
        !          5291:            *)  pp_rpm_arch_std=unknown
        !          5292:                ;;
        !          5293:        esac
        !          5294:     done
        !          5295: 
        !          5296:     #-- Later on, when files are processed, we use 'file' to determine
        !          5297:     #   what platform ABIs are used. This is used when pp_rpm_arch == auto
        !          5298:     pp_rpm_arch_seen=
        !          5299: }
        !          5300: 
        !          5301: pp_rpm_detect_distro () {
        !          5302:     pp_rpm_distro=
        !          5303:     if test -f /etc/whitebox-release; then
        !          5304:        pp_rpm_distro=`awk '
        !          5305:           /^White Box Enterprise Linux release/ { print "wbel" $6; exit; }
        !          5306:        ' /etc/whitebox-release`
        !          5307:     elif test -f /etc/mandrakelinux-release; then
        !          5308:        pp_rpm_distro=`awk '
        !          5309:           /^Mandrakelinux release/ { print "mand" $3; exit; }
        !          5310:        ' /etc/mandrake-release`
        !          5311:     elif test -f /etc/mandrake-release; then
        !          5312:        pp_rpm_distro=`awk '
        !          5313:           /^Linux Mandrake release/ { print "mand" $4; exit; }
        !          5314:           /^Mandrake Linux release/ { print "mand" $4; exit; }
        !          5315:        ' /etc/mandrake-release`
        !          5316:     elif test -f /etc/fedora-release; then
        !          5317:        pp_rpm_distro=`awk '
        !          5318:           /^Fedora Core release/ { print "fc" $4; exit; }
        !          5319:           /^Fedora release/ { print "f" $3; exit; }
        !          5320:        ' /etc/fedora-release`
        !          5321:     elif test -f /etc/redhat-release; then
        !          5322:        pp_rpm_distro=`awk '
        !          5323:           /^Red Hat Enterprise Linux/ { print "rhel" $7; exit; }
        !          5324:           /^CentOS release/           { print "centos" $3; exit; }
        !          5325:           /^Red Hat Linux release/    { print "rh" $5; exit; }
        !          5326:        ' /etc/redhat-release`
        !          5327:     elif test -f /etc/SuSE-release; then
        !          5328:        pp_rpm_distro=`awk '
        !          5329:           /^SuSE Linux [0-9]/ { print "suse" $3; exit; }
        !          5330:           /^SUSE LINUX [0-9]/ { print "suse" $3; exit; }
        !          5331:           /^openSUSE [0-9]/   { print "suse" $2; exit; }
        !          5332:           /^S[uU]SE Linux Enterprise Server [0-9]/ { print "sles" $5; exit; }
        !          5333:           /^S[uU]SE LINUX Enterprise Server [0-9]/ { print "sles" $5; exit; }
        !          5334:           /^SuSE SLES-[0-9]/  { print "sles" substr($2,6); exit; }
        !          5335:        ' /etc/SuSE-release`
        !          5336:     elif test -f /etc/pld-release; then
        !          5337:        pp_rpm_distro=`awk '
        !          5338:           /^[^ ]* PLD Linux/ { print "pld" $1; exit; }
        !          5339:        ' /etc/pld-release`
        !          5340:     elif test X"`uname -s 2>/dev/null`" = X"AIX"; then
        !          5341:        local r v
        !          5342:        r=`uname -r`
        !          5343:        v=`uname -v`
        !          5344:        pp_rpm_distro="aix$v$r"
        !          5345:     fi
        !          5346:     pp_rpm_distro=`echo $pp_rpm_distro | tr -d .`
        !          5347:     test -z "$pp_rpm_distro" &&
        !          5348:        pp_warn "unknown distro"
        !          5349: }
        !          5350: 
        !          5351: pp_rpm_detect_rpmbuild () {
        !          5352:     local cmd
        !          5353:     for cmd in rpmbuild rpm; do
        !          5354:         if `which $cmd > /dev/null 2>&1`; then
        !          5355:             echo $cmd
        !          5356:             return 0
        !          5357:         fi
        !          5358:     done
        !          5359: 
        !          5360:     pp_error "Could not find rpmbuild"
        !          5361:     # Default to `rpmbuild` in case it magically appears
        !          5362:     echo rpmbuild
        !          5363:     return 1
        !          5364: }
        !          5365: 
        !          5366: pp_rpm_label () {
        !          5367:     local label arg
        !          5368:     label="$1"; shift
        !          5369:     for arg
        !          5370:     do
        !          5371:         test -z "$arg" || echo "$label: $arg"
        !          5372:     done
        !          5373: }
        !          5374: 
        !          5375: pp_rpm_writefiles () {
        !          5376:     local _l t m o g f p st fo farch
        !          5377:     while read t m o g f p st; do
        !          5378:         _l="$p"
        !          5379:        test $t = d && _l="%dir ${_l%/}/"
        !          5380:         if test x"$m" = x"-"; then
        !          5381:             case "$t" in
        !          5382:                 d) m=755;;
        !          5383:                 f) m=644;;
        !          5384:             esac
        !          5385:         fi
        !          5386:         test x"$o" = x"-" && o="${pp_rpm_defattr_uid:-root}"
        !          5387:         test x"$g" = x"-" && g="${pp_rpm_defattr_gid:-root}"
        !          5388:        _l="%attr($m,$o,$g) $_l"
        !          5389: 
        !          5390:        if test "$t" = "f" -a x"$pp_rpm_arch" = x"auto"; then
        !          5391:            fo=`file "${pp_destdir}$p" 2>/dev/null`
        !          5392:            #NB: The following should match executables and shared objects,
        !          5393:            #relocatable objects. It will not match .a files however.
        !          5394:            case "$fo" in
        !          5395:                *": ELF 32-bit LSB "*", Intel 80386"*)
        !          5396:                    farch=i386;;
        !          5397:                *": ELF 64-bit LSB "*", AMD x86-64"*|\
        !          5398:                *": ELF 64-bit LSB "*", x86-64"*)
        !          5399:                    farch=x86_64;;
        !          5400:                *": ELF 32-bit MSB "*", PowerPC"*)
        !          5401:                    farch=ppc;;
        !          5402:                *": ELF 64-bit LSB "*", IA-64"*)
        !          5403:                    farch=ia64;;
        !          5404:                *": ELF 32-bit MSB "*", IBM S/390"*)
        !          5405:                    farch=s390;;
        !          5406:                *": ELF 64-bit MSB "*", IBM S/390"*)
        !          5407:                    farch=s390x;;
        !          5408:                *"executable (RISC System/6000)"*)
        !          5409:                    farch=ppc;;
        !          5410:                *"64-bit XCOFF executable"*)
        !          5411:                    farch=ppc64;;
        !          5412:                *" ELF "*)
        !          5413:                    farch=ELF;;
        !          5414:                *)
        !          5415:                    farch=noarch;;
        !          5416:            esac
        !          5417:            # If file(1) doesn't provide enough info, try readelf(1)
        !          5418:            if test "$farch" = "ELF"; then
        !          5419:                fo=`readelf -h "${pp_destdir}$p" | awk '{if ($1 == "Class:") {class=$2} else if ($1 == "Machine:") {machine=$0; sub(/^ *Machine: */, "", machine)}} END {print class " " machine}' 2>/dev/null`
        !          5420:                case "$fo" in
        !          5421:                    "ELF32 Intel 80386")
        !          5422:                        farch=i386;;
        !          5423:                    "ELF64 "*[xX]"86-64")
        !          5424:                        farch=x86_64;;
        !          5425:                    "ELF32 PowerPC")
        !          5426:                        farch=ppc;;
        !          5427:                    "ELF64 PowerPC")
        !          5428:                        farch=ppc64;;
        !          5429:                    "ELF64 IA-64")
        !          5430:                        farch=ia64;;
        !          5431:                    "ELF32 IBM S/390")
        !          5432:                        farch=s390;;
        !          5433:                    "ELF64 IBM S/390")
        !          5434:                        farch=s390x;;
        !          5435:                    *)
        !          5436:                        farch=noarch;;
        !          5437:                esac
        !          5438:            fi
        !          5439:            pp_debug "file: $fo -> $farch"
        !          5440:            test x"$farch" = x"noarch" || pp_add_to_list pp_rpm_arch_seen $farch
        !          5441:        fi
        !          5442: 
        !          5443:        case $f in *v*) _l="%config(noreplace) $_l";; esac
        !          5444:        echo "$_l"
        !          5445:     done
        !          5446:     echo
        !          5447: }
        !          5448: 
        !          5449: pp_rpm_subname () {
        !          5450:     case "$1" in
        !          5451:         run) : ;;
        !          5452:         dbg) echo "${2}${pp_rpm_dbg_pkgname}";;
        !          5453:         dev) echo "${2}${pp_rpm_dev_pkgname}";;
        !          5454:         doc) echo "${2}${pp_rpm_doc_pkgname}";;
        !          5455:         *)   pp_error "unknown component '$1'";
        !          5456:     esac
        !          5457: }
        !          5458: 
        !          5459: pp_rpm_depend () {
        !          5460:     while read _name _vers; do
        !          5461:         case "$_name" in ""| "#"*) continue ;; esac
        !          5462:         echo "Requires: $_name ${_vers:+>= $_vers}"
        !          5463:     done
        !          5464: }
        !          5465: 
        !          5466: pp_rpm_override_requires () {
        !          5467:     local orig_find_requires
        !          5468: 
        !          5469:     if test -z "$pp_rpm_depend_filter_cmd"; then
        !          5470:        return 0
        !          5471:     fi
        !          5472: 
        !          5473:     orig_find_requires=`rpm --eval '%{__find_requires}'`
        !          5474:     cat << EOF > "$pp_wrkdir/filtered-find-requires"
        !          5475: $orig_find_requires \$@ | $pp_rpm_depend_filter_cmd
        !          5476: EOF
        !          5477:     chmod +x "$pp_wrkdir/filtered-find-requires"
        !          5478:     echo "%define __find_requires $pp_wrkdir/filtered-find-requires"
        !          5479:     # Might be necessary for old versions of RPM? Not for 4.4.2.
        !          5480:     #echo "%define _use_internal_dependency_generator 0"
        !          5481: }
        !          5482: 
        !          5483: pp_backend_rpm () {
        !          5484:     local cmp specfile _summary _group _desc _pkg _subname svc
        !          5485: 
        !          5486:        specfile=$pp_wrkdir/$name.spec
        !          5487:         : > $specfile
        !          5488: 
        !          5489:         #-- force existence of a 'run' component
        !          5490:         pp_add_component run
        !          5491:         : >> $pp_wrkdir/%files.run
        !          5492: 
        !          5493:        if test -z "$pp_rpm_arch"; then
        !          5494:             pp_error "Unknown RPM architecture"
        !          5495:             return 1
        !          5496:         fi
        !          5497: 
        !          5498:        #-- Write the header components of the RPM spec file
        !          5499:        cat <<-. >>$specfile
        !          5500:                Name: ${pp_rpm_name:-$name}
        !          5501:                Version: ${pp_rpm_version:-$version}
        !          5502:                Release: ${pp_rpm_release:-1}
        !          5503:                Summary: ${pp_rpm_summary:-$summary}
        !          5504:                Group:   ${pp_rpm_group}
        !          5505:                License: ${pp_rpm_license}
        !          5506: .
        !          5507:        if test -n "$pp_rpm_url"; then
        !          5508:            pp_rpm_label "URL"  "$pp_rpm_url"               >>$specfile
        !          5509:        fi
        !          5510:        pp_rpm_label "Vendor"   "${pp_rpm_vendor:-$vendor}" >>$specfile
        !          5511:        pp_rpm_label "Packager" "$pp_rpm_packager"          >>$specfile
        !          5512:        pp_rpm_label "Provides" "$pp_rpm_provides"          >>$specfile
        !          5513:        pp_rpm_label "Requires" "$pp_rpm_requires"          >>$specfile
        !          5514: 
        !          5515:        test -n "$pp_rpm_serial" && pp_warn "pp_rpm_serial deprecated"
        !          5516:        if test -n "$pp_rpm_epoch"; then
        !          5517:            #-- Epoch was introduced in RPM 2.5.6
        !          5518:            case `$pp_rpm_rpmbuild --version 2>/dev/null` in
        !          5519:                1.*|2.[0-5].*|2.5.[0-5])
        !          5520:                    pp_rpm_label "Serial" $pp_rpm_epoch >>$specfile;;
        !          5521:                *)
        !          5522:                    pp_rpm_label "Epoch" $pp_rpm_epoch >>$specfile;;
        !          5523:            esac
        !          5524:        fi
        !          5525: 
        !          5526:         if test -n "$pp_rpm_requires"; then
        !          5527:             pp_rpm_label "Requires" "$pp_rpm_requires" >>$specfile
        !          5528:         elif test -s $pp_wrkdir/%depend.run; then
        !          5529:             pp_rpm_depend < $pp_wrkdir/%depend.run >> $specfile
        !          5530:         fi
        !          5531: 
        !          5532:        pp_rpm_override_requires >> $specfile
        !          5533: 
        !          5534:        cat <<-. >>$specfile
        !          5535: 
        !          5536:                %description
        !          5537:                ${pp_rpm_description:-$description}
        !          5538: .
        !          5539: 
        !          5540:        for cmp in $pp_components; do
        !          5541:                case $cmp in
        !          5542:                   run) continue;;
        !          5543:                   dev) _summary="development tools for $pp_rpm_summary"
        !          5544:                        _group="$pp_rpm_dev_group"
        !          5545:                        _desc="${pp_rpm_dev_description:-Development libraries for $name. $pp_rpm_description.}"
        !          5546:                        ;;
        !          5547:                   doc) _summary="documentation for $pp_rpm_summary"
        !          5548:                        _group="$pp_rpm_doc_group"
        !          5549:                        _desc="${pp_rpm_doc_description:-Documentation for $name. $pp_rpm_description.}"
        !          5550:                        ;;
        !          5551:                   dbg) _summary="diagnostic tools for $pp_rpm_summary"
        !          5552:                        _group="$pp_rpm_dbg_group"
        !          5553:                        _desc="${pp_rpm_dbg_description:-Diagnostic tools for $name.}"
        !          5554:                        ;;
        !          5555:                esac
        !          5556: 
        !          5557:                 _subname=`pp_rpm_subname $cmp`
        !          5558:                cat <<-.
        !          5559: 
        !          5560:                        %package $_subname
        !          5561:                        Summary: $name $_summary
        !          5562:                        Group: $_group
        !          5563: .
        !          5564:                 eval '_pkg="$pp_rpm_'$cmp'_requires"'
        !          5565:                 if test -n "$_pkg"; then
        !          5566:                     eval pp_rpm_label Requires ${pp_rpm_name:-$name} $_pkg
        !          5567:                 elif test -s $pp_wrkdir/%depend.$cmp; then
        !          5568:                     pp_rpm_depend < $pp_wrkdir/%depend.$cmp >> $specfile
        !          5569:                 fi
        !          5570: 
        !          5571:                 eval '_pkg="$pp_rpm_'$cmp'_provides"'
        !          5572:                eval pp_rpm_label Provides $_pkg
        !          5573: 
        !          5574:                cat <<-.
        !          5575: 
        !          5576:                        %description $_subname
        !          5577:                        $_desc
        !          5578: .
        !          5579:        done >>$specfile
        !          5580: 
        !          5581:         #-- NB: we don't put any %prep, %build or %install RPM sections
        !          5582:        #   into the spec file.
        !          5583: 
        !          5584:         #-- add service start/stop code
        !          5585:         if test -n "$pp_services"; then
        !          5586:             pp_rpm_service_install_common >> $pp_wrkdir/%post.run
        !          5587: 
        !          5588:             #-- record the uninstall commands in reverse order
        !          5589:             for svc in $pp_services; do
        !          5590:                 pp_load_service_vars $svc
        !          5591: 
        !          5592:                 pp_rpm_service_make_init_script $svc
        !          5593: 
        !          5594:                 #-- append %post code to install the svc
        !          5595:                 pp_rpm_service_install $svc >> $pp_wrkdir/%post.run
        !          5596: 
        !          5597:                 #-- prepend %preun code to uninstall svc
        !          5598:                 # (use files in case vars are modified)
        !          5599:                 pp_rpm_service_remove $svc | pp_prepend $pp_wrkdir/%preun.run
        !          5600:             done
        !          5601:             pp_rpm_service_remove_common | pp_prepend $pp_wrkdir/%preun.run
        !          5602:         fi
        !          5603: 
        !          5604:        # make convenience service groups
        !          5605:         if test -n "$pp_service_groups"; then
        !          5606:            for grp in $pp_service_groups; do
        !          5607:                pp_rpm_service_group_make_init_script \
        !          5608:                    $grp "`pp_service_get_svc_group $grp`"
        !          5609:            done
        !          5610:        fi
        !          5611: 
        !          5612:        #-- Write the RPM %file sections
        !          5613:         #   (do this after services, since services adds to %files.run)
        !          5614:        for cmp in $pp_components; do
        !          5615:             _subname=`pp_rpm_subname $cmp`
        !          5616: 
        !          5617:             if test -s $pp_wrkdir/%check.$cmp; then
        !          5618:                 echo ""
        !          5619:                 echo "%pre $_subname"
        !          5620:                 cat $pp_wrkdir/%check.$cmp
        !          5621:                 echo :   # causes script to exit true by default
        !          5622:             fi
        !          5623: 
        !          5624:             if test -s $pp_wrkdir/%files.$cmp; then
        !          5625:                 echo ""
        !          5626:                 echo "%files $_subname"
        !          5627:                 pp_rpm_writefiles < $pp_wrkdir/%files.$cmp
        !          5628:             fi
        !          5629: 
        !          5630:             if test -n "$pp_rpm_ghost"; then
        !          5631:                 for ghost in $pp_rpm_ghost; do
        !          5632:                     echo "%ghost $ghost"
        !          5633:                 done
        !          5634:             fi
        !          5635: 
        !          5636:             if test -s $pp_wrkdir/%pre.$cmp; then
        !          5637:                 echo ""
        !          5638:                 echo "%pre $_subname"
        !          5639:                 cat $pp_wrkdir/%pre.$cmp
        !          5640:                 echo :   # causes script to exit true
        !          5641:             fi
        !          5642: 
        !          5643:             if test -s $pp_wrkdir/%post.$cmp; then
        !          5644:                 echo ""
        !          5645:                 echo "%post $_subname"
        !          5646:                 cat $pp_wrkdir/%post.$cmp
        !          5647:                 echo :   # causes script to exit true
        !          5648:             fi
        !          5649: 
        !          5650:             if test -s $pp_wrkdir/%preun.$cmp; then
        !          5651:                 echo ""
        !          5652:                 echo "%preun $_subname"
        !          5653:                 cat $pp_wrkdir/%preun.$cmp
        !          5654:                 echo :   # causes script to exit true
        !          5655:             fi
        !          5656:        done >>$specfile
        !          5657: 
        !          5658:         #-- create a suitable work area for rpmbuild
        !          5659:        cat <<-. >$pp_wrkdir/.rpmmacros
        !          5660:                %_topdir $pp_wrkdir
        !          5661:                # XXX Note escaped %% for use in headerSprintf
        !          5662:                %_rpmfilename   %%{ARCH}/%%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm
        !          5663:        .
        !          5664:        mkdir $pp_wrkdir/RPMS
        !          5665:        mkdir $pp_wrkdir/BUILD
        !          5666: 
        !          5667:        if test x"$pp_rpm_arch" = x"auto"; then
        !          5668:            #-- Reduce the arch_seen list to exactly one item
        !          5669:            case "$pp_rpm_arch_seen" in
        !          5670:                "i386 x86_64"|"x86_64 i386")
        !          5671:                    pp_rpm_arch_seen=x86_64;;
        !          5672:                *"s390 s390x"* | *"s390x s390"* )
        !          5673:                    pp_rpm_arch_seen=s390x;;
        !          5674:                *" "*)
        !          5675:                    pp_error "detected multiple targets: $pp_rpm_arch_seen"
        !          5676:                    pp_rpm_arch_seen=unknown;;      # not detected
        !          5677:                "")
        !          5678:                    pp_warn "detected no binaries: using target noarch"
        !          5679:                    pp_rpm_arch_seen=noarch;;
        !          5680:                *)
        !          5681:                    pp_debug "detected architecture $pp_rpm_arch_seen"
        !          5682:            esac
        !          5683:            pp_rpm_arch="$pp_rpm_arch_seen"
        !          5684:        fi
        !          5685: 
        !          5686:         . $pp_wrkdir/%fixup
        !          5687: 
        !          5688: $pp_opt_debug && cat $specfile
        !          5689: 
        !          5690:         pp_debug "creating: `pp_backend_rpm_names`"
        !          5691: 
        !          5692: pp_debug "pp_rpm_arch_seen = <${pp_rpm_arch_seen}>"
        !          5693: pp_debug "pp_rpm_arch = <${pp_rpm_arch}>"
        !          5694: 
        !          5695:        HOME=$pp_wrkdir \
        !          5696:        pp_verbose \
        !          5697:         $pp_rpm_rpmbuild -bb \
        !          5698:                --buildroot="$pp_destdir/" \
        !          5699:                 --target="${pp_rpm_arch}" \
        !          5700:                 --define='_unpackaged_files_terminate_build 0' \
        !          5701:                 --define='_use_internal_dependency_generator 0' \
        !          5702:                 `$pp_opt_debug && echo --verbose || echo --quiet` \
        !          5703:                 $pp_rpm_rpmbuild_extra_flags \
        !          5704:                $specfile ||
        !          5705:             pp_error "Problem creating RPM packages"
        !          5706: 
        !          5707:        for f in `pp_backend_rpm_names`; do
        !          5708:            # The package might be in an arch-specific subdir
        !          5709:            pkgfile=not-found
        !          5710:            for dir in $pp_wrkdir/RPMS/${pp_rpm_arch} $pp_wrkdir/RPMS; do
        !          5711:                if test -f $dir/$f; then
        !          5712:                    pkgfile=$dir/$f
        !          5713:                fi
        !          5714:            done
        !          5715:            if test x"$pkgfile" = x"not-found"; then
        !          5716:                 pp_error "Problem predicting RPM filename: $f"
        !          5717:            else
        !          5718:                ln $pkgfile $pp_wrkdir/$f
        !          5719:            fi
        !          5720:        done
        !          5721: }
        !          5722: 
        !          5723: pp_rpm_output_name () {
        !          5724:     echo "${pp_rpm_name:-$name}`pp_rpm_subname "$1" -`-${pp_rpm_version:-$version}-${pp_rpm_release:-1}.${pp_rpm_arch}.rpm"
        !          5725: }
        !          5726: 
        !          5727: pp_backend_rpm_names () {
        !          5728:     local cmp _subname
        !          5729:     for cmp in $pp_components; do
        !          5730:        pp_rpm_output_name $cmp
        !          5731:     done
        !          5732: }
        !          5733: 
        !          5734: pp_backend_rpm_cleanup () {
        !          5735:     :
        !          5736: }
        !          5737: 
        !          5738: pp_rpm_print_requires () {
        !          5739:     local _subname _name
        !          5740: 
        !          5741:     echo "CPU:$pp_rpm_arch"
        !          5742:     ## XXX should be lines of the form (from file/ldd/objdump)
        !          5743:     #    EXEC:/bin/sh
        !          5744:     #    RTLD:libc.so.4:open
        !          5745:     rpm -q --requires -p $pp_wrkdir/`pp_rpm_output_name $1` |sed -e '/^rpmlib(/d;s/ //g;s/^/RPM:/' | sort -u
        !          5746: }
        !          5747: 
        !          5748: pp_backend_rpm_install_script () {
        !          5749:     local cmp _subname
        !          5750: 
        !          5751:     echo "#!/bin/sh"
        !          5752:     pp_install_script_common
        !          5753: 
        !          5754:     cat <<.
        !          5755: 
        !          5756:         cmp_to_pkgname () {
        !          5757:            local oi name
        !          5758:            if test x"\$1" = x"--only-installed"; then
        !          5759:                #-- only print if installation detected
        !          5760:                oi=false
        !          5761:                shift
        !          5762:            else
        !          5763:                oi=true
        !          5764:            fi
        !          5765:             test x"\$*" = x"all" &&
        !          5766:                 set -- $pp_components
        !          5767:             for cmp
        !          5768:             do
        !          5769:                 case \$cmp in
        !          5770: .
        !          5771:     for cmp in $pp_components; do
        !          5772:         _subname=`pp_rpm_subname $cmp -`
        !          5773:          echo "$cmp) name=${pp_rpm_name:-$name}${_subname};;"
        !          5774:     done
        !          5775:     cat <<.
        !          5776:                 *) usage;;
        !          5777:                 esac
        !          5778:                if \$oi || rpm -q "\$name" >/dev/null 2>/dev/null; then
        !          5779:                    echo "\$name"
        !          5780:                fi
        !          5781:             done
        !          5782:         }
        !          5783: 
        !          5784: 
        !          5785:         cmp_to_pathname () {
        !          5786:             test x"\$*" = x"all" &&
        !          5787:                 set -- $pp_components
        !          5788:             for cmp
        !          5789:             do
        !          5790:                 case \$cmp in
        !          5791: .
        !          5792:     for cmp in $pp_components; do
        !          5793:         echo "$cmp) echo \${PP_PKGDESTDIR:-.}/`pp_rpm_output_name $cmp` ;;"
        !          5794:     done
        !          5795:     cat <<.
        !          5796:                 *) usage;;
        !          5797:                 esac
        !          5798:             done
        !          5799:         }
        !          5800: 
        !          5801:        print_requires () {
        !          5802:             test x"\$*" = x"all" &&
        !          5803:                 set -- $pp_components
        !          5804:             for cmp
        !          5805:             do
        !          5806:                 case \$cmp in
        !          5807: .
        !          5808:     for cmp in $pp_components; do
        !          5809:         echo "$cmp) cat <<'._end'"
        !          5810:        pp_rpm_print_requires $cmp
        !          5811:         echo "._end"; echo ';;'
        !          5812:     done
        !          5813:     cat <<.
        !          5814:                 *) usage;;
        !          5815:                 esac
        !          5816:             done
        !          5817:         }
        !          5818: 
        !          5819:         test \$# -eq 0 && usage
        !          5820:         op="\$1"; shift
        !          5821:         case "\$op" in
        !          5822:             list-components)
        !          5823:                 test \$# -eq 0 || usage \$op
        !          5824:                 echo $pp_components
        !          5825:                 ;;
        !          5826:             list-services)
        !          5827:                 test \$# -eq 0 || usage \$op
        !          5828:                 echo $pp_services
        !          5829:                 ;;
        !          5830:             list-files)
        !          5831:                 test \$# -ge 1 || usage \$op
        !          5832:                 cmp_to_pathname "\$@"
        !          5833:                 ;;
        !          5834:             install)
        !          5835:                 test \$# -ge 1 || usage \$op
        !          5836:                 verbose rpm -U --replacepkgs --oldpackage \
        !          5837:                     \`cmp_to_pathname "\$@"\`
        !          5838:                 ;;
        !          5839:             uninstall)
        !          5840:                 test \$# -ge 1 || usage \$op
        !          5841:                 pkgs=\`cmp_to_pkgname --only-installed "\$@"\`
        !          5842:                 if test -z "\$pkgs"; then
        !          5843:                     verbosemsg "nothing to uninstall"
        !          5844:                 else
        !          5845:                     verbose rpm -e \$pkgs
        !          5846:                 fi
        !          5847:                 ;;
        !          5848:             start|stop)
        !          5849:                 test \$# -ge 1 || usage \$op
        !          5850:                 ec=0
        !          5851:                 for svc
        !          5852:                 do
        !          5853:                     verbose /etc/init.d/\$svc \$op || ec=1
        !          5854:                 done
        !          5855:                 exit \$ec
        !          5856:                 ;;
        !          5857:             print-platform)
        !          5858:                 test \$# -eq 0 || usage \$op
        !          5859:                echo "linux-${pp_rpm_arch}"
        !          5860:                ;;
        !          5861:             print-requires)
        !          5862:                 test \$# -ge 1 || usage \$op
        !          5863:                 print_requires "\$@"
        !          5864:                ;;
        !          5865:             *)
        !          5866:                 usage
        !          5867:                 ;;
        !          5868:         esac
        !          5869: .
        !          5870: 
        !          5871: }
        !          5872: 
        !          5873: pp_backend_rpm_probe () {
        !          5874:         echo "${pp_rpm_distro}-${pp_rpm_arch_std}"
        !          5875: }
        !          5876: 
        !          5877: pp_backend_rpm_vas_platforms () {
        !          5878:     case "$pp_rpm_arch_std" in
        !          5879:        x86_64) echo "linux-x86_64.rpm linux-x86.rpm";;
        !          5880:        *86)    echo "linux-x86.rpm";;
        !          5881:        s390)   echo "linux-s390";;
        !          5882:        s390x)  echo "linux-s390x";;
        !          5883:        ppc*)   echo "linux-glibc23-ppc64 linux-glibc22-ppc64";;
        !          5884:        ia64)   echo "linux-ia64";;
        !          5885:        *)      pp_die "unknown architecture $pp_rpm_arch_std";;
        !          5886:     esac
        !          5887: }
        !          5888: 
        !          5889: pp_backend_rpm_init_svc_vars () {
        !          5890:     pp_rpm_default_start_runlevels="2 3 4 5"
        !          5891:     pp_rpm_default_svc_description="No description"
        !          5892: }
        !          5893: 
        !          5894: pp_rpm_service_install_common () {
        !          5895:     cat <<-'.'
        !          5896: 
        !          5897:         _pp_install_service () {
        !          5898:             local svc level
        !          5899:             svc="$1"
        !          5900:             if [ -x /usr/lib/lsb/install_initd -a ! -r /etc/redhat-release ]
        !          5901:             then
        !          5902:                 # LSB-style install
        !          5903:                 /usr/lib/lsb/install_initd /etc/init.d/$svc &> /dev/null
        !          5904:             elif [ -x /sbin/chkconfig ]; then
        !          5905:                 # Red Hat/chkconfig-style install
        !          5906:                 /sbin/chkconfig --add $svc &> /dev/null
        !          5907:                 /sbin/chkconfig $svc off &> /dev/null
        !          5908:             else
        !          5909:                : # manual links under /etc/init.d
        !          5910:             fi
        !          5911:         }
        !          5912: 
        !          5913:         _pp_enable_service () {
        !          5914:             local svc level
        !          5915:             svc="$1"
        !          5916:             if [ -x /usr/lib/lsb/install_initd -a ! -r /etc/redhat-release ]
        !          5917:             then
        !          5918:                 # LSB-style install
        !          5919:                : # not sure how to enable
        !          5920:             elif [ -x /sbin/chkconfig ]; then
        !          5921:                 # Red Hat/chkconfig-style install
        !          5922:                 /sbin/chkconfig $svc on &> /dev/null
        !          5923:             else
        !          5924:                 # manual install
        !          5925:                 set -- `sed -n -e 's/^# Default-Start://p' /etc/init.d/$svc`
        !          5926:                 start_priority=`sed -n -e 's/^# X-Quest-Start-Priority:[[:space:]]*//p' /etc/init.d/$svc`
        !          5927:                 stop_priority=`sed -n -e 's/^# X-Quest-Stop-Priority:[[:space:]]*//p' /etc/init.d/$svc`
        !          5928: 
        !          5929:                 # Provide default start & stop priorities of 20 & 80 in
        !          5930:                 # accordance with Debian update-rc.d defaults
        !          5931:                 if [ -z "$start_priority" ]; then
        !          5932:                     start_priority=20
        !          5933:                 fi
        !          5934:                 if [ -z "$stop_priority" ]; then
        !          5935:                     stop_priority=80
        !          5936:                 fi
        !          5937:                     
        !          5938:                 if [ -d "/etc/rc.d" ];then
        !          5939:                     rcdir=/etc/rc.d
        !          5940:                 else
        !          5941:                     rcdir=/etc
        !          5942:                 fi
        !          5943: 
        !          5944:                 for level
        !          5945:                 do ln -sf /etc/init.d/$svc $rcdir/rc$level.d/S$start_priority$svc; done
        !          5946:                 set -- `sed -n -e 's/^# Default-Stop://p' /etc/init.d/$svc`
        !          5947:                 for level
        !          5948:                 do ln -sf /etc/init.d/$svc $rcdir/rc$level.d/K$stop_priority$svc; done
        !          5949:             fi
        !          5950:         }
        !          5951: .
        !          5952: }
        !          5953: 
        !          5954: pp_rpm_service_remove_common () {
        !          5955:     cat <<-'.'
        !          5956: 
        !          5957:         _pp_remove_service () {
        !          5958:             local svc
        !          5959:             svc="$1"
        !          5960:             /etc/init.d/$svc stop >/dev/null 2>&1
        !          5961:             if [ -x /usr/lib/lsb/remove_initd -a ! -r /etc/redhat-release ]
        !          5962:             then
        !          5963:                 /usr/lib/lsb/remove_initd /etc/init.d/$svc &> /dev/null
        !          5964:             elif [ -x /sbin/chkconfig ]; then
        !          5965:                 /sbin/chkconfig --del $svc &> /dev/null
        !          5966:             else
        !          5967:                 if [ -d "/etc/rc.d" ];then
        !          5968:                     rcdir=/etc/rc.d
        !          5969:                 else
        !          5970:                     rcdir=/etc
        !          5971:                 fi
        !          5972: 
        !          5973:                 rm -f $rcdir/rc?.d/[SK]??$svc
        !          5974:             fi
        !          5975:         }
        !          5976: .
        !          5977: }
        !          5978: 
        !          5979: 
        !          5980: pp_rpm_service_install () {
        !          5981:     pp_rpm_service_make_init_script $1 >/dev/null ||
        !          5982:         pp_error "could not create init script for service $1"
        !          5983:     echo "_pp_install_service $1"
        !          5984:     test $enable = yes && echo "_pp_enable_service $1"
        !          5985: }
        !          5986: 
        !          5987: pp_rpm_service_remove () {
        !          5988:     cat <<-.
        !          5989:         if [ "\$1" = "remove" -o "\$1" = "0" ]; then
        !          5990:             # only remove the service if not upgrade
        !          5991:             _pp_remove_service $1
        !          5992:         fi
        !          5993: .
        !          5994: }
        !          5995: 
        !          5996: 
        !          5997: pp_backend_rpm_init_svc_vars () {
        !          5998: 
        !          5999:     reload_signal=
        !          6000:     start_runlevels=${pp_rpm_default_start_runlevels}   # == lsb default-start
        !          6001:     stop_runlevels="0 1 6"                              # == lsb default-stop
        !          6002:     svc_description="${pp_rpm_default_svc_description}" # == lsb short descr
        !          6003:     svc_process=
        !          6004: 
        !          6005:     lsb_required_start='$local_fs $network'
        !          6006:     lsb_should_start=
        !          6007:     lsb_required_stop=
        !          6008:     lsb_description=
        !          6009: 
        !          6010:     start_priority=50
        !          6011:     stop_priority=50            #-- stop_priority = 100 - start_priority
        !          6012: }
        !          6013: 
        !          6014: pp_rpm_service_group_make_init_script () {
        !          6015:     local grp=$1
        !          6016:     local svcs="$2"
        !          6017:     local script=/etc/init.d/$grp
        !          6018:     local out=$pp_destdir$script
        !          6019: 
        !          6020:     pp_add_file_if_missing $script run 755 || return 0
        !          6021: 
        !          6022:     cat <<-. >>$out
        !          6023:        #!/bin/sh
        !          6024:        svcs="$svcs"
        !          6025: .
        !          6026: 
        !          6027:     cat <<-'.' >>$out
        !          6028: 
        !          6029:         #-- prints usage message
        !          6030:         pp_usage () {
        !          6031:             echo "usage: $0 {start|stop|status|restart|reload|condrestart|try-restart|force-reload}" >&2
        !          6032:             return 2
        !          6033:         }
        !          6034: 
        !          6035:         #-- starts services in order.. stops them all if any break
        !          6036:         pp_start () {
        !          6037:             undo=
        !          6038:             for svc in $svcs; do
        !          6039:                 if /etc/init.d/$svc start; then
        !          6040:                     undo="$svc $undo"
        !          6041:                 else
        !          6042:                     if test -n "$undo"; then
        !          6043:                         for svc in $undo; do
        !          6044:                            /etc/init.d/$svc stop
        !          6045:                         done
        !          6046:                         return 1
        !          6047:                     fi
        !          6048:                 fi
        !          6049:             done
        !          6050:             return 0
        !          6051:         }
        !          6052: 
        !          6053:         #-- stops services in reverse
        !          6054:         pp_stop () {
        !          6055:             reverse=
        !          6056:             for svc in $svcs; do
        !          6057:                 reverse="$svc $reverse"
        !          6058:             done
        !          6059:             rc=0
        !          6060:             for svc in $reverse; do
        !          6061:                 /etc/init.d/$svc stop || rc=$?
        !          6062:             done
        !          6063:             return $rc
        !          6064:         }
        !          6065: 
        !          6066:         #-- returns true only if all services return true status
        !          6067:         pp_status () {
        !          6068:             rc=0
        !          6069:             for svc in $svcs; do
        !          6070:                 /etc/init.d/$svc status || rc=$?
        !          6071:             done
        !          6072:             return $rc
        !          6073:         }
        !          6074: 
        !          6075:         pp_reload () {
        !          6076:             rc=0
        !          6077:             for svc in $svcs; do
        !          6078:                 /etc/init.d/$svc reload || rc=$?
        !          6079:             done
        !          6080:             return $rc
        !          6081:         }
        !          6082: 
        !          6083:         case "$1" in
        !          6084:             start)          pp_start;;
        !          6085:             stop)           pp_stop;;
        !          6086:             restart)        pp_stop; pp_start;;
        !          6087:             status)         pp_status;;
        !          6088:             try-restart|condrestart)
        !          6089:                             if pp_status >/dev/null; then
        !          6090:                                     pp_restart
        !          6091:                             fi;;
        !          6092:             reload)         pp_reload;;
        !          6093:             force-reload)   if pp_status >/dev/null; then
        !          6094:                                     pp_reload
        !          6095:                             else
        !          6096:                                     pp_restart
        !          6097:                             fi;;
        !          6098:             *)              pp_usage;;
        !          6099:         esac
        !          6100: .
        !          6101:     chmod 755 $out
        !          6102: }
        !          6103: 
        !          6104: pp_rpm_service_make_init_script () {
        !          6105:     local svc=$1
        !          6106:     local script=/etc/init.d/$svc
        !          6107:     local out=$pp_destdir$script
        !          6108:     local _process _cmd _rpmlevels
        !          6109: 
        !          6110:     pp_add_file_if_missing $script run 755 || return 0
        !          6111: 
        !          6112:     #-- start out as an empty shell script
        !          6113:     cat <<-'.' >$out
        !          6114:        #!/bin/sh
        !          6115: .
        !          6116: 
        !          6117:     #-- determine the process name from $cmd unless $svc_process is given
        !          6118:     set -- $cmd
        !          6119:     _process=${svc_process:-"$1"}
        !          6120: 
        !          6121:     #-- construct a start command that builds a pid file if needed
        !          6122:     _cmd="$cmd";
        !          6123:     if test -z "$pidfile"; then
        !          6124:         pidfile=/var/run/$svc.pid
        !          6125:         _cmd="$cmd & echo \$! > \$pidfile"
        !          6126:     fi
        !          6127:     if test "$user" != "root"; then
        !          6128:         _cmd="su $user -c exec $_cmd";
        !          6129:     fi
        !          6130: 
        !          6131:     #-- generate the Red Hat chkconfig headers
        !          6132:     _rpmlevels=`echo $start_runlevels | tr -d ' '`
        !          6133:     cat <<-. >>$out
        !          6134:        # chkconfig: ${_rpmlevels:--} ${start_priority:-50} ${stop_priority:-50}
        !          6135:        # description: ${svc_description:-no description}
        !          6136:        # processname: ${_process}
        !          6137:        # pidfile: ${pidfile}
        !          6138: .
        !          6139: 
        !          6140:     #-- generate the LSB init info
        !          6141:     cat <<-. >>$out
        !          6142:        ### BEGIN INIT INFO
        !          6143:        # Provides: ${svc}
        !          6144:        # Required-Start: ${lsb_required_start}
        !          6145:        # Should-Start: ${lsb_should_start}
        !          6146:        # Required-Stop: ${lsb_required_stop}
        !          6147:        # Default-Start: ${start_runlevels}
        !          6148:        # Default-Stop: ${stop_runlevels}
        !          6149:        # Short-Description: ${svc_description}
        !          6150:        ### END INIT INFO
        !          6151:        # Generated by PolyPackage ${pp_version}
        !          6152:        # ${copyright}
        !          6153: 
        !          6154: .
        !          6155: 
        !          6156:     if test x"${svc_description}" = x"${pp_rpm_default_svc_description}"; then
        !          6157:         svc_description=
        !          6158:     fi
        !          6159: 
        !          6160:     #-- write service-specific definitions
        !          6161:     cat <<. >>$out
        !          6162:        #-- definitions specific to service ${svc}
        !          6163:        svc_name="${svc_description:-$svc service}"
        !          6164:        user="${user}"
        !          6165:        pidfile="${pidfile}"
        !          6166:        stop_signal="${stop_signal}"
        !          6167:        reload_signal="${reload_signal}"
        !          6168:        pp_exec_cmd () { $_cmd; }
        !          6169: .
        !          6170: 
        !          6171:     #-- write the generic part of the init script
        !          6172:     cat <<'.' >>$out
        !          6173: 
        !          6174:         #-- use system message logging, if available
        !          6175:         if [ -f /lib/lsb/init-functions -a ! -r /etc/redhat-release ]; then
        !          6176:             . /lib/lsb/init-functions
        !          6177:             pp_success_msg () { log_success_msg "$@"; }
        !          6178:             pp_failure_msg () { log_failure_msg "$@"; }
        !          6179:             pp_warning_msg () { log_warning_msg "$@"; }
        !          6180:         elif [ -f /etc/init.d/functions ]; then
        !          6181:             . /etc/init.d/functions
        !          6182:             pp_success_msg () { echo -n "$*"; success "$@"; echo; }
        !          6183:             pp_failure_msg () { echo -n "$*"; failure "$@"; echo; }
        !          6184:             pp_warning_msg () { echo -n "$*"; warning "$@"; echo; }
        !          6185:         else
        !          6186:             pp_success_msg () { echo ${1:+"$*:"} OK; }
        !          6187:             pp_failure_msg () { echo ${1:+"$*:"} FAIL; }
        !          6188:             pp_warning_msg () { echo ${1:+"$*:"} WARNING; }
        !          6189:         fi
        !          6190: 
        !          6191:         #-- prints a status message
        !          6192:         pp_msg () { echo -n "$*: "; }
        !          6193: 
        !          6194:         #-- prints usage message
        !          6195:         pp_usage () {
        !          6196:             echo "usage: $0 {start|stop|status|restart|reload|condrestart|try-restart|force-reload}" >&2
        !          6197:             return 2
        !          6198:         }
        !          6199: 
        !          6200:         #-- reloads the service, if possible
        !          6201:         #   returns 0=success 1=failure 3=unimplemented
        !          6202:         pp_reload () {
        !          6203:             test -n "$reload_signal" || return 3 # unimplemented
        !          6204:             pp_msg "Reloading ${svc_name}"
        !          6205:             if pp_signal -${reload_signal}; then
        !          6206:                 pp_success_msg
        !          6207:                 return 0
        !          6208:             else
        !          6209:                 pp_failure_msg "not running"
        !          6210:                 return 1
        !          6211:             fi
        !          6212:         }
        !          6213: 
        !          6214:         #-- delivers signal $1 to the pidfile
        !          6215:         #   returns 0=success 1=failure
        !          6216:         pp_signal () {
        !          6217:             if test -r "$pidfile"; then
        !          6218:                 read pid < $pidfile
        !          6219:                 kill "$@" "$pid" 2>/dev/null
        !          6220:             else
        !          6221:                 return 1
        !          6222:             fi
        !          6223:         }
        !          6224: 
        !          6225:         #-- prints information about the service status
        !          6226:         #   returns 0=running 1=crashed 3=stopped
        !          6227:         pp_status () {
        !          6228:             pp_msg "Checking for ${svc_name}"
        !          6229:             if pp_signal -0; then
        !          6230:                 pp_success_msg "running"
        !          6231:                 return 0
        !          6232:             elif test -r "$pidfile"; then
        !          6233:                 pp_failure_msg "not running (crashed)"
        !          6234:                 return 1
        !          6235:             else
        !          6236:                 pp_failure_msg "not running"
        !          6237:                 return 3
        !          6238:             fi
        !          6239:         }
        !          6240: 
        !          6241:         #-- starts the service
        !          6242:         #   returns 0=success 1=failure
        !          6243:         pp_start () {
        !          6244:             pp_msg "Starting ${svc_name}"
        !          6245:             if pp_status >/dev/null; then
        !          6246:                 pp_warning_msg "already started"
        !          6247:                 return 0
        !          6248:             elif pp_exec_cmd; then
        !          6249:                 pp_success_msg
        !          6250:                 return 0
        !          6251:             else
        !          6252:                 pp_failure_msg "cannot start"
        !          6253:                 return 1
        !          6254:             fi
        !          6255:         }
        !          6256: 
        !          6257:         #-- stops the service
        !          6258:         #   returns 0=success (always)
        !          6259:         pp_stop () {
        !          6260:             pp_msg "Stopping ${svc_name}"
        !          6261:             if pp_signal -${stop_signal}; then
        !          6262:                 pp_success_msg
        !          6263:             else
        !          6264:                 pp_success_msg "already stopped"
        !          6265:             fi
        !          6266:             rm -f "$pidfile"
        !          6267:             return 0
        !          6268:         }
        !          6269: 
        !          6270:         #-- stops and starts the service
        !          6271:         pp_restart () {
        !          6272:             pp_stop
        !          6273:             pp_start
        !          6274:         }
        !          6275: 
        !          6276:         case "$1" in
        !          6277:             start)          pp_start;;
        !          6278:             stop)           pp_stop;;
        !          6279:             restart)        pp_restart;;
        !          6280:             status)         pp_status;;
        !          6281:             try-restart|condrestart)
        !          6282:                             if pp_status >/dev/null; then
        !          6283:                                     pp_restart
        !          6284:                             fi;;
        !          6285:             reload)         pp_reload;;
        !          6286:             force-reload)   if pp_status >/dev/null; then
        !          6287:                                     pp_reload
        !          6288:                             else
        !          6289:                                     pp_restart
        !          6290:                             fi;;
        !          6291:             *)              pp_usage;;
        !          6292:         esac
        !          6293: 
        !          6294: .
        !          6295:     chmod 755 $out
        !          6296: }
        !          6297: pp_backend_rpm_function () {
        !          6298:     case $1 in
        !          6299:         pp_mkgroup) cat<<'.';;
        !          6300:             /usr/sbin/groupadd -f -r "$1"
        !          6301: .
        !          6302:         pp_mkuser:depends) echo pp_mkgroup;;
        !          6303:         pp_mkuser) cat<<'.';;
        !          6304:             pp_mkgroup "${2:-$1}" || return 1
        !          6305:             /usr/sbin/useradd \
        !          6306:                -g "${2:-$1}" \
        !          6307:                -M -d "${3:-/nonexistent}" \
        !          6308:                -s "${4:-/bin/false}" \
        !          6309:                -r "$1"
        !          6310: .
        !          6311:         pp_havelib) cat<<'.';;
        !          6312:             for pp_tmp_dir in `echo "/usr/lib:/lib${3:+:$3}" | tr : ' '`; do
        !          6313:                 test -r "$pp_tmp_dir/lib$1.so{$2:+.$2}" && return 0
        !          6314:             done
        !          6315:             return 1
        !          6316: .
        !          6317:        *) false;;
        !          6318:     esac
        !          6319: }
        !          6320: 
        !          6321: : NOTES <<.
        !          6322: 
        !          6323:  # creating a dmg file for publishing on the web
        !          6324:     hdiutil create -srcfolder /path/foo foo.dmg
        !          6325:     hdiutil internet-enable -yes /path/foo.dmg
        !          6326:  # Layout for packages
        !          6327:     <name>-<cpy>/component/<file>
        !          6328:     <name>-<cpt>/extras/postinstall
        !          6329:     <name>-<cpt>/extras/postupgrade
        !          6330:  # /Developer/usr/bin/packagemaker (man packagemaker)
        !          6331: 
        !          6332:     Make a bunch of packages, and then build a 'distribution'
        !          6333:     which is only understood by macos>10.4
        !          6334: 
        !          6335:  # Message files in the resource path used are
        !          6336:     Welcome.{rtf,html,rtfd,txt} - limited text shown in Intro
        !          6337:     ReadMe.{rtf,html,rtfd,txt} - scrollable/printable, after Intro
        !          6338:     License.{rtf,html,rtfd,txt} - ditto, user must click 'Accept'
        !          6339:     background.{jpg,tif,gif,pict,eps,pdf} 620x418 background image
        !          6340: 
        !          6341:  # These scripts looked for in the resource path
        !          6342:     InstallationCheck $pkgpath $defaultloc $targetvol
        !          6343:        0:ok 32:warn 32+x:warn[1] 64:stop 96+x:stop[2]
        !          6344:     VolumeCheck $volpath
        !          6345:        0:ok 32:failure 32+x:failure[3]
        !          6346:     preflight   $pkgpath $targetloc $targetvol    [priv]
        !          6347:     preinstall  $pkgpath $targetloc $targetvol    [priv]
        !          6348:     preupgrade  $pkgpath $targetloc $targetvol    [priv]
        !          6349:     postinstall $pkgpath $targetloc $targetvol    [priv]
        !          6350:     postupgrade $pkgpath $targetloc $targetvol    [priv]
        !          6351:     postflight  $pkgpath $targetloc $targetvol    [priv]
        !          6352:        0:ok else fail (for all scripts)
        !          6353: 
        !          6354:     A detailed reason is deduced by finding an index x (16..31)
        !          6355:     in the file InstallationCheck.strings or VolumeCheck.strings.
        !          6356: 
        !          6357:     Scripts marked [priv] are executed with root privileges.
        !          6358:     None of the [priv] scripts are used by metapackages.
        !          6359: 
        !          6360:  # Default permissions
        !          6361:     Permissions of existing directories should match those
        !          6362:     of a clean install of the OS; typically root:admin 0775
        !          6363:     New directories or files should be 0775 or 0664 with the
        !          6364:     appropriate user:group.
        !          6365:     Exceptions:
        !          6366:        /etc    root:admin 0755
        !          6367:        /var    root:admin 0755
        !          6368: 
        !          6369:     <http://developer.apple.com/documentation/DeveloperTools/Conceptual/SoftwareDistribution4/Concepts/sd_pkg_flags.html>
        !          6370:     Info.plist = {
        !          6371:      CFBundleGetInfoString: "1.2.3, Quest Software, Inc.",
        !          6372:      CFBundleIdentifier: "com.quest.rc.openssh",
        !          6373:      CFBundleShortVersionString: "1.2.3",
        !          6374:      IFMajorVersion: 1,
        !          6375:      IFMinorVersion: 2,
        !          6376:      IFPkgFlagAllowBackRev: false,
        !          6377:      IFPkgFlagAuthorizationAction: "AdminAuthorization",
        !          6378:      IFPkgFlagDefaultLocation: "/",
        !          6379:      IFPkgFlagFollowLinks: true,
        !          6380:      IFPkgFlagInstallFat: false,
        !          6381:      IFPkgFlagInstalledSize: <integer>,            # this is added by packagemaker
        !          6382:      IFPkgFlagIsRequired: false,
        !          6383:      IFPkgFlagOverwritePermissions: false,
        !          6384:      IFPkgFlagRelocatable: false,
        !          6385:      IFPkgFlagRestartAction: "NoRestart",
        !          6386:      IFPkgFlagRootVolumeOnly: false,
        !          6387:      IFPkgFlagUpdateInstalledLanguages: false,
        !          6388:      IFPkgFormatVersion= 0.10000000149011612,
        !          6389:      IFRequirementDicts: [ {
        !          6390:        Level = "requires",
        !          6391:        SpecArgument = "/opt/quest/lib/libvas.4.2.0.dylib",
        !          6392:        SpecType = "file",
        !          6393:        TestObject = true,
        !          6394:        TestOperator = "eq", } ]
        !          6395:     }
        !          6396: 
        !          6397:     Description.plist = {
        !          6398:      IFPkgDescriptionDescription = "this is the description text",
        !          6399:      IFPkgDescriptionTitle = "quest-openssh"
        !          6400:     }
        !          6401: 
        !          6402:  # Startup scripts
        !          6403:     'launchd' is a kind of combined inetd and rc/init.d system.
        !          6404:     <http://developer.apple.com/documentation/MacOSX/Conceptual/BPSystemStartup/Articles/DesigningDaemons.html>
        !          6405:     Create a /Library/LaunchDaemons/$daemonname.plist file
        !          6406:     Examples found in /System/Library/LaunchDaemons/
        !          6407:     See manual page launchd.plist(5) for details:
        !          6408: 
        !          6409:     { Label: "com.quest.vintela.foo",                        # required
        !          6410:       Program: "/sbin/program",
        !          6411:       ProgramArguments: [ "/sbin/program", "arg1", "arg2" ], # required
        !          6412:       RunAtLoad: true,
        !          6413:       WatchPaths: [ "/etc/crontab" ],
        !          6414:       QueueDirectories: [ "/var/cron/tabs" ],
        !          6415:       inetdCompatibility: { Wait: false },                   # inetd-only
        !          6416:       OnDemand: false,                                       # recommended
        !          6417:       SessionCreate: true,
        !          6418:       UserName: "nobody",
        !          6419:       InitGroups: true,
        !          6420:       Sockets: {                                             # inetd only
        !          6421:        Listeners: {
        !          6422:           SockServiceName: "ssh",
        !          6423:           Bonjour: ["ssh", "sftp-ssh"], } },
        !          6424:       Disabled: false,
        !          6425:       StandardErrorPath: "/dev/null",
        !          6426:     }
        !          6427: 
        !          6428: 
        !          6429:     How to add a new user
        !          6430:        dscl . -create /Users/$user
        !          6431:        dscl . -create /Users/$user UserShell /bin/bash
        !          6432:        dscl . -create /Users/$user RealName "$user"
        !          6433:        dscl . -create /Users/$user UniqueID $uid
        !          6434:        dscl . -create /Users/$user PrimaryGroupID $gid
        !          6435:        dscl . -create /Users/$user NFSHomeDirectory /Users/$user
        !          6436:        dscl . -passwd /Users/$user "$passwd"
        !          6437:        mkdir /Users/$user
        !          6438:        chown $uid.$gid /Users/$user
        !          6439: 
        !          6440: .
        !          6441: 
        !          6442: 
        !          6443: pp_platforms="$pp_platforms macos"
        !          6444: 
        !          6445: pp_backend_macos_detect () {
        !          6446:     [ x"$1" = x"Darwin" ]
        !          6447: }
        !          6448: 
        !          6449: pp_backend_macos_init () {
        !          6450:     pp_macos_default_bundle_id_prefix="com.quest.rc."
        !          6451:     pp_macos_bundle_id=
        !          6452:     pp_macos_bundle_vendor=
        !          6453:     pp_macos_bundle_version=
        !          6454:     pp_macos_bundle_info_string=
        !          6455:     pp_macos_prog_packagemaker=/Developer/usr/bin/packagemaker
        !          6456:     pp_macos_pkg_domain=anywhere
        !          6457:     pp_macos_pkg_extra_flags=
        !          6458:     pp_macos_sudo=
        !          6459:     # OS X puts the library version *before* the .dylib extension
        !          6460:     pp_shlib_suffix='*.dylib'
        !          6461: }
        !          6462: 
        !          6463: pp_macos_plist () {
        !          6464:     typeset in
        !          6465:     in=""
        !          6466:     while test $# -gt 0; do
        !          6467:      case "$1" in
        !          6468: 
        !          6469:       start-plist) cat <<-.; in="  "; shift ;;
        !          6470:        <?xml version="1.0" encoding="UTF-8"?>
        !          6471:        <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
        !          6472:        <plist version="1.0">
        !          6473: .
        !          6474:       end-plist) echo "</plist>"; in=; shift;;
        !          6475: 
        !          6476:       '[')   echo "$in<array>"; in="$in  "; shift;;
        !          6477:       ']')   echo "$in</array>"; in="${in#  }"; shift;;
        !          6478:       '{')   echo "<dict>"; in="$in      "; shift;;
        !          6479:       '}')   echo "</dict>"; in="${in#      }"; shift;;
        !          6480:       key)         shift; echo "$in<key>$1</key>"; shift;;
        !          6481:       string)      shift;
        !          6482:                   echo "$1" | sed -e 's/&/&amp;/g;s/</\&lt;/g;s/>/\&gt;/g;' \
        !          6483:                                   -e 's/^/'"$in"'<string>/;s/$/<\/string>/';
        !          6484:                   shift;;
        !          6485:       true)        echo "$in<true/>"; shift;;
        !          6486:       false)       echo "$in<false/>"; shift;;
        !          6487:       real)        shift; echo "$in<real>$1</real>"; shift;;
        !          6488:       integer)     shift; echo "$in<integer>$1</integer>"; shift;;
        !          6489:       date)        shift; echo "$in<date>$1</date>"; shift;; # ISO 8601 format
        !          6490:       data)        shift; echo "$in<data>$1</data>"; shift;; # base64 encoded
        !          6491:       *)          pp_error "pp_macos_plist: bad argument '$1'"; shift;;
        !          6492:      esac
        !          6493:     done
        !          6494: }
        !          6495: 
        !          6496: pp_macos_rewrite_cpio () {
        !          6497:     typeset script
        !          6498:     script=$pp_wrkdir/cpio-rewrite.pl
        !          6499:     # rely on the fact that OS X comes with perl. It is a little easier to
        !          6500:     # re-write a binary stream with perl than it is with posix :)
        !          6501:     #
        !          6502:     # A CPIO header block has octal fields at the following offset/lengths:
        !          6503:     #   0  6 magic
        !          6504:     #   6  6 dev
        !          6505:     #  12  6 ino
        !          6506:     #  18  6 mode
        !          6507:     #  24  6 uid
        !          6508:     #  30  6 gid
        !          6509:     #  36  6 nlink
        !          6510:     #  42  6 rdev
        !          6511:     #  48 11 mtime
        !          6512:     #  59  6 namesize
        !          6513:     #  65 11 filesize
        !          6514:     #  76    --
        !          6515:     cat <<-'.' >$script
        !          6516:        while (<DATA>) {
        !          6517:                my ($type,$mode,$uid,$gid,$flags,$name) =
        !          6518:                    m/^(.) (\d+) (\S+) (\S+) (\S+) (.*)/;
        !          6519:                $uid = 0 if $uid eq "-";
        !          6520:                $gid = 0 if $gid eq "-";
        !          6521:                if ($uid ne "=" and $uid =~ m/\D/) {
        !          6522:                        my @pw = getpwnam($uid) or die "bad username '$uid'";
        !          6523:                        $uid = $pw[2];
        !          6524:                }
        !          6525:                if ($gid ne "=" and $gid =~ m/\D/) {
        !          6526:                        my @gr = getgrnam($gid) or die "bad group '$gid'";
        !          6527:                        $gid = $gr[2];
        !          6528:                }
        !          6529:                $name = ".".$name."\0";
        !          6530:                $ok{$name} = 1;
        !          6531:                $uid{$name} = sprintf("%06o",int($uid)) unless $uid eq "=";
        !          6532:                $gid{$name} = sprintf("%06o",int($gid)) unless $gid eq "=";
        !          6533:                $mode{$name} = sprintf("%06o",oct($mode)) unless $mode eq "=";
        !          6534:        }
        !          6535:        $ok{"TRAILER!!!\0"} = 1;
        !          6536:        while (!eof STDIN) {
        !          6537:                read STDIN, $header, 76;
        !          6538:                die "bad magic" unless $header =~ m/^070707/;
        !          6539:                $namesize = oct(substr($header,59,6));
        !          6540:                $filesize = oct(substr($header,65,11));
        !          6541:                read STDIN, $name, $namesize;
        !          6542:                # convert uid and gid to 0
        !          6543:                substr($header, 24, 6) = $uid{$name} if defined($uid{$name});
        !          6544:                substr($header, 30, 6) = $gid{$name} if defined($gid{$name});
        !          6545:                substr($header, 18, 6) = $mode{$name} if defined($mode{$name});
        !          6546:                print ($header, $name) if $ok{$name};
        !          6547:                # copy-through the file data
        !          6548:                while ($filesize > 0) {
        !          6549:                        my $seg = 8192;
        !          6550:                        $seg = $filesize if $filesize < $seg;
        !          6551:                        undef $data;
        !          6552:                        read STDIN, $data, $seg;
        !          6553:                        print $data if $ok{$name};
        !          6554:                        $filesize -= $seg;
        !          6555:                }
        !          6556:        }
        !          6557:        exit(0);
        !          6558:        __DATA__
        !          6559: .
        !          6560:     # Append to the script the %files data
        !          6561:     cat "$@" </dev/null >> $script
        !          6562:     /usr/bin/perl $script || pp_error "pp_macos_rewrite_cpio error";
        !          6563: }
        !          6564: 
        !          6565: pp_macos_files_bom () {
        !          6566:     typeset _l t m o g f p st owner
        !          6567:     while read t m o g f p st; do
        !          6568:        # make sure that $m is padded up to 4 digits long
        !          6569:        case "$m" in
        !          6570:            ?) m="000$m";;
        !          6571:            ??) m="00$m";;
        !          6572:            ???) m="0$m";;
        !          6573:            ?????*) pp_fatal "pp_macos_writebom: mode '$m' too long";;
        !          6574:        esac
        !          6575: 
        !          6576:        # convert owner,group into owner/group in octal
        !          6577:        case $o in -)   o=0;; esac
        !          6578:        case $g in -)   g=0;; esac
        !          6579:        owner=`pp_d2o $o`/`pp_d2o $g`
        !          6580: 
        !          6581:        case $t in
        !          6582:            f)
        !          6583:                echo ".$p       10$m    $owner  `
        !          6584:                    /usr/bin/cksum < "${pp_destdir}$p" |
        !          6585:                    awk '{print $2 "    " $1}'`";;
        !          6586:            d)
        !          6587:                echo ".${p%/}   4$m     $owner";;
        !          6588:            s)
        !          6589:                rl=`/usr/bin/readlink "${pp_destdir}$p"`
        !          6590:                #test x"$rl" = x"$st" ||
        !          6591:                #    pp_error "symlink mismatch $rl != $st"
        !          6592:                echo ".$p       12$m    $owner  `
        !          6593:                    /usr/bin/readlink -n "${pp_destdir}$p" |
        !          6594:                    /usr/bin/cksum |
        !          6595:                    awk '{print $2 "    " $1}'` $st";;
        !          6596:        esac
        !          6597:     done
        !          6598: }
        !          6599: 
        !          6600: pp_macos_bom_fix_parents () {
        !          6601:     perl -pe '
        !          6602:        sub dirname { my $d=shift; $d=~s,/[^/]*$,,; $d; }
        !          6603:        sub chk { my $d=shift;
        !          6604:                  &chk(&dirname($d)) if $d =~ m,/,;
        !          6605:                  unless ($seen{$d}++) {
        !          6606:                      print "$d\t40755\t0/0\n";
        !          6607:                  }
        !          6608:                }
        !          6609:        m/^\S+/;
        !          6610:        &chk(&dirname($&));'
        !          6611: }
        !          6612: 
        !          6613: pp_macos_files_size () {
        !          6614:     typeset _l t m o g f p st owner
        !          6615:     while read t m o g f p st; do
        !          6616:        case $t in
        !          6617:            f)  wc -c < "${pp_destdir}$p";;
        !          6618:            s)  echo 4095;;
        !          6619:            d)  ;; # always seems to be zero
        !          6620:        esac
        !          6621:     done | awk '{n+=1+int($1/4096)} END {print n*4}'
        !          6622: }
        !          6623: 
        !          6624: pp_o2d () {
        !          6625:     awk 'BEGIN { x=0; '`echo "$1" |
        !          6626:        sed -e 's/./x=x*8+&;/g'`'print x;}' </dev/null
        !          6627: }
        !          6628: pp_d2o () {
        !          6629:     case "$1" in
        !          6630:        [0-7]) echo $1;;
        !          6631:        *) awk 'BEGIN { printf("%o\n", 0+('"$1"'));}' < /dev/null;;
        !          6632:     esac
        !          6633: }
        !          6634: 
        !          6635: pp_macos_mkbom () {
        !          6636:     #/usr/bin/mkbom -i $1 $2
        !          6637:     typeset path mode ugid size cksum linkpath
        !          6638:     typeset bomstage
        !          6639: 
        !          6640:     # Use mkbom if it understands -i (avoids a copy)
        !          6641:     if /usr/bin/mkbom -i /dev/null "$2" 2>/dev/null; then
        !          6642:        rm -f "$2"
        !          6643:        /usr/bin/mkbom -i "$1" "$2"
        !          6644:        return
        !          6645:     fi
        !          6646: 
        !          6647:     # On 10.4 we have this nonsense.
        !          6648:     pp_warn "mkbom workaround: copying source files to staging area"
        !          6649: 
        !          6650:     bomstage=$pp_wrkdir/bom_stage
        !          6651:     while IFS='        ' read path mode ugid size cksumi linkpath; do
        !          6652:        if test -h "$pp_destdir/$path"; then
        !          6653:            $pp_macos_sudo /bin/ln -s "$linkpath" "$bomstage/$path"
        !          6654:        else
        !          6655:            if test -d "$pp_destdir/$path"; then
        !          6656:                $pp_macos_sudo /bin/mkdir -p "$bomstage/$path"
        !          6657:            else
        !          6658:                $pp_macos_sudo /bin/cp "$pp_destdir/$path" "$bomstage/$path"
        !          6659:            fi
        !          6660:            $pp_macos_sudo /bin/chmod $mode "$bomstage/$path"
        !          6661:            $pp_macos_sudo /usr/sbin/chown `echo $ugid| tr / :` "$bomstage/$path"
        !          6662:        fi
        !          6663:     done <"$1"
        !          6664:     (cd $bomstage && $pp_macos_sudo mkbom . $pp_wrkdir/bom_stage.bom) ||
        !          6665:        pp_error "mkbom failed"
        !          6666:     $pp_macos_sudo mv $pp_wrkdir/bom_stage.bom "$2"
        !          6667: }
        !          6668: 
        !          6669: pp_backend_macos () {
        !          6670:     typeset pkgdir Contents Resources lprojdir
        !          6671:     typeset Info_plist Description_plist
        !          6672:     typeset bundle_vendor bundle_version size
        !          6673: 
        !          6674:     mac_version=`sw_vers -productVersion`
        !          6675:     bundle_vendor=${pp_macos_bundle_vendor:-$vendor}
        !          6676: 
        !          6677:     if test -z "$pp_macos_bundle_version"; then
        !          6678:         bundle_version=`echo "$version.0.0.0" | sed -n -e 's/[^0-9.]//g' \
        !          6679:             -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/p'`
        !          6680:         #if test x"$bundle_version" != x"$version"; then
        !          6681:         #    pp_warn "converted version from '$version' to '$bundle_version'"
        !          6682:         #fi
        !          6683:     else
        !          6684:         bundle_version="$pp_macos_bundle_version"
        !          6685:     fi
        !          6686:     source_version=`echo $version | sed 's/.*\.//'`
        !          6687: 
        !          6688:     # build the package layout
        !          6689:     pkgdir=$pp_wrkdir/$name.pkg
        !          6690:     Contents=$pkgdir/Contents
        !          6691:     Resources=$Contents/Resources
        !          6692:     lprojdir=$Resources/en.lproj
        !          6693:     mkdir $pkgdir $Contents $Resources $lprojdir ||
        !          6694:        pp_fatal "Can't make package temporary directories"
        !          6695: 
        !          6696:     echo "major: 1" > $Resources/package_version
        !          6697:     echo "minor: 0" >> $Resources/package_version
        !          6698:     echo "pmkrpkg1" > $Contents/PkgInfo
        !          6699:     case $mac_version in
        !          6700:         "10.6"*)
        !          6701:             xattr -w "com.apple.TextEncoding" "macintosh;0" "$Resources/package_version"
        !          6702:             xattr -w "com.apple.TextEncoding" "macintosh;0" "$Resources/PkgInfo"
        !          6703:             ;;
        !          6704:     esac
        !          6705: 
        !          6706:     # compute the installed size
        !          6707:     size=`cat $pp_wrkdir/%files.* | pp_macos_files_size`
        !          6708: 
        !          6709:     #-- Create Info.plist
        !          6710:     Info_plist=$Contents/Info.plist
        !          6711:     pp_macos_plist \
        !          6712:        start-plist \{ \
        !          6713:        key CFBundleGetInfoString string \
        !          6714:            "${pp_macos_bundle_info_string:-$version $bundle_vendor}" \
        !          6715:        key CFBundleIdentifier string \
        !          6716:            "${pp_macos_bundle_id:-$pp_macos_default_bundle_id_prefix$name}" \
        !          6717:     key CFBundleName string "$name" \
        !          6718:        key CFBundleShortVersionString string "$bundle_version" \
        !          6719:        key IFMajorVersion integer 1 \
        !          6720:        key IFMinorVersion integer 0 \
        !          6721:        key IFPkgFlagAllowBackRev false \
        !          6722:        key IFPkgFlagAuthorizationAction string "RootAuthorization" \
        !          6723:        key IFPkgFlagDefaultLocation string "/" \
        !          6724:        key IFPkgFlagFollowLinks true \
        !          6725:        key IFPkgFlagInstallFat true \
        !          6726:        key IFPkgFlagInstalledSize integer $size \
        !          6727:        key IFPkgFlagIsRequired false \
        !          6728:        key IFPkgFlagOverwritePermissions true \
        !          6729:        key IFPkgFlagRelocatable false \
        !          6730:        key IFPkgFlagRestartAction string "NoRestart" \
        !          6731:        key IFPkgFlagRootVolumeOnly true \
        !          6732:        key IFPkgFlagUpdateInstalledLanguages false \
        !          6733:        key IFPkgFlagUseUserMask false \
        !          6734:        key IFPkgFormatVersion real 0.10000000149011612 \
        !          6735:        key SourceVersion string $source_version \
        !          6736:        \} end-plist> $Info_plist
        !          6737: 
        !          6738:     # write en.lproj/Description.plist
        !          6739:     Description_plist=$lprojdir/Description.plist
        !          6740:     pp_macos_plist \
        !          6741:        start-plist \{ \
        !          6742:         key IFPkgDescriptionDeleteWarning string "" \
        !          6743:            key IFPkgDescriptionDescription string "$pp_macos_bundle_info_string" \
        !          6744:            key IFPkgDescriptionTitle       string "$name" \
        !          6745:            key IFPkgDescriptionVersion string "$version" \
        !          6746:        \} end-plist > $Description_plist
        !          6747: 
        !          6748:        # write Resources/files
        !          6749:     cat $pp_wrkdir/%files.* | awk '{print $6}' > $Resources/files
        !          6750: 
        !          6751:     # write package size file
        !          6752:     printf \
        !          6753: "NumFiles 0
        !          6754: InstalledSize $size
        !          6755: CompressedSize 0
        !          6756: " > $Resources/$name.sizes
        !          6757: 
        !          6758:     # write Resources/postinstall
        !          6759:     for cmp in $pp_components; do
        !          6760:        if test -s $pp_wrkdir/%pre.$cmp; then
        !          6761:            if test ! -s $Resources/preinstall; then
        !          6762:                echo "#!/bin/sh" > $Resources/preinstall
        !          6763:                chmod +x $Resources/preinstall
        !          6764:            fi
        !          6765:            cat $pp_wrkdir/%pre.$cmp >> $Resources/preinstall
        !          6766:            echo : >> $Resources/preinstall
        !          6767:        fi
        !          6768:     done
        !          6769: 
        !          6770:     # write Resources/postinstall
        !          6771:     for cmp in $pp_components; do
        !          6772:        if test -s $pp_wrkdir/%post.$cmp; then
        !          6773:            if test ! -s $Resources/postinstall; then
        !          6774:                echo "#!/bin/sh" > $Resources/postinstall
        !          6775:                chmod +x $Resources/postinstall
        !          6776:            fi
        !          6777:            cat $pp_wrkdir/%post.$cmp >> $Resources/postinstall
        !          6778:            echo : >> $Resources/postinstall
        !          6779:        fi
        !          6780:     done
        !          6781: 
        !          6782:     # write Resources/postupgrade)
        !          6783:     for cmp in $pp_components; do
        !          6784:        if test -s $pp_wrkdir/%postup.$cmp; then
        !          6785:            if test ! -s $Resources/postupgrade; then
        !          6786:                echo "#!/bin/sh" > $Resources/postupgrade
        !          6787:                chmod +x $Resources/postupgrade
        !          6788:            fi
        !          6789:            cat $pp_wrkdir/%postup.$cmp >> $Resources/postupgrade
        !          6790:            echo : >> $Resources/postupgrade
        !          6791:        fi
        !          6792:     done
        !          6793: 
        !          6794:     # write Resources/preremove)
        !          6795:     for cmp in $pp_components; do
        !          6796:        if test -s $pp_wrkdir/%preun.$cmp; then
        !          6797:            if test ! -s $Resources/preremove; then
        !          6798:                echo "#!/bin/sh" > $Resources/preremove
        !          6799:                chmod +x $Resources/preremove
        !          6800:            fi
        !          6801:            cat $pp_wrkdir/%preun.$cmp >> $Resources/preremove
        !          6802:            echo : >> $Resources/preremove
        !          6803:        fi
        !          6804:     done
        !          6805: 
        !          6806:     # write Resources/postremove)
        !          6807:     for cmp in $pp_components; do
        !          6808:        if test -s $pp_wrkdir/%postun.$cmp; then
        !          6809:            if test ! -s $Resources/postremove; then
        !          6810:                echo "#!/bin/sh" > $Resources/postremove
        !          6811:                chmod +x $Resources/postremove
        !          6812:            fi
        !          6813:            cat $pp_wrkdir/%postun.$cmp >> $Resources/postremove
        !          6814:            echo : >> $Resources/postremove
        !          6815:        fi
        !          6816:     done
        !          6817: 
        !          6818:     # write uninstall info
        !          6819:     echo "version=$version" > $Resources/uninstall
        !          6820:     if [ -n "$pp_macos_requires" ];then
        !          6821:         echo "requires=$pp_macos_requires" >> $Resources/uninstall
        !          6822:     fi
        !          6823: 
        !          6824:     # Create the bill-of-materials (Archive.bom)
        !          6825:     cat $pp_wrkdir/%files.* | pp_macos_files_bom | sort |
        !          6826:        pp_macos_bom_fix_parents > $pp_wrkdir/tmp.bomls
        !          6827: 
        !          6828:     pp_macos_mkbom $pp_wrkdir/tmp.bomls $Contents/Archive.bom
        !          6829: 
        !          6830:     # Create the cpio archive (Archive.pax.gz)
        !          6831:     # On 10.5, we used "-f -" to write explicitly to stdout
        !          6832:     (
        !          6833:     cd $pp_destdir &&
        !          6834:     cat $pp_wrkdir/%files.* | awk '{ print "." $6 }' | sed '/\/$/d' | sort | /bin/pax -w -f - | gzip -9 -c > $Contents/Archive.pax.gz
        !          6835:     )
        !          6836: 
        !          6837:        $pp_macos_sudo rm -rf $pp_wrkdir/bom_stage
        !          6838: 
        !          6839:     hdiutil create -fs HFS+ -srcfolder $pkgdir -volname $name ${name}-${version}.dmg
        !          6840: }
        !          6841: 
        !          6842: pp_backend_macos_cleanup () {
        !          6843:     :
        !          6844: }
        !          6845: 
        !          6846: pp_backend_macos_names () {
        !          6847:     echo ${name}.pkg
        !          6848: }
        !          6849: 
        !          6850: pp_backend_macos_install_script () {
        !          6851:     echo '#!/bin/sh'
        !          6852:     typeset pkgname platform
        !          6853: 
        !          6854:     pkgname="`pp_backend_macos_names`"
        !          6855:     platform="`pp_backend_macos_probe`"
        !          6856:     pp_install_script_common
        !          6857: 
        !          6858:     cat <<.
        !          6859:        test \$# -eq 0 && usage
        !          6860:        op="\$1"; shift
        !          6861: 
        !          6862:        case "\$op" in
        !          6863:        list-components)
        !          6864:            test \$# -eq 0 || usage \$op
        !          6865:            echo "$pp_components"
        !          6866:            ;;
        !          6867:        list-services)
        !          6868:            test \$# -eq 0 || usage \$op
        !          6869:            echo "$pp_services"
        !          6870:            ;;
        !          6871:        list-files)
        !          6872:            test \$# -ge 1 || usage \$op
        !          6873:            echo \${PP_PKGDESTDIR:-.}/"$pkgname"
        !          6874:            ;;
        !          6875:        install)
        !          6876:            test \$# -ge 1 || usage \$op
        !          6877:            vol=/Volumes/pp\$\$
        !          6878:            pkg=\$vol/${name}-${version}.pkg
        !          6879:            hdiutil attach -readonly -mountpoint \$vol \
        !          6880:                \${PP_PKGDESTDIR:-.}/"$pkgname"
        !          6881:            trap "hdiutil detach \$vol" 0
        !          6882:            installer -pkginfo -pkg \$pkg
        !          6883:            installer -verbose -pkg \$pkg -target /
        !          6884:            ;;
        !          6885:        uninstall)
        !          6886:            test \$# -ge 1 || usage \$op
        !          6887:            # XXX
        !          6888:            echo "Uninstall not implemented" >&2
        !          6889:            exit 1;;
        !          6890:        start|stop)
        !          6891:            test \$# -ge 1 || usage \$op
        !          6892:            ec=0
        !          6893:            for svc
        !          6894:            do
        !          6895:                # XXX
        !          6896:                echo "\${op} not implemented" >&2
        !          6897:                ec=1
        !          6898:            done
        !          6899:            exit \$ec
        !          6900:            ;;
        !          6901:        print-platform)
        !          6902:            echo "$platform"
        !          6903:            ;;
        !          6904:        *)
        !          6905:            usage;;
        !          6906:        esac
        !          6907: .
        !          6908: }
        !          6909: 
        !          6910: pp_backend_macos_init_svc_vars () {
        !          6911:     :
        !          6912: }
        !          6913: 
        !          6914: pp_backend_macos_probe () {
        !          6915:     typeset name vers arch
        !          6916:     case `sw_vers -productName` in
        !          6917:          "Mac OS X") name="macos";;
        !          6918:         *)          name="unknown";;
        !          6919:     esac
        !          6920:     vers=`sw_vers -productVersion | sed -e 's/^\([^.]*\)\.\([^.]*\).*/\1\2/'`
        !          6921:     arch=`arch`
        !          6922:     echo "$name$vers-$arch"
        !          6923: }
        !          6924: 
        !          6925: pp_backend_macos_vas_platforms () {
        !          6926:     echo "osx"    # XXX non-really sure what they do.. it should be "macos"
        !          6927: }
        !          6928: pp_backend_macos_function () {
        !          6929:     case $1 in
        !          6930:        _pp_macos_search_unused) cat<<'.';;
        !          6931:            # Find an unused value in the given path
        !          6932:            # args: path attribute minid [maxid]
        !          6933:                pp_tmp_val=$3
        !          6934:                while :; do
        !          6935:                    test $pp_tmp_val -ge ${4:-999999} && return 1
        !          6936:                    /usr/bin/dscl . -search "$1" "$2" $pp_tmp_val |
        !          6937:                        grep . > /dev/null || break
        !          6938:                    pp_tmp_val=`expr $pp_tmp_val + 1`
        !          6939:                done
        !          6940:                echo $pp_tmp_val
        !          6941: .
        !          6942:         pp_mkgroup:depends) echo _pp_macos_search_unused;;
        !          6943:         pp_mkgroup) cat<<'.';;
        !          6944:            set -e
        !          6945:            /usr/bin/dscl . -read /Groups/"$1" >/dev/null 2>&1 && return
        !          6946:            pp_tmp_gid=`_pp_macos_search_unused /Groups PrimaryGroupID 100`
        !          6947:            /usr/bin/dscl . -create /Groups/"$1"
        !          6948:            /usr/bin/dscl . -create /Groups/"$1" PrimaryGroupID $pp_tmp_gid
        !          6949:            /usr/bin/dscl . -create /Groups/"$1" RealName "Group $1"
        !          6950:            /usr/bin/dscl . -create /Groups/"$1" GroupMembership ""
        !          6951:            /usr/bin/dscl . -create /Groups/"$1" Password '*'
        !          6952: .
        !          6953:         pp_mkuser:depends) echo pp_mkgroup _pp_macos_search_unused;;
        !          6954:         pp_mkuser) cat<<'.';;
        !          6955:            set -e
        !          6956:            /usr/bin/dscl . -read /Users/"$1" >/dev/null 2>&1 && return
        !          6957:            pp_tmp_uid=`_pp_macos_search_unused /Users UniqueID 100`
        !          6958:            pp_mkgroup "${2:-$1}"
        !          6959:            pp_tmp_gid=`/usr/bin/dscl . -read /Groups/"${2:-$1}" \
        !          6960:                PrimaryGroupID | awk '{print $2}'`
        !          6961:            /usr/bin/dscl . -create /Users/"$1"
        !          6962:            /usr/bin/dscl . -create /Users/"$1" PrimaryGroupID $pp_tmp_gid
        !          6963:            /usr/bin/dscl . -create /Users/"$1" NFSHomeDirectory \
        !          6964:                                    "${3:-/var/empty}"
        !          6965:            /usr/bin/dscl . -create /Users/"$1" UserShell \
        !          6966:                                    "${4:-/usr/bin/false}"
        !          6967:            /usr/bin/dscl . -create /Users/"$1" RealName "$1"
        !          6968:            /usr/bin/dscl . -create /Users/"$1" UniqueID $pp_tmp_uid
        !          6969:            /usr/bin/dscl . -create /Users/"$1" Password '*'
        !          6970: .
        !          6971:         pp_havelib) cat<<'.';;
        !          6972:            # (use otool -L to find dependent libraries)
        !          6973:             for pp_tmp_dir in `echo "${3:+$3:}/usr/local/lib:/lib:/usr/lib" |
        !          6974:                    tr : ' '`; do
        !          6975:                 test -r "$pp_tmp_dir/lib$1{$2:+.$2}.dylib" && return 0
        !          6976:             done
        !          6977:             return 1
        !          6978: .
        !          6979:        *) false;;
        !          6980:     esac
        !          6981: }
        !          6982: 
        !          6983: pp_platforms="$pp_platforms inst"
        !          6984: 
        !          6985: pp_backend_inst_detect () {
        !          6986:     case "$1" in
        !          6987:        IRIX*)  return 0;;
        !          6988:        *)      return 1;;
        !          6989:     esac
        !          6990: }
        !          6991: 
        !          6992: pp_backend_inst_init () {
        !          6993:     pp_readlink_fn=pp_ls_readlink
        !          6994: }
        !          6995: 
        !          6996: pp_backend_inst_create_idb()
        !          6997: {
        !          6998:     typeset t m o g f p st
        !          6999: 
        !          7000:     while read t m o g f p st; do
        !          7001:         if test x"$o" = x"-"; then
        !          7002:             o="root"
        !          7003:         fi
        !          7004:         if test x"$g" = x"-"; then
        !          7005:             g="sys"
        !          7006:         fi
        !          7007:         case "$t" in
        !          7008:             f)  test x"$m" = x"-" && m=444
        !          7009:                 echo "f 0$m $o $g $p $p $name.sw.base"
        !          7010:                 ;;
        !          7011:             d)  test x"$m" = x"-" && m=555
        !          7012:                 echo "d 0$m $o $g $p $p $name.sw.base"
        !          7013:                 ;;
        !          7014:             s)  test x"$m" = x"-" && m=777
        !          7015:                 test x"$m" = x"777" ||
        !          7016:                     pp_warn "$p: invalid mode $m for symlink, should be 777 or -"
        !          7017:                 echo "l 0$m $o $g $p $p $name.sw.base symval($st)"
        !          7018:                 ;;
        !          7019:         esac
        !          7020:     done
        !          7021: }
        !          7022: 
        !          7023: pp_backend_inst_create_spec()
        !          7024: {
        !          7025:     echo "product $name"
        !          7026:     echo "    id \"${summary}. Version: ${version}\""
        !          7027:     echo "    image sw"
        !          7028:     echo "        id \"Software\""
        !          7029:     echo "        version $version"
        !          7030:     echo "        order 9999"
        !          7031:     echo "        subsys base"
        !          7032:     echo "            id \"Base Software\""
        !          7033:     echo "            replaces self"
        !          7034:     echo "            exp $name.sw.base"
        !          7035:     echo "        endsubsys"
        !          7036:     echo "    endimage"
        !          7037:     echo "endproduct"
        !          7038: }
        !          7039: 
        !          7040: pp_backend_inst () {
        !          7041:     curdir=`pwd`
        !          7042: 
        !          7043:     cd "$pp_opt_wrkdir"
        !          7044: 
        !          7045:     # initialize
        !          7046:     pp_inst_tardist=tardist
        !          7047:     pp_inst_spec=${name}.spec
        !          7048:     pp_inst_idb=${name}.idb
        !          7049:  
        !          7050:     rm -rf $pp_inst_tardist $pp_inst_spec $pp_inst_idb
        !          7051:     mkdir -p $pp_inst_tardist
        !          7052: 
        !          7053:     # Create idb file
        !          7054:     (for _cmp in $pp_components; do
        !          7055:         cat  %files.$_cmp | sort +4u -6 | pp_backend_inst_create_idb
        !          7056:     done) >> $pp_inst_idb
        !          7057: 
        !          7058:     pp_backend_inst_create_spec >> $pp_inst_spec
        !          7059: 
        !          7060:     # Generate tardist
        !          7061:     gendist -verbose -all -root / -source $pp_opt_destdir -idb $pp_inst_idb -spec $pp_inst_spec -dist $pp_inst_tardist $name
        !          7062:     tar -cvf `pp_backend_inst_names` $pp_inst_tardist
        !          7063: 
        !          7064:     cd "$curdir"
        !          7065: }
        !          7066: 
        !          7067: pp_backend_inst_cleanup () {
        !          7068:     :
        !          7069: }
        !          7070: 
        !          7071: pp_backend_inst_names () {
        !          7072:     echo ${name}-${version}.tardist
        !          7073: }
        !          7074: 
        !          7075: pp_backend_inst_install_script () {
        !          7076:     :
        !          7077: }
        !          7078: 
        !          7079: pp_backend_inst_function () {
        !          7080:     echo false
        !          7081: }
        !          7082: 
        !          7083: pp_backend_inst_init_svc_vars () {
        !          7084:     :
        !          7085: }
        !          7086: 
        !          7087: pp_backend_inst_probe () {
        !          7088:     cpu=`hinv|sed -n '/^CPU/{s/000 /k /;s/^CPU: //;s/ Process.*//;s/^MIPS //;p;q;}'|tr A-Z a-z`
        !          7089:     echo irix`uname -r`-$cpu
        !          7090: }
        !          7091: 
        !          7092: pp_backend_inst_vas_platforms () {
        !          7093:     echo "irix-65"
        !          7094: }
        !          7095: 
        !          7096: pp_platforms="$pp_platforms null"
        !          7097: 
        !          7098: pp_backend_null_detect () {
        !          7099:     ! :
        !          7100: }
        !          7101: 
        !          7102: pp_backend_null_init () {
        !          7103:     :
        !          7104: }
        !          7105: 
        !          7106: 
        !          7107: pp_backend_null () {
        !          7108:     :
        !          7109: }
        !          7110: 
        !          7111: pp_backend_null_cleanup () {
        !          7112:     :
        !          7113: }
        !          7114: 
        !          7115: pp_backend_null_names () {
        !          7116:     :
        !          7117: }
        !          7118: 
        !          7119: pp_backend_null_install_script () {
        !          7120:     :
        !          7121: }
        !          7122: 
        !          7123: pp_backend_null_function () {
        !          7124:     echo false
        !          7125: }
        !          7126: 
        !          7127: pp_backend_null_init_svc_vars () {
        !          7128:     :
        !          7129: }
        !          7130: 
        !          7131: pp_backend_null_probe () {
        !          7132:     echo unknown-unknown
        !          7133: }
        !          7134: 
        !          7135: pp_backend_null_vas_platforms () {
        !          7136: :
        !          7137: }
        !          7138: 
        !          7139: 
        !          7140: quest_require_vas () {
        !          7141:     typeset v d
        !          7142: 
        !          7143:     if test $# -ne 1; then
        !          7144:         return
        !          7145:     fi
        !          7146:     set -- `echo "$1" | tr . ' '` 0 0 0
        !          7147: 
        !          7148:     for d
        !          7149:     do
        !          7150:         echo $d | grep '^[0-9][0-9]*$' > /dev/null ||
        !          7151:             pp_error "quest_require_vas: Bad version component $d"
        !          7152:     done
        !          7153: 
        !          7154:     test $# -lt 4 &&
        !          7155:             pp_error "quest_require_vas: missing version number"
        !          7156: 
        !          7157:     case "$1.$2.$3.$4" in
        !          7158:         *.0.0.0) v=$1;;
        !          7159:         *.*.0.0) v=$1.$2;;
        !          7160:         *.*.*.0) v=$1.$2.$3;;
        !          7161:         *)       v=$1.$2.$3.$4;;
        !          7162:     esac
        !          7163: 
        !          7164:     cat <<.
        !          7165:         if test -x /opt/quest/bin/vastool &&
        !          7166:            /opt/quest/bin/vastool -v |
        !          7167:             awk 'NR == 1 {print \$4}' |
        !          7168:             awk -F. '{ if (\$1<$1 || \$1==$1 && ( \
        !          7169:                            \$2<$2 || \$2==$2 && ( \
        !          7170:                            \$3<$3 || \$2==$3 && ( \
        !          7171:                            \$4<$4 )))) exit(1); }'
        !          7172:         then
        !          7173:             exit 0
        !          7174:         else
        !          7175:             echo "Requires VAS $v or later"
        !          7176:             exit 1
        !          7177:         fi
        !          7178: .
        !          7179: }
        !          7180: pp_main ${1+"$@"}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>