Annotation of embedaddon/sudo/pp, revision 1.1.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>