Annotation of embedaddon/php/build/shtool, revision 1.1

1.1     ! misho       1: #!/bin/sh
        !             2: ##
        !             3: ##  GNU shtool -- The GNU Portable Shell Tool
        !             4: ##  Copyright (c) 1994-2008 Ralf S. Engelschall <rse@engelschall.com>
        !             5: ##
        !             6: ##  See http://www.gnu.org/software/shtool/ for more information.
        !             7: ##  See ftp://ftp.gnu.org/gnu/shtool/ for latest version.
        !             8: ##
        !             9: ##  Version:  2.0.8 (18-Jul-2008)
        !            10: ##  Contents: 5/19 available modules
        !            11: ##
        !            12: 
        !            13: ##
        !            14: ##  This program is free software; you can redistribute it and/or modify
        !            15: ##  it under the terms of the GNU General Public License as published by
        !            16: ##  the Free Software Foundation; either version 2 of the License, or
        !            17: ##  (at your option) any later version.
        !            18: ##
        !            19: ##  This program is distributed in the hope that it will be useful,
        !            20: ##  but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            21: ##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
        !            22: ##  General Public License for more details.
        !            23: ##
        !            24: ##  You should have received a copy of the GNU General Public License
        !            25: ##  along with this program; if not, write to the Free Software
        !            26: ##  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
        !            27: ##  USA, or contact Ralf S. Engelschall <rse@engelschall.com>.
        !            28: ##
        !            29: ##  NOTICE: Given that you include this file verbatim into your own
        !            30: ##  source tree, you are justified in saying that it remains separate
        !            31: ##  from your package, and that this way you are simply just using GNU
        !            32: ##  shtool. So, in this situation, there is no requirement that your
        !            33: ##  package itself is licensed under the GNU General Public License in
        !            34: ##  order to take advantage of GNU shtool.
        !            35: ##
        !            36: 
        !            37: ##
        !            38: ##  Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]
        !            39: ##
        !            40: ##  Available commands:
        !            41: ##    echo       Print string with optional construct expansion
        !            42: ##    install    Install a program, script or datafile
        !            43: ##    mkdir      Make one or more directories
        !            44: ##    platform   Platform Identification Utility
        !            45: ##    path       Deal with program paths
        !            46: ##
        !            47: ##  Not available commands (because module was not built-in):
        !            48: ##    mdate      Pretty-print modification time of a file or dir
        !            49: ##    table      Pretty-print a field-separated list as a table
        !            50: ##    prop       Display progress with a running propeller
        !            51: ##    move       Move files with simultaneous substitution
        !            52: ##    mkln       Make link with calculation of relative paths
        !            53: ##    mkshadow   Make a shadow tree through symbolic links
        !            54: ##    fixperm    Fix file permissions inside a source tree
        !            55: ##    rotate     Logfile rotation
        !            56: ##    tarball    Roll distribution tarballs
        !            57: ##    subst      Apply sed(1) substitution operations
        !            58: ##    arx        Extended archive command
        !            59: ##    slo        Separate linker options by library class
        !            60: ##    scpp       Sharing C Pre-Processor
        !            61: ##    version    Maintain a version information file
        !            62: ##
        !            63: 
        !            64: #   maximum Bourne-Shell compatibility
        !            65: if [ ".$ZSH_VERSION" != . ] && (emulate sh) >/dev/null 2>&1; then
        !            66:     #   reconfigure zsh(1)
        !            67:     emulate sh
        !            68:     NULLCMD=:
        !            69:     alias -g '${1+"$@"}'='"$@"'
        !            70: elif [ ".$BASH_VERSION" != . ] && (set -o posix) >/dev/null 2>&1; then
        !            71:     #   reconfigure bash(1)
        !            72:     set -o posix
        !            73: fi
        !            74: 
        !            75: #   maximum independence of NLS nuisances
        !            76: for var in \
        !            77:     LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
        !            78:     LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
        !            79:     LC_TELEPHONE LC_TIME
        !            80: do
        !            81:     if (set +x; test -z "`(eval $var=C; export $var) 2>&1`"); then
        !            82:         eval $var=C; export $var
        !            83:     else
        !            84:         unset $var
        !            85:     fi
        !            86: done
        !            87: 
        !            88: #   initial command line handling
        !            89: if [ $# -eq 0 ]; then
        !            90:     echo "$0:Error: invalid command line" 1>&2
        !            91:     echo "$0:Hint:  run \`$0 -h' for usage" 1>&2
        !            92:     exit 1
        !            93: fi
        !            94: if [ ".$1" = ".-h" ] || [ ".$1" = ".--help" ]; then
        !            95:     echo "This is GNU shtool, version 2.0.8 (18-Jul-2008)"
        !            96:     echo 'Copyright (c) 1994-2008 Ralf S. Engelschall <rse@engelschall.com>'
        !            97:     echo 'Report bugs to <bug-shtool@gnu.org>'
        !            98:     echo ''
        !            99:     echo 'Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]'
        !           100:     echo ''
        !           101:     echo 'Available global <options>:'
        !           102:     echo '  -v, --version   display shtool version information'
        !           103:     echo '  -h, --help      display shtool usage help page (this one)'
        !           104:     echo '  -d, --debug     display shell trace information'
        !           105:     echo '  -r, --recreate  recreate this shtool script via shtoolize'
        !           106:     echo ''
        !           107:     echo 'Available <cmd-name> [<cmd-options>] [<cmd-args>]:'
        !           108:     echo '  echo     [-n|--newline] [-e|--expand] [<string> ...]'
        !           109:     echo '  install  [-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy]'
        !           110:     echo '           [-C|--compare-copy] [-s|--strip] [-m|--mode <mode>]'
        !           111:     echo '           [-o|--owner <owner>] [-g|--group <group>] [-e|--exec'
        !           112:     echo '           <sed-cmd>] <file> [<file> ...] <path>'
        !           113:     echo '  mkdir    [-t|--trace] [-f|--force] [-p|--parents] [-m|--mode'
        !           114:     echo '           <mode>] [-o|--owner <owner>] [-g|--group <group>] <dir>'
        !           115:     echo '           [<dir> ...]'
        !           116:     echo '  platform [-F|--format <format>] [-S|--sep <string>] [-C|--conc'
        !           117:     echo '           <string>] [-L|--lower] [-U|--upper] [-v|--verbose]'
        !           118:     echo '           [-c|--concise] [-n|--no-newline] [-t|--type <type>]'
        !           119:     echo '           [-V|--version] [-h|--help]'
        !           120:     echo '  path     [-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename]'
        !           121:     echo '           [-m|--magic] [-p|--path <path>] <str> [<str> ...]'
        !           122:     echo ''
        !           123:     echo 'Not available <cmd-name> (because module was not built-in):'
        !           124:     echo '  mdate    [-n|--newline] [-z|--zero] [-s|--shorten] [-d|--digits]'
        !           125:     echo '           [-f|--field-sep <str>] [-o|--order <spec>] <path>'
        !           126:     echo '  table    [-F|--field-sep <sep>] [-w|--width <width>] [-c|--columns'
        !           127:     echo '           <cols>] [-s|--strip <strip>] <str><sep><str>...'
        !           128:     echo '  prop     [-p|--prefix <str>]'
        !           129:     echo '  move     [-v|--verbose] [-t|--trace] [-e|--expand] [-p|--preserve]'
        !           130:     echo '           <src-file> <dst-file>'
        !           131:     echo '  mkln     [-t|--trace] [-f|--force] [-s|--symbolic] <src-path>'
        !           132:     echo '           [<src-path> ...] <dst-path>'
        !           133:     echo '  mkshadow [-v|--verbose] [-t|--trace] [-a|--all] <src-dir> <dst-dir>'
        !           134:     echo '  fixperm  [-v|--verbose] [-t|--trace] <path> [<path> ...]'
        !           135:     echo '  rotate   [-v|--verbose] [-t|--trace] [-f|--force] [-n|--num-files'
        !           136:     echo '           <count>] [-s|--size <size>] [-c|--copy] [-r|--remove]'
        !           137:     echo '           [-a|--archive-dir <dir>] [-z|--compress [<tool>:]<level>]'
        !           138:     echo '           [-b|--background] [-d|--delay] [-p|--pad <len>] [-m|--mode'
        !           139:     echo '           <mode>] [-o|--owner <owner>] [-g|--group <group>] [-M|--migrate'
        !           140:     echo '           <cmd>] [-P|--prolog <cmd>] [-E|--epilog <cmd>] <file> [...]'
        !           141:     echo '  tarball  [-t|--trace] [-v|--verbose] [-o|--output <tarball>]'
        !           142:     echo '           [-c|--compress <prog>] [-d|--directory <dir>] [-u|--user'
        !           143:     echo '           <user>] [-g|--group <group>] [-e|--exclude <pattern>]'
        !           144:     echo '           <path> [<path> ...]'
        !           145:     echo '  subst    [-v|--verbose] [-t|--trace] [-n|--nop] [-w|--warning]'
        !           146:     echo '           [-q|--quiet] [-s|--stealth] [-i|--interactive] [-b|--backup'
        !           147:     echo '           <ext>] [-e|--exec <cmd>] [-f|--file <cmd-file>] [<file>]'
        !           148:     echo '           [...]'
        !           149:     echo '  arx      [-t|--trace] [-C|--command <cmd>] <op> <archive> [<file>'
        !           150:     echo '           ...]'
        !           151:     echo '  slo      [-p|--prefix <str>] -- -L<dir> -l<lib> [-L<dir> -l<lib>'
        !           152:     echo '           ...]'
        !           153:     echo '  scpp     [-v|--verbose] [-p|--preserve] [-f|--filter <filter>]'
        !           154:     echo '           [-o|--output <ofile>] [-t|--template <tfile>] [-M|--mark'
        !           155:     echo '           <mark>] [-D|--define <dname>] [-C|--class <cname>]'
        !           156:     echo '           <file> [<file> ...]'
        !           157:     echo '  version  [-l|--language <lang>] [-n|--name <name>] [-p|--prefix'
        !           158:     echo '           <prefix>] [-s|--set <version>] [-e|--edit] [-i|--increase'
        !           159:     echo '           <knob>] [-d|--display <type>] <file>'
        !           160:     echo ''
        !           161:     exit 0
        !           162: fi
        !           163: if [ ".$1" = ".-v" ] || [ ".$1" = ".--version" ]; then
        !           164:     echo "GNU shtool 2.0.8 (18-Jul-2008)"
        !           165:     exit 0
        !           166: fi
        !           167: if [ ".$1" = ".-r" ] || [ ".$1" = ".--recreate" ]; then
        !           168:     shtoolize -obuild/shtool echo install mkdir platform path
        !           169:     exit 0
        !           170: fi
        !           171: if [ ".$1" = ".-d" ] || [ ".$1" = ".--debug" ]; then
        !           172:     shift
        !           173:     set -x
        !           174: fi
        !           175: name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'`
        !           176: case "$name" in
        !           177:     echo|install|mkdir|platform|path )
        !           178:         #   implicit tool command selection
        !           179:         tool="$name"
        !           180:         ;;
        !           181:     * )
        !           182:         #   explicit tool command selection
        !           183:         tool="$1"
        !           184:         shift
        !           185:         ;;
        !           186: esac
        !           187: arg_spec=""
        !           188: opt_spec=""
        !           189: gen_tmpfile=no
        !           190: 
        !           191: ##
        !           192: ##  DISPATCH INTO SCRIPT PROLOG
        !           193: ##
        !           194: 
        !           195: case $tool in
        !           196:     echo )
        !           197:         str_tool="echo"
        !           198:         str_usage="[-n|--newline] [-e|--expand] [<string> ...]"
        !           199:         arg_spec="0+"
        !           200:         opt_spec="n.e."
        !           201:         opt_alias="n:newline,e:expand"
        !           202:         opt_n=no
        !           203:         opt_e=no
        !           204:         ;;
        !           205:     install )
        !           206:         str_tool="install"
        !           207:         str_usage="[-v|--verbose] [-t|--trace] [-d|--mkdir] [-c|--copy] [-C|--compare-copy] [-s|--strip] [-m|--mode <mode>] [-o|--owner <owner>] [-g|--group <group>] [-e|--exec <sed-cmd>] <file> [<file> ...] <path>"
        !           208:         arg_spec="1+"
        !           209:         opt_spec="v.t.d.c.C.s.m:o:g:e+"
        !           210:         opt_alias="v:verbose,t:trace,d:mkdir,c:copy,C:compare-copy,s:strip,m:mode,o:owner,g:group,e:exec"
        !           211:         opt_v=no
        !           212:         opt_t=no
        !           213:         opt_d=no
        !           214:         opt_c=no
        !           215:         opt_C=no
        !           216:         opt_s=no
        !           217:         opt_m="0755"
        !           218:         opt_o=""
        !           219:         opt_g=""
        !           220:         opt_e=""
        !           221:         ;;
        !           222:     mkdir )
        !           223:         str_tool="mkdir"
        !           224:         str_usage="[-t|--trace] [-f|--force] [-p|--parents] [-m|--mode <mode>] [-o|--owner <owner>] [-g|--group <group>] <dir> [<dir> ...]"
        !           225:         arg_spec="1+"
        !           226:         opt_spec="t.f.p.m:o:g:"
        !           227:         opt_alias="t:trace,f:force,p:parents,m:mode,o:owner,g:group"
        !           228:         opt_t=no
        !           229:         opt_f=no
        !           230:         opt_p=no
        !           231:         opt_m=""
        !           232:         opt_o=""
        !           233:         opt_g=""
        !           234:         ;;
        !           235:     platform )
        !           236:         str_tool="platform"
        !           237:         str_usage="[-F|--format <format>] [-S|--sep <string>] [-C|--conc <string>] [-L|--lower] [-U|--upper] [-v|--verbose] [-c|--concise] [-n|--no-newline] [-t|--type <type>] [-V|--version] [-h|--help]"
        !           238:         arg_spec="0="
        !           239:         opt_spec="F:S:C:L.U.v.c.n.t:d.V.h."
        !           240:         opt_alias="F:format,S:sep,C:conc,L:lower,U:upper,v:verbose,c:consise,t:type,n:no-newline,V:version,h:help"
        !           241:         opt_F="%{sp} (%{ap})"
        !           242:         opt_S=" "
        !           243:         opt_C="/"
        !           244:         opt_L=no
        !           245:         opt_U=no
        !           246:         opt_t=""
        !           247:         opt_v=no
        !           248:         opt_c=no
        !           249:         opt_n=no
        !           250:         opt_V=no
        !           251:         opt_h=no
        !           252:         ;;
        !           253:     path )
        !           254:         str_tool="path"
        !           255:         str_usage="[-s|--suppress] [-r|--reverse] [-d|--dirname] [-b|--basename] [-m|--magic] [-p|--path <path>] <str> [<str> ...]"
        !           256:         gen_tmpfile=yes
        !           257:         arg_spec="1+"
        !           258:         opt_spec="s.r.d.b.m.p:"
        !           259:         opt_alias="s:suppress,r:reverse,d:dirname,b:basename,m:magic,p:path"
        !           260:         opt_s=no
        !           261:         opt_r=no
        !           262:         opt_d=no
        !           263:         opt_b=no
        !           264:         opt_m=no
        !           265:         opt_p="$PATH"
        !           266:         ;;
        !           267:     -* )
        !           268:         echo "$0:Error: unknown option \`$tool'" 2>&1
        !           269:         echo "$0:Hint:  run \`$0 -h' for usage" 2>&1
        !           270:         exit 1
        !           271:         ;;
        !           272:     * )
        !           273:         echo "$0:Error: unknown command \`$tool'" 2>&1
        !           274:         echo "$0:Hint:  run \`$0 -h' for usage" 2>&1
        !           275:         exit 1
        !           276:         ;;
        !           277: esac
        !           278: 
        !           279: ##
        !           280: ##  COMMON UTILITY CODE
        !           281: ##
        !           282: 
        !           283: #   commonly used ASCII values
        !           284: ASC_TAB="      "
        !           285: ASC_NL="
        !           286: "
        !           287: 
        !           288: #   determine name of tool
        !           289: if [ ".$tool" != . ]; then
        !           290:     #   used inside shtool script
        !           291:     toolcmd="$0 $tool"
        !           292:     toolcmdhelp="shtool $tool"
        !           293:     msgprefix="shtool:$tool"
        !           294: else
        !           295:     #   used as standalone script
        !           296:     toolcmd="$0"
        !           297:     toolcmdhelp="sh $0"
        !           298:     msgprefix="$str_tool"
        !           299: fi
        !           300: 
        !           301: #   parse argument specification string
        !           302: eval `echo $arg_spec |\
        !           303:       sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'`
        !           304: 
        !           305: #   parse option specification string
        !           306: eval `echo h.$opt_spec |\
        !           307:       sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'`
        !           308: 
        !           309: #   parse option alias string
        !           310: eval `echo h:help,$opt_alias |\
        !           311:       sed -e 's/-/_/g' -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'`
        !           312: 
        !           313: #   interate over argument line
        !           314: opt_PREV=''
        !           315: while [ $# -gt 0 ]; do
        !           316:     #   special option stops processing
        !           317:     if [ ".$1" = ".--" ]; then
        !           318:         shift
        !           319:         break
        !           320:     fi
        !           321: 
        !           322:     #   determine option and argument
        !           323:     opt_ARG_OK=no
        !           324:     if [ ".$opt_PREV" != . ]; then
        !           325:         #   merge previous seen option with argument
        !           326:         opt_OPT="$opt_PREV"
        !           327:         opt_ARG="$1"
        !           328:         opt_ARG_OK=yes
        !           329:         opt_PREV=''
        !           330:     else
        !           331:         #   split argument into option and argument
        !           332:         case "$1" in
        !           333:             --[a-zA-Z0-9]*=*)
        !           334:                 eval `echo "x$1" |\
        !           335:                       sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'`
        !           336:                 opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'`
        !           337:                 eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}"
        !           338:                 ;;
        !           339:             --[a-zA-Z0-9]*)
        !           340:                 opt_OPT=`echo "x$1" | cut -c4-`
        !           341:                 opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'`
        !           342:                 eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}"
        !           343:                 opt_ARG=''
        !           344:                 ;;
        !           345:             -[a-zA-Z0-9]*)
        !           346:                 eval `echo "x$1" |\
        !           347:                       sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \
        !           348:                           -e 's/";\(.*\)$/"; opt_ARG="\1"/'`
        !           349:                 ;;
        !           350:             -[a-zA-Z0-9])
        !           351:                 opt_OPT=`echo "x$1" | cut -c3-`
        !           352:                 opt_ARG=''
        !           353:                 ;;
        !           354:             *)
        !           355:                 break
        !           356:                 ;;
        !           357:         esac
        !           358:     fi
        !           359: 
        !           360:     #   eat up option
        !           361:     shift
        !           362: 
        !           363:     #   determine whether option needs an argument
        !           364:     eval "opt_MODE=\$opt_MODE_${opt_OPT}"
        !           365:     if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then
        !           366:         if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then
        !           367:             opt_PREV="$opt_OPT"
        !           368:             continue
        !           369:         fi
        !           370:     fi
        !           371: 
        !           372:     #   process option
        !           373:     case $opt_MODE in
        !           374:         '.' )
        !           375:             #   boolean option
        !           376:             eval "opt_${opt_OPT}=yes"
        !           377:             ;;
        !           378:         ':' )
        !           379:             #   option with argument (multiple occurances override)
        !           380:             eval "opt_${opt_OPT}=\"\$opt_ARG\""
        !           381:             ;;
        !           382:         '+' )
        !           383:             #   option with argument (multiple occurances append)
        !           384:             eval "opt_${opt_OPT}=\"\$opt_${opt_OPT}\${ASC_NL}\$opt_ARG\""
        !           385:             ;;
        !           386:         * )
        !           387:             echo "$msgprefix:Error: unknown option: \`$opt_OPT'" 1>&2
        !           388:             echo "$msgprefix:Hint:  run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2
        !           389:             exit 1
        !           390:             ;;
        !           391:     esac
        !           392: done
        !           393: if [ ".$opt_PREV" != . ]; then
        !           394:     echo "$msgprefix:Error: missing argument to option \`$opt_PREV'" 1>&2
        !           395:     echo "$msgprefix:Hint:  run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2
        !           396:     exit 1
        !           397: fi
        !           398: 
        !           399: #   process help option
        !           400: if [ ".$opt_h" = .yes ]; then
        !           401:     echo "Usage: $toolcmdhelp $str_usage"
        !           402:     exit 0
        !           403: fi
        !           404: 
        !           405: #   complain about incorrect number of arguments
        !           406: case $arg_MODE in
        !           407:     '=' )
        !           408:         if [ $# -ne $arg_NUMS ]; then
        !           409:             echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2
        !           410:             echo "$msgprefix:Hint:  run \`$toolcmd -h' or \`man shtool' for details" 1>&2
        !           411:             exit 1
        !           412:         fi
        !           413:         ;;
        !           414:     '+' )
        !           415:         if [ $# -lt $arg_NUMS ]; then
        !           416:             echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2
        !           417:             echo "$msgprefix:Hint:  run \`$toolcmd -h' or \`man shtool' for details" 1>&2
        !           418:             exit 1
        !           419:         fi
        !           420:         ;;
        !           421: esac
        !           422: 
        !           423: #   establish a temporary file on request
        !           424: if [ ".$gen_tmpfile" = .yes ]; then
        !           425:     #   create (explicitly) secure temporary directory
        !           426:     if [ ".$TMPDIR" != . ]; then
        !           427:         tmpdir="$TMPDIR"
        !           428:     elif [ ".$TEMPDIR" != . ]; then
        !           429:         tmpdir="$TEMPDIR"
        !           430:     else
        !           431:         tmpdir="/tmp"
        !           432:     fi
        !           433:     tmpdir="$tmpdir/.shtool.$$"
        !           434:     ( umask 077
        !           435:       rm -rf "$tmpdir" >/dev/null 2>&1 || true
        !           436:       mkdir  "$tmpdir" >/dev/null 2>&1
        !           437:       if [ $? -ne 0 ]; then
        !           438:           echo "$msgprefix:Error: failed to create temporary directory \`$tmpdir'" 1>&2
        !           439:           exit 1
        !           440:       fi
        !           441:     )
        !           442: 
        !           443:     #   create (implicitly) secure temporary file
        !           444:     tmpfile="$tmpdir/shtool.tmp"
        !           445:     touch "$tmpfile"
        !           446: fi
        !           447: 
        !           448: #   utility function: map string to lower case
        !           449: util_lower () {
        !           450:     echo "$1" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'
        !           451: }
        !           452: 
        !           453: #   utility function: map string to upper case
        !           454: util_upper () {
        !           455:     echo "$1" | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        !           456: }
        !           457: 
        !           458: #   cleanup procedure
        !           459: shtool_exit () {
        !           460:     rc="$1"
        !           461:     if [ ".$gen_tmpfile" = .yes ]; then
        !           462:         rm -rf "$tmpdir" >/dev/null 2>&1 || true
        !           463:     fi
        !           464:     exit $rc
        !           465: }
        !           466: 
        !           467: ##
        !           468: ##  DISPATCH INTO SCRIPT BODY
        !           469: ##
        !           470: 
        !           471: case $tool in
        !           472: 
        !           473: echo )
        !           474:     ##
        !           475:     ##  echo -- Print string with optional construct expansion
        !           476:     ##  Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com>
        !           477:     ##
        !           478: 
        !           479:     text="$*"
        !           480: 
        !           481:     #   check for broken escape sequence expansion
        !           482:     seo=''
        !           483:     bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'`
        !           484:     if [ ".$bytes" != .3 ]; then
        !           485:         bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'`
        !           486:         if [ ".$bytes" = .3 ]; then
        !           487:             seo='-E'
        !           488:         fi
        !           489:     fi
        !           490: 
        !           491:     #   check for existing -n option (to suppress newline)
        !           492:     minusn=''
        !           493:     bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'`
        !           494:     if [ ".$bytes" = .3 ]; then
        !           495:         minusn='-n'
        !           496:     fi
        !           497: 
        !           498:     #   determine terminal bold sequence
        !           499:     term_bold=''
        !           500:     term_norm=''
        !           501:     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[Bb]'`" != . ]; then
        !           502:         case $TERM in
        !           503:             #   for the most important terminal types we directly know the sequences
        !           504:             xterm|xterm*|vt220|vt220*)
        !           505:                 term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' </dev/null 2>/dev/null`
        !           506:                 term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' </dev/null 2>/dev/null`
        !           507:                 ;;
        !           508:             vt100|vt100*|cygwin)
        !           509:                 term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' </dev/null 2>/dev/null`
        !           510:                 term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' </dev/null 2>/dev/null`
        !           511:                 ;;
        !           512:             #   for all others, we try to use a possibly existing `tput' or `tcout' utility
        !           513:             * )
        !           514:                 paths=`echo $PATH | sed -e 's/:/ /g'`
        !           515:                 for tool in tput tcout; do
        !           516:                     for dir in $paths; do
        !           517:                         if [ -r "$dir/$tool" ]; then
        !           518:                             for seq in bold md smso; do # 'smso' is last
        !           519:                                 bold="`$dir/$tool $seq 2>/dev/null`"
        !           520:                                 if [ ".$bold" != . ]; then
        !           521:                                     term_bold="$bold"
        !           522:                                     break
        !           523:                                 fi
        !           524:                             done
        !           525:                             if [ ".$term_bold" != . ]; then
        !           526:                                 for seq in sgr0 me rmso init reset; do # 'reset' is last
        !           527:                                     norm="`$dir/$tool $seq 2>/dev/null`"
        !           528:                                     if [ ".$norm" != . ]; then
        !           529:                                         term_norm="$norm"
        !           530:                                         break
        !           531:                                     fi
        !           532:                                 done
        !           533:                             fi
        !           534:                             break
        !           535:                         fi
        !           536:                     done
        !           537:                     if [ ".$term_bold" != . ] && [ ".$term_norm" != . ]; then
        !           538:                         break;
        !           539:                     fi
        !           540:                 done
        !           541:                 ;;
        !           542:         esac
        !           543:         if [ ".$term_bold" = . ] || [ ".$term_norm" = . ]; then
        !           544:             echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2
        !           545:             term_bold=''
        !           546:             term_norm=''
        !           547:         fi
        !           548:     fi
        !           549: 
        !           550:     #   determine user name
        !           551:     username=''
        !           552:     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[uUgG]'`" != . ]; then
        !           553:         username="`(id -un) 2>/dev/null`"
        !           554:         if [ ".$username" = . ]; then
        !           555:             str="`(id) 2>/dev/null`"
        !           556:             if [ ".`echo $str | grep '^uid[    ]*=[    ]*[0-9]*('`" != . ]; then
        !           557:                 username=`echo $str | sed -e 's/^uid[  ]*=[    ]*[0-9]*(//' -e 's/).*$//'`
        !           558:             fi
        !           559:             if [ ".$username" = . ]; then
        !           560:                 username="$LOGNAME"
        !           561:                 if [ ".$username" = . ]; then
        !           562:                     username="$USER"
        !           563:                     if [ ".$username" = . ]; then
        !           564:                         username="`(whoami) 2>/dev/null |\
        !           565:                                    awk '{ printf("%s", $1); }'`"
        !           566:                         if [ ".$username" = . ]; then
        !           567:                             username="`(who am i) 2>/dev/null |\
        !           568:                                        awk '{ printf("%s", $1); }'`"
        !           569:                             if [ ".$username" = . ]; then
        !           570:                                 username='unknown'
        !           571:                             fi
        !           572:                         fi
        !           573:                     fi
        !           574:                 fi
        !           575:             fi
        !           576:         fi
        !           577:     fi
        !           578: 
        !           579:     #   determine user id
        !           580:     userid=''
        !           581:     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%U'`" != . ]; then
        !           582:         userid="`(id -u) 2>/dev/null`"
        !           583:         if [ ".$userid" = . ]; then
        !           584:             userid="`(id -u ${username}) 2>/dev/null`"
        !           585:             if [ ".$userid" = . ]; then
        !           586:                 str="`(id) 2>/dev/null`"
        !           587:                 if [ ".`echo $str | grep '^uid[        ]*=[    ]*[0-9]*('`" != . ]; then
        !           588:                     userid=`echo $str | sed -e 's/^uid[        ]*=[    ]*//' -e 's/(.*$//'`
        !           589:                 fi
        !           590:                 if [ ".$userid" = . ]; then
        !           591:                     userid=`(getent passwd ${username}) 2>/dev/null | \
        !           592:                             sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
        !           593:                     if [ ".$userid" = . ]; then
        !           594:                         userid=`grep "^${username}:" /etc/passwd 2>/dev/null | \
        !           595:                                 sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
        !           596:                         if [ ".$userid" = . ]; then
        !           597:                             userid=`(ypmatch "${username}" passwd; nismatch "${username}" passwd) 2>/dev/null | \
        !           598:                                     sed -e 'q' | sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
        !           599:                             if [ ".$userid" = . ]; then
        !           600:                                 userid=`(nidump passwd . | grep "^${username}:") 2>/dev/null | \
        !           601:                                         sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
        !           602:                                 if [ ".$userid" = . ]; then
        !           603:                                     userid='?'
        !           604:                                 fi
        !           605:                             fi
        !           606:                         fi
        !           607:                     fi
        !           608:                 fi
        !           609:             fi
        !           610:         fi
        !           611:     fi
        !           612: 
        !           613:     #   determine (primary) group id
        !           614:     groupid=''
        !           615:     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[gG]'`" != . ]; then
        !           616:         groupid="`(id -g ${username}) 2>/dev/null`"
        !           617:         if [ ".$groupid" = . ]; then
        !           618:             str="`(id) 2>/dev/null`"
        !           619:             if [ ".`echo $str | grep 'gid[     ]*=[    ]*[0-9]*('`" != . ]; then
        !           620:                 groupid=`echo $str | sed -e 's/^.*gid[         ]*=[    ]*//' -e 's/(.*$//'`
        !           621:             fi
        !           622:             if [ ".$groupid" = . ]; then
        !           623:                 groupid=`(getent passwd ${username}) 2>/dev/null | \
        !           624:                          sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`
        !           625:                 if [ ".$groupid" = . ]; then
        !           626:                     groupid=`grep "^${username}:" /etc/passwd 2>/dev/null | \
        !           627:                              sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`
        !           628:                     if [ ".$groupid" = . ]; then
        !           629:                         groupid=`(ypmatch "${username}" passwd; nismatch "${username}" passwd) 2>/dev/null | \
        !           630:                                  sed -e 'q' | sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`
        !           631:                         if [ ".$groupid" = . ]; then
        !           632:                             groupid=`(nidump passwd . | grep "^${username}:") 2>/dev/null | \
        !           633:                                      sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`
        !           634:                             if [ ".$groupid" = . ]; then
        !           635:                                 groupid='?'
        !           636:                             fi
        !           637:                         fi
        !           638:                     fi
        !           639:                 fi
        !           640:             fi
        !           641:         fi
        !           642:     fi
        !           643: 
        !           644:     #   determine (primary) group name
        !           645:     groupname=''
        !           646:     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%g'`" != . ]; then
        !           647:         groupname="`(id -gn ${username}) 2>/dev/null`"
        !           648:         if [ ".$groupname" = . ]; then
        !           649:             str="`(id) 2>/dev/null`"
        !           650:             if [ ".`echo $str | grep 'gid[     ]*=[    ]*[0-9]*('`" != . ]; then
        !           651:                 groupname=`echo $str | sed -e 's/^.*gid[       ]*=[    ]*[0-9]*(//' -e 's/).*$//'`
        !           652:             fi
        !           653:             if [ ".$groupname" = . ]; then
        !           654:                 groupname=`(getent group) 2>/dev/null | \
        !           655:                            grep "^[^:]*:[^:]*:${groupid}:" | \
        !           656:                            sed -e 's/:.*$//'`
        !           657:                 if [ ".$groupname" = . ]; then
        !           658:                     groupname=`grep "^[^:]*:[^:]*:${groupid}:" /etc/group 2>/dev/null | \
        !           659:                                sed -e 's/:.*$//'`
        !           660:                     if [ ".$groupname" = . ]; then
        !           661:                         groupname=`(ypcat group; niscat group) 2>/dev/null | \
        !           662:                                    sed -e 'q' | grep "^[^:]*:[^:]*:${groupid}:" | \
        !           663:                                    sed -e 's/:.*$//'`
        !           664:                         if [ ".$groupname" = . ]; then
        !           665:                             groupname=`(nidump group .) 2>/dev/null | \
        !           666:                                        grep "^[^:]*:[^:]*:${groupid}:" | \
        !           667:                                        sed -e 's/:.*$//'`
        !           668:                             if [ ".$groupname" = . ]; then
        !           669:                                 groupname='?'
        !           670:                             fi
        !           671:                         fi
        !           672:                     fi
        !           673:                 fi
        !           674:             fi
        !           675:         fi
        !           676:     fi
        !           677: 
        !           678:     #   determine host and domain name
        !           679:     hostname=''
        !           680:     domainname=''
        !           681:     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%h'`" != . ]; then
        !           682:         hostname="`(uname -n) 2>/dev/null |\
        !           683:                    awk '{ printf("%s", $1); }'`"
        !           684:         if [ ".$hostname" = . ]; then
        !           685:             hostname="`(hostname) 2>/dev/null |\
        !           686:                        awk '{ printf("%s", $1); }'`"
        !           687:             if [ ".$hostname" = . ]; then
        !           688:                 hostname='unknown'
        !           689:             fi
        !           690:         fi
        !           691:         case $hostname in
        !           692:             *.* )
        !           693:                 domainname=".`echo $hostname | cut -d. -f2-`"
        !           694:                 hostname="`echo $hostname | cut -d. -f1`"
        !           695:                 ;;
        !           696:         esac
        !           697:     fi
        !           698:     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%d'`" != . ]; then
        !           699:         if [ ".$domainname" = . ]; then
        !           700:             if [ -f /etc/resolv.conf ]; then
        !           701:                 domainname="`grep '^[  ]*domain' /etc/resolv.conf | sed -e 'q' |\
        !           702:                              sed -e 's/.*domain//' \
        !           703:                                  -e 's/^[      ]*//' -e 's/^ *//' -e 's/^      *//' \
        !           704:                                  -e 's/^\.//' -e 's/^/./' |\
        !           705:                              awk '{ printf("%s", $1); }'`"
        !           706:                 if [ ".$domainname" = . ]; then
        !           707:                     domainname="`grep '^[      ]*search' /etc/resolv.conf | sed -e 'q' |\
        !           708:                                  sed -e 's/.*search//' \
        !           709:                                      -e 's/^[  ]*//' -e 's/^ *//' -e 's/^      *//' \
        !           710:                                      -e 's/ .*//' -e 's/       .*//' \
        !           711:                                      -e 's/^\.//' -e 's/^/./' |\
        !           712:                                  awk '{ printf("%s", $1); }'`"
        !           713:                 fi
        !           714:             fi
        !           715:         fi
        !           716:     fi
        !           717: 
        !           718:     #   determine current time
        !           719:     time_day=''
        !           720:     time_month=''
        !           721:     time_year=''
        !           722:     time_monthname=''
        !           723:     if [ ".$opt_e" = .yes ] && [ ".`echo $text | grep '%[DMYm]'`" != . ]; then
        !           724:         time_day=`date '+%d'`
        !           725:         time_month=`date '+%m'`
        !           726:         time_year=`date '+%Y' 2>/dev/null`
        !           727:         if [ ".$time_year" = . ]; then
        !           728:             time_year=`date '+%y'`
        !           729:             case $time_year in
        !           730:                 [5-9][0-9]) time_year="19$time_year" ;;
        !           731:                 [0-4][0-9]) time_year="20$time_year" ;;
        !           732:             esac
        !           733:         fi
        !           734:         case $time_month in
        !           735:             1|01) time_monthname='Jan' ;;
        !           736:             2|02) time_monthname='Feb' ;;
        !           737:             3|03) time_monthname='Mar' ;;
        !           738:             4|04) time_monthname='Apr' ;;
        !           739:             5|05) time_monthname='May' ;;
        !           740:             6|06) time_monthname='Jun' ;;
        !           741:             7|07) time_monthname='Jul' ;;
        !           742:             8|08) time_monthname='Aug' ;;
        !           743:             9|09) time_monthname='Sep' ;;
        !           744:               10) time_monthname='Oct' ;;
        !           745:               11) time_monthname='Nov' ;;
        !           746:               12) time_monthname='Dec' ;;
        !           747:         esac
        !           748:     fi
        !           749: 
        !           750:     #   expand special ``%x'' constructs
        !           751:     if [ ".$opt_e" = .yes ]; then
        !           752:         text=`echo $seo "$text" |\
        !           753:               sed -e "s/%B/${term_bold}/g" \
        !           754:                   -e "s/%b/${term_norm}/g" \
        !           755:                   -e "s/%u/${username}/g" \
        !           756:                   -e "s/%U/${userid}/g" \
        !           757:                   -e "s/%g/${groupname}/g" \
        !           758:                   -e "s/%G/${groupid}/g" \
        !           759:                   -e "s/%h/${hostname}/g" \
        !           760:                   -e "s/%d/${domainname}/g" \
        !           761:                   -e "s/%D/${time_day}/g" \
        !           762:                   -e "s/%M/${time_month}/g" \
        !           763:                   -e "s/%Y/${time_year}/g" \
        !           764:                   -e "s/%m/${time_monthname}/g" 2>/dev/null`
        !           765:     fi
        !           766: 
        !           767:     #   create output
        !           768:     if [ .$opt_n = .no ]; then
        !           769:         echo $seo "$text"
        !           770:     else
        !           771:         #   the harder part: echo -n is best, because
        !           772:         #   awk may complain about some \xx sequences.
        !           773:         if [ ".$minusn" != . ]; then
        !           774:             echo $seo $minusn "$text"
        !           775:         else
        !           776:             echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text"
        !           777:         fi
        !           778:     fi
        !           779: 
        !           780:     shtool_exit 0
        !           781:     ;;
        !           782: 
        !           783: install )
        !           784:     ##
        !           785:     ##  install -- Install a program, script or datafile
        !           786:     ##  Copyright (c) 1997-2008 Ralf S. Engelschall <rse@engelschall.com>
        !           787:     ##
        !           788: 
        !           789:     #   special case: "shtool install -d <dir> [...]" internally
        !           790:     #   maps to "shtool mkdir -f -p -m 755 <dir> [...]"
        !           791:     if [ "$opt_d" = yes ]; then
        !           792:         cmd="$0 mkdir -f -p -m 755"
        !           793:         if [ ".$opt_o" != . ]; then
        !           794:             cmd="$cmd -o '$opt_o'"
        !           795:         fi
        !           796:         if [ ".$opt_g" != . ]; then
        !           797:             cmd="$cmd -g '$opt_g'"
        !           798:         fi
        !           799:         if [ ".$opt_v" = .yes ]; then
        !           800:             cmd="$cmd -v"
        !           801:         fi
        !           802:         if [ ".$opt_t" = .yes ]; then
        !           803:             cmd="$cmd -t"
        !           804:         fi
        !           805:         for dir in "$@"; do
        !           806:             eval "$cmd $dir" || shtool_exit $?
        !           807:         done
        !           808:         shtool_exit 0
        !           809:     fi
        !           810: 
        !           811:     #   determine source(s) and destination
        !           812:     argc=$#
        !           813:     srcs=""
        !           814:     while [ $# -gt 1 ]; do
        !           815:         srcs="$srcs $1"
        !           816:         shift
        !           817:     done
        !           818:     dstpath="$1"
        !           819: 
        !           820:     #   type check for destination
        !           821:     dstisdir=0
        !           822:     if [ -d $dstpath ]; then
        !           823:         dstpath=`echo "$dstpath" | sed -e 's:/$::'`
        !           824:         dstisdir=1
        !           825:     fi
        !           826: 
        !           827:     #   consistency check for destination
        !           828:     if [ $argc -gt 2 ] && [ $dstisdir = 0 ]; then
        !           829:         echo "$msgprefix:Error: multiple sources require destination to be directory" 1>&2
        !           830:         shtool_exit 1
        !           831:     fi
        !           832: 
        !           833:     #   iterate over all source(s)
        !           834:     for src in $srcs; do
        !           835:         dst=$dstpath
        !           836: 
        !           837:         #   if destination is a directory, append the input filename
        !           838:         if [ $dstisdir = 1 ]; then
        !           839:             dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'`
        !           840:             dst="$dst/$dstfile"
        !           841:         fi
        !           842: 
        !           843:         #   check for correct arguments
        !           844:         if [ ".$src" = ".$dst" ]; then
        !           845:             echo "$msgprefix:Warning: source and destination are the same - skipped" 1>&2
        !           846:             continue
        !           847:         fi
        !           848:         if [ -d "$src" ]; then
        !           849:             echo "$msgprefix:Warning: source \`$src' is a directory - skipped" 1>&2
        !           850:             continue
        !           851:         fi
        !           852: 
        !           853:         #   make a temp file name in the destination directory
        !           854:         dsttmp=`echo $dst |\
        !           855:                 sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;' \
        !           856:                     -e "s;\$;/#INST@$$#;"`
        !           857: 
        !           858:         #   verbosity
        !           859:         if [ ".$opt_v" = .yes ]; then
        !           860:             echo "$src -> $dst" 1>&2
        !           861:         fi
        !           862: 
        !           863:         #   copy or move the file name to the temp name
        !           864:         #   (because we might be not allowed to change the source)
        !           865:         if [ ".$opt_C" = .yes ]; then
        !           866:             opt_c=yes
        !           867:         fi
        !           868:         if [ ".$opt_c" = .yes ]; then
        !           869:             if [ ".$opt_t" = .yes ]; then
        !           870:                 echo "cp $src $dsttmp" 1>&2
        !           871:             fi
        !           872:             cp "$src" "$dsttmp" || shtool_exit $?
        !           873:         else
        !           874:             if [ ".$opt_t" = .yes ]; then
        !           875:                 echo "mv $src $dsttmp" 1>&2
        !           876:             fi
        !           877:             mv "$src" "$dsttmp" || shtool_exit $?
        !           878:         fi
        !           879: 
        !           880:         #   adjust the target file
        !           881:         if [ ".$opt_e" != . ]; then
        !           882:             sed='sed'
        !           883:             OIFS="$IFS"; IFS="$ASC_NL"; set -- $opt_e; IFS="$OIFS"
        !           884:             for e
        !           885:             do
        !           886:                 sed="$sed -e '$e'"
        !           887:             done
        !           888:             cp "$dsttmp" "$dsttmp.old"
        !           889:             chmod u+w $dsttmp
        !           890:             eval "$sed <$dsttmp.old >$dsttmp" || shtool_exit $?
        !           891:             rm -f $dsttmp.old
        !           892:         fi
        !           893:         if [ ".$opt_s" = .yes ]; then
        !           894:             if [ ".$opt_t" = .yes ]; then
        !           895:                 echo "strip $dsttmp" 1>&2
        !           896:             fi
        !           897:             strip $dsttmp || shtool_exit $?
        !           898:         fi
        !           899:         if [ ".$opt_o" != . ]; then
        !           900:             if [ ".$opt_t" = .yes ]; then
        !           901:                 echo "chown $opt_o $dsttmp" 1>&2
        !           902:             fi
        !           903:             chown $opt_o $dsttmp || shtool_exit $?
        !           904:         fi
        !           905:         if [ ".$opt_g" != . ]; then
        !           906:             if [ ".$opt_t" = .yes ]; then
        !           907:                 echo "chgrp $opt_g $dsttmp" 1>&2
        !           908:             fi
        !           909:             chgrp $opt_g $dsttmp || shtool_exit $?
        !           910:         fi
        !           911:         if [ ".$opt_m" != ".-" ]; then
        !           912:             if [ ".$opt_t" = .yes ]; then
        !           913:                 echo "chmod $opt_m $dsttmp" 1>&2
        !           914:             fi
        !           915:             chmod $opt_m $dsttmp || shtool_exit $?
        !           916:         fi
        !           917: 
        !           918:         #   determine whether to do a quick install
        !           919:         #   (has to be done _after_ the strip was already done)
        !           920:         quick=no
        !           921:         if [ ".$opt_C" = .yes ]; then
        !           922:             if [ -r $dst ]; then
        !           923:                 if cmp -s "$src" "$dst"; then
        !           924:                     quick=yes
        !           925:                 fi
        !           926:             fi
        !           927:         fi
        !           928: 
        !           929:         #   finally, install the file to the real destination
        !           930:         if [ $quick = yes ]; then
        !           931:             if [ ".$opt_t" = .yes ]; then
        !           932:                 echo "rm -f $dsttmp" 1>&2
        !           933:             fi
        !           934:             rm -f $dsttmp
        !           935:         else
        !           936:             if [ ".$opt_t" = .yes ]; then
        !           937:                 echo "rm -f $dst && mv $dsttmp $dst" 1>&2
        !           938:             fi
        !           939:             rm -f $dst && mv $dsttmp $dst
        !           940:         fi
        !           941:     done
        !           942: 
        !           943:     shtool_exit 0
        !           944:     ;;
        !           945: 
        !           946: mkdir )
        !           947:     ##
        !           948:     ##  mkdir -- Make one or more directories
        !           949:     ##  Copyright (c) 1996-2008 Ralf S. Engelschall <rse@engelschall.com>
        !           950:     ##
        !           951: 
        !           952:     errstatus=0
        !           953:     for p in ${1+"$@"}; do
        !           954:         #   if the directory already exists...
        !           955:         if [ -d "$p" ]; then
        !           956:             if [ ".$opt_f" = .no ] && [ ".$opt_p" = .no ]; then
        !           957:                 echo "$msgprefix:Error: directory already exists: $p" 1>&2
        !           958:                 errstatus=1
        !           959:                 break
        !           960:             else
        !           961:                 continue
        !           962:             fi
        !           963:         fi
        !           964:         #   if the directory has to be created...
        !           965:         if [ ".$opt_p" = .no ]; then
        !           966:             if [ ".$opt_t" = .yes ]; then
        !           967:                 echo "mkdir $p" 1>&2
        !           968:             fi
        !           969:             mkdir $p || errstatus=$?
        !           970:             if [ ".$opt_o" != . ]; then
        !           971:                 if [ ".$opt_t" = .yes ]; then
        !           972:                     echo "chown $opt_o $p" 1>&2
        !           973:                 fi
        !           974:                 chown $opt_o $p || errstatus=$?
        !           975:             fi
        !           976:             if [ ".$opt_g" != . ]; then
        !           977:                 if [ ".$opt_t" = .yes ]; then
        !           978:                     echo "chgrp $opt_g $p" 1>&2
        !           979:                 fi
        !           980:                 chgrp $opt_g $p || errstatus=$?
        !           981:             fi
        !           982:             if [ ".$opt_m" != . ]; then
        !           983:                 if [ ".$opt_t" = .yes ]; then
        !           984:                     echo "chmod $opt_m $p" 1>&2
        !           985:                 fi
        !           986:                 chmod $opt_m $p || errstatus=$?
        !           987:             fi
        !           988:         else
        !           989:             #   the smart situation
        !           990:             set fnord `echo ":$p" |\
        !           991:                        sed -e 's/^:\//%/' \
        !           992:                            -e 's/^://' \
        !           993:                            -e 's/\// /g' \
        !           994:                            -e 's/^%/\//'`
        !           995:             shift
        !           996:             pathcomp=''
        !           997:             for d in ${1+"$@"}; do
        !           998:                 pathcomp="$pathcomp$d"
        !           999:                 case "$pathcomp" in
        !          1000:                     -* ) pathcomp="./$pathcomp" ;;
        !          1001:                 esac
        !          1002:                 if [ ! -d "$pathcomp" ]; then
        !          1003:                     if [ ".$opt_t" = .yes ]; then
        !          1004:                         echo "mkdir $pathcomp" 1>&2
        !          1005:                     fi
        !          1006:                     mkdir $pathcomp || errstatus=$?
        !          1007:                     if [ ".$opt_o" != . ]; then
        !          1008:                         if [ ".$opt_t" = .yes ]; then
        !          1009:                             echo "chown $opt_o $pathcomp" 1>&2
        !          1010:                         fi
        !          1011:                         chown $opt_o $pathcomp || errstatus=$?
        !          1012:                     fi
        !          1013:                     if [ ".$opt_g" != . ]; then
        !          1014:                         if [ ".$opt_t" = .yes ]; then
        !          1015:                             echo "chgrp $opt_g $pathcomp" 1>&2
        !          1016:                         fi
        !          1017:                         chgrp $opt_g $pathcomp || errstatus=$?
        !          1018:                     fi
        !          1019:                     if [ ".$opt_m" != . ]; then
        !          1020:                         if [ ".$opt_t" = .yes ]; then
        !          1021:                             echo "chmod $opt_m $pathcomp" 1>&2
        !          1022:                         fi
        !          1023:                         chmod $opt_m $pathcomp || errstatus=$?
        !          1024:                     fi
        !          1025:                 fi
        !          1026:                 pathcomp="$pathcomp/"
        !          1027:             done
        !          1028:         fi
        !          1029:     done
        !          1030: 
        !          1031:     shtool_exit $errstatus
        !          1032:     ;;
        !          1033: 
        !          1034: platform )
        !          1035:     ##
        !          1036:     ##  platform -- Platform Identification Utility
        !          1037:     ##  Copyright (c) 2003-2008 Ralf S. Engelschall <rse@engelschall.com>
        !          1038:     ##
        !          1039: 
        !          1040:     #   option post-processing
        !          1041:     if [ ".$opt_t" != . ]; then
        !          1042:         case "$opt_t" in
        !          1043:             binary )
        !          1044:                 #   binary package id (OpenPKG RPM)
        !          1045:                 opt_F="%<ap>-%<sp>"
        !          1046:                 opt_L=yes
        !          1047:                 opt_S=""
        !          1048:                 opt_C="+"
        !          1049:                 ;;
        !          1050:             build )
        !          1051:                 #   build time checking (OpenPKG RPM)
        !          1052:                 opt_F="%<at>-%<st>"
        !          1053:                 opt_L=yes
        !          1054:                 opt_S=""
        !          1055:                 opt_C="+"
        !          1056:                 ;;
        !          1057:             gnu )
        !          1058:                 #   GNU config.guess style <arch>-<vendor>-<os><osversion>
        !          1059:                 opt_F="%<at>-unknown-%<st>"
        !          1060:                 opt_L=yes
        !          1061:                 opt_S=""
        !          1062:                 opt_C="+"
        !          1063:                 ;;
        !          1064:             web )
        !          1065:                 #   non-whitespace HTTP Server-header id
        !          1066:                 opt_F="%<sp>-%<ap>"
        !          1067:                 opt_S="/"
        !          1068:                 opt_C="+"
        !          1069:                 ;;
        !          1070:             summary)
        !          1071:                 #   human readable verbose summary information
        !          1072:                 opt_F="Class:      %[sc] (%[ac])\\nProduct:    %[sp] (%[ap])\\nTechnology: %[st] (%[at])"
        !          1073:                 opt_S=" "
        !          1074:                 opt_C="/"
        !          1075:                 ;;
        !          1076:             all-in-one )
        !          1077:                 #   full-table all-in-one information
        !          1078:                 opt_F=""
        !          1079:                 opt_F="${opt_F}concise architecture class:      %<ac>\\n"
        !          1080:                 opt_F="${opt_F}regular architecture class:      %{ac}\\n"
        !          1081:                 opt_F="${opt_F}verbose architecture class:      %[ac]\\n"
        !          1082:                 opt_F="${opt_F}concise architecture product:    %<ap>\\n"
        !          1083:                 opt_F="${opt_F}regular architecture product:    %{ap}\\n"
        !          1084:                 opt_F="${opt_F}verbose architecture product:    %[ap]\\n"
        !          1085:                 opt_F="${opt_F}concise architecture technology: %<at>\\n"
        !          1086:                 opt_F="${opt_F}regular architecture technology: %{at}\\n"
        !          1087:                 opt_F="${opt_F}verbose architecture technology: %[at]\\n"
        !          1088:                 opt_F="${opt_F}concise system class:            %<sc>\\n"
        !          1089:                 opt_F="${opt_F}regular system class:            %{sc}\\n"
        !          1090:                 opt_F="${opt_F}verbose system class:            %[sc]\\n"
        !          1091:                 opt_F="${opt_F}concise system product:          %<sp>\\n"
        !          1092:                 opt_F="${opt_F}regular system product:          %{sp}\\n"
        !          1093:                 opt_F="${opt_F}verbose system product:          %[sp]\\n"
        !          1094:                 opt_F="${opt_F}concise system technology:       %<st>\\n"
        !          1095:                 opt_F="${opt_F}regular system technology:       %{st}\\n"
        !          1096:                 opt_F="${opt_F}verbose system technology:       %[st]"
        !          1097:                 ;;
        !          1098:             * )
        !          1099:                 echo "$msgprefix:Error: invalid type \`$opt_t'" 1>&2
        !          1100:                 exit 1
        !          1101:                 ;;
        !          1102:         esac
        !          1103:     fi
        !          1104: 
        !          1105:     #   assemble initial platform information
        !          1106:     UNAME_MACHINE=`(uname -m) 2>/dev/null` ||\
        !          1107:     UNAME_MACHINE=`(uname -p) 2>/dev/null` ||\
        !          1108:     UNAME_MACHINE='unknown'
        !          1109:     UNAME_SYSTEM=`(uname -s) 2>/dev/null`  ||\
        !          1110:     UNAME_SYSTEM='unknown'
        !          1111:     UNAME_RELEASE=`(uname -r) 2>/dev/null` ||\
        !          1112:     UNAME_RELEASE=`(uname -v) 2>/dev/null` ||\
        !          1113:     UNAME_RELEASE='unknown'
        !          1114: 
        !          1115:     UNAME="${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}"
        !          1116: 
        !          1117:     AC=""; AP=""; AT=""
        !          1118:     SC=""; SP=""; ST=""
        !          1119: 
        !          1120:     #    dispatch into platform specific sections
        !          1121:     case "${UNAME}" in
        !          1122: 
        !          1123:         #   FreeBSD
        !          1124:         *:FreeBSD:* )
        !          1125:             #   determine architecture
        !          1126:             AC="${UNAME_MACHINE}"
        !          1127:             case "${AC}" in
        !          1128:                 i386 ) AC="iX86" ;;
        !          1129:             esac
        !          1130:             AP="${AC}"
        !          1131:             AT="${AP}"
        !          1132:             if [ ".${AT}" = ".iX86" ]; then
        !          1133:                 case "`(/sbin/sysctl -n hw.model) 2>&1`" in
        !          1134:                     *"Xeon"* | *"Pentium Pro"* | *"Cyrix 6x86MX"* | *"Pentium II"* | *"Pentium III"* | *"Pentium 4"* | *"Celeron"* ) AT="i686" ;;
        !          1135:                     *"Pentium"* ) AT="i586" ;; *"i486[SD]X"* | *"Cyrix 486"* | *"Cyrix [56]x86"* | *"Blue Lightning" | *"Cyrix 486S/DX" ) AT="i486" ;;
        !          1136:                     *"i386[SD]X"* | *"NexGen 586"* ) AT="i386" ;;
        !          1137:                 esac
        !          1138:             fi
        !          1139:             #   determine system
        !          1140:             r=`echo "${UNAME_RELEASE}" |\
        !          1141:                sed -e 's;[()];;' -e 's/\(-.*\)$/[\1]/'`
        !          1142:             ST="FreeBSD ${r}"
        !          1143:             SP="${ST}"
        !          1144:             case "${r}" in
        !          1145:                 1.* ) SC="4.3BSD" ;;
        !          1146:                 *   ) SC="4.4BSD" ;;
        !          1147:             esac
        !          1148:             ;;
        !          1149: 
        !          1150:         #   NetBSD
        !          1151:         *:NetBSD:* )
        !          1152:             #   determine architecture
        !          1153:             AT="${UNAME_MACHINE}"
        !          1154:             AP="${AT}"
        !          1155:             case "${AP}" in
        !          1156:                 i[3-6]86 ) AP="iX86" ;;
        !          1157:             esac
        !          1158:             AC="${AP}"
        !          1159:             #   determine system
        !          1160:             r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'`
        !          1161:             ST="NetBSD ${r}"
        !          1162:             SP="${ST}"
        !          1163:             case "${r}" in
        !          1164:                 0.* ) SC="4.3BSD" ;;
        !          1165:                 *   ) SC="4.4BSD" ;;
        !          1166:             esac
        !          1167:             ;;
        !          1168: 
        !          1169:         #   OpenBSD
        !          1170:         *:OpenBSD:* )
        !          1171:             #   determine architecture
        !          1172:             AT="${UNAME_MACHINE}"
        !          1173:             AP="${AT}"
        !          1174:             case "${AP}" in
        !          1175:                 i[3-6]86 ) AP="iX86" ;;
        !          1176:             esac
        !          1177:             AC="${AP}"
        !          1178:             #   determine system
        !          1179:             r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'`
        !          1180:             ST="OpenBSD ${r}"
        !          1181:             SP="${ST}"
        !          1182:             SC="4.4BSD"
        !          1183:             ;;
        !          1184: 
        !          1185:         #   DragonFly BSD
        !          1186:         *:DragonFly:* )
        !          1187:             #   determine architecture
        !          1188:             AT="${UNAME_MACHINE}"
        !          1189:             AP="${AT}"
        !          1190:             case "${AP}" in
        !          1191:                 i[3-6]86 ) AP="iX86" ;;
        !          1192:             esac
        !          1193:             AC="${AP}"
        !          1194:             #   determine system
        !          1195:             r=`echo "${UNAME_RELEASE}" | sed -e 's/\([-_].*\)$/[\1]/'`
        !          1196:             ST="DragonFly ${r}"
        !          1197:             SP="${ST}"
        !          1198:             SC="4.4BSD"
        !          1199:             ;;
        !          1200: 
        !          1201:         #   GNU/Linux
        !          1202:         *:Linux:* )
        !          1203:             #   determine architecture
        !          1204:             AT="${UNAME_MACHINE}"
        !          1205:             case "${AT}" in
        !          1206:                ia64     ) AT="IA64"   ;;
        !          1207:                x86_64   ) AT='AMD64'  ;;
        !          1208:                parisc   ) AT="HPPA32" ;;
        !          1209:                parisc64 ) AT="HPPA64" ;;
        !          1210:             esac
        !          1211:             AP="${AT}"
        !          1212:             case "${AP}" in
        !          1213:                i[3-6]86 ) AP='iX86' ;;
        !          1214:             esac
        !          1215:             AC="${AP}"
        !          1216:             #   determine system
        !          1217:             v_kern=`echo "${UNAME_RELEASE}" |\
        !          1218:                 sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/'`
        !          1219:             v_libc=`(strings /lib/libc.so.* | grep '^GLIBC_' | sed -e 's/^GLIBC_//' |\
        !          1220:                 env -i sort -n | sed -n -e '$p' | sed -e 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/') 2>/dev/null`
        !          1221:             ST="GNU/<Linux >${v_libc}/<${v_kern}>"
        !          1222:             if [ -f /etc/lsb-release ]; then
        !          1223:                 eval `( . /etc/lsb-release
        !          1224:                     echo "SC=\"LSB${LSB_VERSION}\""
        !          1225:                     if [ ".${DISTRIB_ID}" != . -a ".${DISTRIB_RELEASE}" != . ]; then
        !          1226:                         echo "SP=\"${DISTRIB_ID} ${DISTRIB_RELEASE}\""
        !          1227:                     fi
        !          1228:                 ) 2>/dev/null`
        !          1229:             fi
        !          1230:             if [ ".$SP" = . ]; then
        !          1231:                 for tagfile in x \
        !          1232:                     `cd /etc && \
        !          1233:                     /bin/ls *[_-]release *[_-]version 2>/dev/null | env -i sort | \
        !          1234:                     sed -e '/^redhat-release$/d' -e '/^lsb-release$/d'; \
        !          1235:                     echo redhat-release lsb-release`
        !          1236:                 do
        !          1237:                     [ ".${tagfile}" = .x ] && continue
        !          1238:                     [ ! -f "/etc/${tagfile}" ] && continue
        !          1239:                     n=`echo ${tagfile} | sed -e 's/[_-]release$//' -e 's/[_-]version$//'`
        !          1240:                     v=`(grep VERSION /etc/${tagfile}; cat /etc/${tagfile}) | grep '[0-9]' | sed -e 'q' |\
        !          1241:                        sed -e 's/^/#/' \
        !          1242:                            -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
        !          1243:                            -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
        !          1244:                            -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \
        !          1245:                            -e 's/^#.*$//'`
        !          1246:                     case "`util_lower ${n}`" in
        !          1247:                         redhat )
        !          1248:                             if [ ".`egrep '(Red Hat Enterprise Linux|CentOS)' /etc/${tagfile}`" != . ]; then
        !          1249:                                 n="<R>ed <H>at <E>nterprise <L>inux"
        !          1250:                             else
        !          1251:                                 n="<R>ed <H>at <L>inux"
        !          1252:                             fi
        !          1253:                             ;;
        !          1254:                         debian             ) n="Debian[ GNU/Linux]"        ;;
        !          1255:                         ubuntu             ) n="Ubuntu[ GNU/Linux]"        ;;
        !          1256:                         fedora             ) n="<Fedora> Core[ GNU/Linux]" ;;
        !          1257:                         suse               ) n="[Novell ]SUSE[ Linux]"     ;;
        !          1258:                         mandrake*|mandriva ) n="Mandriva[ Linux]"          ;;
        !          1259:                         gentoo             ) n="Gentoo[ GNU/Linux]"        ;;
        !          1260:                         slackware          ) n="Slackware[ Linux]"         ;;
        !          1261:                         turbolinux         ) n="TurboLinux"                ;;
        !          1262:                         unitedlinux        ) n="UnitedLinux"               ;;
        !          1263:                         *                  ) n="${n}[ GNU/Linux]"          ;;
        !          1264:                     esac
        !          1265:                     case "$n" in
        !          1266:                         *"<"*">"* ) SP="$n <$v>" ;;
        !          1267:                         *         ) SP="$n $v"   ;;
        !          1268:                     esac
        !          1269:                     break
        !          1270:                 done
        !          1271:             fi
        !          1272:             [ ".$SP" = . ] && SP="${ST}"
        !          1273:             [ ".$SC" = . ] && SC="LSB"
        !          1274:             ;;
        !          1275: 
        !          1276:         #   Sun Solaris
        !          1277:         *:SunOS:* )
        !          1278:             #   determine architecture
        !          1279:             AT="${UNAME_MACHINE}"
        !          1280:             case "${AT}" in
        !          1281:                 i86pc )
        !          1282:                     AT="iX86"
        !          1283:                     case "`(/bin/isainfo -k) 2>&1`" in
        !          1284:                         amd64 ) AT="AMD64" ;;
        !          1285:                     esac
        !          1286:                     ;;
        !          1287:             esac
        !          1288:             AP="${AT}"
        !          1289:             case "${AP}" in
        !          1290:                 sun4[cdm] ) AP="SPARC32" ;;
        !          1291:                 sun4[uv]  ) AP="SPARC64" ;;
        !          1292:                 sun4*     ) AP="SPARC"   ;;
        !          1293:             esac
        !          1294:             AC="${AP}"
        !          1295:             case "${AC}" in
        !          1296:                 SPARC* ) AC="SPARC" ;;
        !          1297:             esac
        !          1298:             #   determine system
        !          1299:             ST="[Sun ]SunOS ${UNAME_RELEASE}"
        !          1300:             v=`echo "${UNAME_RELEASE}" |\
        !          1301:                sed -e 's;^4\.;1.;' \
        !          1302:                    -e 's;^5\.\([0-6]\)[^0-9]*$;2.\1;' \
        !          1303:                    -e 's;^5\.\([0-9][0-9]*\).*;\1;'`
        !          1304:             SP="[Sun ]Solaris $v"
        !          1305:             case "${UNAME_RELEASE}" in
        !          1306:                 4.* ) SC="4.3BSD" ;;
        !          1307:                 5.* ) SC="SVR4"   ;;
        !          1308:             esac
        !          1309:             ;;
        !          1310: 
        !          1311:         #   SCO UnixWare
        !          1312:         *:UnixWare:* )
        !          1313:             #   determine architecture
        !          1314:             AT="${UNAME_MACHINE}"
        !          1315:             case "${AT}" in
        !          1316:                 i[3-6]86 | ix86at ) AT="iX86" ;;
        !          1317:             esac
        !          1318:             AP="${AT}"
        !          1319:             #   determine system
        !          1320:             v=`/sbin/uname -v`
        !          1321:             ST="[SCO ]UnixWare ${v}"
        !          1322:             SP="${ST}"
        !          1323:             SC="SVR${UNAME_RELEASE}"
        !          1324:             ;;
        !          1325: 
        !          1326:         #   QNX
        !          1327:         *:QNX:* )
        !          1328:             #   determine architecture
        !          1329:             AT="${UNAME_MACHINE}"
        !          1330:             case "${AT}" in
        !          1331:                 x86pc ) AT="iX86" ;;
        !          1332:             esac
        !          1333:             AP="${AT}"
        !          1334:             #   determine system
        !          1335:             v="${UNAME_RELEASE}"
        !          1336:             ST="QNX[ Neutrino RTOS] ${v}"
        !          1337:             v=`echo "${v}" | sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\).*$;\1;'`
        !          1338:             SP="QNX[ Neutrino RTOS] ${v}"
        !          1339:             SC="QNX"
        !          1340:             ;;
        !          1341: 
        !          1342:         #   SGI IRIX
        !          1343:         *:IRIX*:* )
        !          1344:             #   determine architecture
        !          1345:             AT="${UNAME_MACHINE}"
        !          1346:             AP="${AT}"
        !          1347:             case "${AP}:${UNAME_SYSTEM}" in
        !          1348:                 IP*:IRIX64 ) AP="MIPS64" ;;
        !          1349:                 IP*:*      ) AP="MIPS"   ;;
        !          1350:             esac
        !          1351:             AC="${AP}"
        !          1352:             #   determine system
        !          1353:             v=`(/bin/uname -R || /bin/uname -r) 2>/dev/null | sed -e 's;[0-9.]* ;;'`
        !          1354:             ST="[SGI ]IRIX ${v}"
        !          1355:             v="${UNAME_RELEASE}"
        !          1356:             SP="[SGI ]IRIX ${v}"
        !          1357:             SC="4.2BSD/SVR3"
        !          1358:             ;;
        !          1359: 
        !          1360:         #   HP HP-UX
        !          1361:         *:HP-UX:* )
        !          1362:             #   determine architecture
        !          1363:             AT="${UNAME_MACHINE}"
        !          1364:             case "${AT}" in
        !          1365:                 ia64 ) AT="IA64" ;;
        !          1366:                 9000/[34]?? ) AT=M68K ;;
        !          1367:                 9000/[678][0-9][0-9])
        !          1368:                     sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
        !          1369:                     sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
        !          1370:                     case "${sc_cpu_version}" in
        !          1371:                         523 ) AT="HPPA1.0" ;;
        !          1372:                         528 ) AT="HPPA1.1" ;;
        !          1373:                         532 ) AT="HPPA2.0"
        !          1374:                             case "${sc_kernel_bits}" in
        !          1375:                                 32 ) AT="${AT}n" ;;
        !          1376:                                 64 ) AT="${AT}w" ;;
        !          1377:                             esac
        !          1378:                             ;;
        !          1379:                     esac
        !          1380:                     ;;
        !          1381:             esac
        !          1382:             AP="${AT}"
        !          1383:             case "${AP}" in
        !          1384:                 HPPA* ) AP="HPPA" ;;
        !          1385:             esac
        !          1386:             AC="${AP}"
        !          1387:             #   determine system
        !          1388:             v=`echo "${UNAME_RELEASE}" | sed -e 's;^[^0-9]*;;'`
        !          1389:             ST="[HP ]<HP>-<UX ${v}>"
        !          1390:             SP="${ST}"
        !          1391:             case "${v}" in
        !          1392:                 10.*   ) SC="SVR4.2" ;;
        !          1393:                 [7-9]* ) SC="SVR4"   ;;
        !          1394:             esac
        !          1395:             ;;
        !          1396: 
        !          1397:         #   HP Tru64 (OSF1)
        !          1398:         *:OSF1:* )
        !          1399:             #   determine architecture
        !          1400:             AP="${UNAME_MACHINE}"
        !          1401:             case "${AP}" in
        !          1402:                 alpha ) AP="Alpha" ;;
        !          1403:             esac
        !          1404:             alpha_type=`(/usr/sbin/psrinfo -v) 2>/dev/null |\
        !          1405:                 sed -n -e 's/^.*The alpha \([^ ][^ ]*\).*processor.*$/\1/p' | sed -e 'q'`
        !          1406:             AT="${AP}${alpha_type}"
        !          1407:             AC="${AP}"
        !          1408:             #   determine system
        !          1409:             v=`echo "${UNAME_RELEASE}" | sed -e 's;^[VTX];;'`
        !          1410:             ST="[HP ]Tru64 ${v}"
        !          1411:             SP="${ST}"
        !          1412:             SC="OSF1"
        !          1413:             ;;
        !          1414: 
        !          1415:         #   IBM AIX
        !          1416:         *:AIX:* )
        !          1417:             #   determine architecture
        !          1418:             cpu_arch=RS6000
        !          1419:             if [ -x /usr/sbin/lsdev -a -x /usr/sbin/lsattr ]; then
        !          1420:                 cpu_id=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
        !          1421:                 if [ ".`/usr/sbin/lsattr -El ${cpu_id} | grep -i powerpc`" != . ]; then
        !          1422:                     cpu_arch=PPC
        !          1423:                 fi
        !          1424:             elif [ -d /QOpenSys ]; then
        !          1425:                 #   IBM i5/OS (aka OS/400) with PASE (Portable Application Solutions Environment)
        !          1426:                 cpu_arch=PPC
        !          1427:             fi
        !          1428:             if [ -x /usr/bin/oslevel ]; then
        !          1429:                 os_level=`/usr/bin/oslevel`
        !          1430:             else
        !          1431:                 os_level="`uname -v`.`uname -r`"
        !          1432:             fi
        !          1433:             os_level=`echo "${os_level}" |\
        !          1434:                       sed -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(\.[0-9][0-9]*\)\(.*\)$;<\1>\2[\3];' \
        !          1435:                           -e 's;^\([0-9][0-9]*\.[0-9][0-9]*\)\(.*\)$;<\1>\2;'`
        !          1436:             AT="${cpu_arch}"
        !          1437:             AP="${AT}"
        !          1438:             AC="${AP}"
        !          1439:             #   determine system
        !          1440:             ST="[IBM ]<AIX >${os_level}"
        !          1441:             SP="${ST}"
        !          1442:             case "${os_level}" in
        !          1443:                 [12]* ) SC="SVR2" ;;
        !          1444:                 *     ) SC="SVR4" ;;
        !          1445:             esac
        !          1446:             ;;
        !          1447: 
        !          1448:         #   Apple Mac OS X (Darwin)
        !          1449:         *:Darwin:* )
        !          1450:             #   determine architecture
        !          1451:             AT="`uname -p`"
        !          1452:             case "${AT}" in
        !          1453:                 powerpc ) AT="PPC" ;;
        !          1454:             esac
        !          1455:             AP="${AT}"
        !          1456:             case "${AP}" in
        !          1457:                 i?86 ) AP="iX86" ;;
        !          1458:             esac
        !          1459:             AC="${AP}"
        !          1460:             #   determine system
        !          1461:             unset v1; unset v2; unset v3
        !          1462:             eval `echo "${UNAME_RELEASE}" |\
        !          1463:                   sed -e 's/^/#/' \
        !          1464:                       -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \
        !          1465:                       -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \
        !          1466:                       -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \
        !          1467:                       -e 's/^#.*$/v1="0"/'`
        !          1468:             ST="[Apple ]<${UNAME_SYSTEM} ${v1}>${v2+.$v2}${v3+[.$v3]}"
        !          1469:             SP="$ST"
        !          1470:             v="`(sw_vers) 2>/dev/null | grep 'ProductVersion:' | sed -e 's/^ProductVersion:[^0-9]*\([0-9][0-9.]*\).*$/\1/'`"
        !          1471:             if [ ".$v" = . ]; then
        !          1472:                 for name in System Server; do
        !          1473:                     if [ -f /System/Library/CoreServices/${name}Version.plist ]; then
        !          1474:                         v=`(defaults read "/System/Library/CoreServices/${name}Version" "ProductVersion") 2>/dev/null`
        !          1475:                         [ ".$v" != . ] && break
        !          1476:                     fi
        !          1477:                 done
        !          1478:             fi
        !          1479:             if [ ".$v" != . ]; then
        !          1480:                 unset v1; unset v2; unset v3
        !          1481:                 eval `echo "${v}" |\
        !          1482:                       sed -e 's/^/#/' \
        !          1483:                           -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \
        !          1484:                           -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \
        !          1485:                           -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \
        !          1486:                           -e 's/^#.*$/v1="0"/'`
        !          1487:                 SP="[Apple ]Mac OS X ${v1}${v2+.$v2}${v3+[.$v3]}"
        !          1488:             fi
        !          1489:             SC="4.4BSD/Mach3.0"
        !          1490:             ;;
        !          1491: 
        !          1492:         #   Windows/Cygwin
        !          1493:         *:CYGWIN*:* )
        !          1494:             #   determine architecture
        !          1495:             AT="`uname -m`"
        !          1496:             AP="${AT}"
        !          1497:             case "${AP}" in
        !          1498:                 i?86 ) AP="iX86" ;;
        !          1499:             esac
        !          1500:             AC="${AP}"
        !          1501:             #   determine system
        !          1502:             unset v1; unset v2; unset v3
        !          1503:             eval `echo "${UNAME_RELEASE}" |\
        !          1504:                   sed -e 's/^/#/' \
        !          1505:                       -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"; v3="\3"/' \
        !          1506:                       -e 's/^#\([0-9][0-9]*\)\.\([0-9][0-9]*\).*$/v1="\1"; v2="\2"/' \
        !          1507:                       -e 's/^#\([0-9][0-9]*\).*$/v1="\1"/' \
        !          1508:                       -e 's/^#.*$/v1="0"/'`
        !          1509:             ST="Cygwin ${v1}${v2+.$v2}${v3+[.$v3]}"
        !          1510:             SP="$ST"
        !          1511:             SC="Windows"
        !          1512:             v=`echo "${UNAME_SYSTEM}" | sed -e 's/^CYGWIN_NT-//' |\
        !          1513:                sed -e 's/^/#/' -e 's/^#\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' -e 's/^#.*$//'`
        !          1514:             case "$v" in
        !          1515:                 4.0 ) SC="$SC[ NT]"    ;;
        !          1516:                 5.0 ) SC="$SC[ 2000]"  ;;
        !          1517:                 5.1 ) SC="$SC[ XP]"    ;;
        !          1518:                 6.0 ) SC="$SC[ Vista]" ;;
        !          1519:             esac
        !          1520:             ;;
        !          1521: 
        !          1522:         #   TODO ...ADD YOUR NEW PLATFORM CHECK HERE... TODO
        !          1523:         # *:XXX:* )
        !          1524:         #   ...
        !          1525:         #   ;;
        !          1526: 
        !          1527:         #   ...A STILL UNKNOWN PLATFORM...
        !          1528:         * )
        !          1529:             AT=`echo "${UNAME_MACHINE}" | sed -e "s; ;${opt_C};g"`
        !          1530:             AP="${AT}"
        !          1531:             AC="${AP}"
        !          1532:             v=`echo "${UNAME_RELEASE}" |\
        !          1533:                sed -e 's/^/#/' \
        !          1534:                    -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
        !          1535:                    -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
        !          1536:                    -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \
        !          1537:                    -e 's/^#.*$/?/'`
        !          1538:             ST="${UNAME_SYSTEM} ${v}"
        !          1539:             SP="${ST}"
        !          1540:             SC="${SP}"
        !          1541:             ;;
        !          1542: 
        !          1543:     esac
        !          1544: 
        !          1545:     #   provide fallback values
        !          1546:     [ ".$AT" = . ] && AT="${AP:-${AC}}"
        !          1547:     [ ".$AP" = . ] && AP="${AT:-${AC}}"
        !          1548:     [ ".$AC" = . ] && AC="${AP:-${AT}}"
        !          1549:     [ ".$ST" = . ] && ST="${SP:-${SC}}"
        !          1550:     [ ".$SP" = . ] && SP="${ST:-${SC}}"
        !          1551:     [ ".$SC" = . ] && SC="${SP:-${ST}}"
        !          1552: 
        !          1553:     #   support explicit enforced verbose/concise output
        !          1554:     if [ ".$opt_v" = .yes ]; then
        !          1555:         opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%[\1]/g'`
        !          1556:     elif [ ".$opt_c" = .yes ]; then
        !          1557:         opt_F=`echo ":$opt_F" | sed -e 's/^://' -e 's/%\([as][cpt]\)/%<\1>/g'`
        !          1558:     fi
        !          1559: 
        !          1560:     #   provide verbose and concise variants
        !          1561:     AC_V=""; AC_N=""; AC_C=""
        !          1562:     AP_V=""; AP_N=""; AP_C=""
        !          1563:     AT_V=""; AT_N=""; AT_C=""
        !          1564:     SC_V=""; SC_N=""; SC_C=""
        !          1565:     SP_V=""; SP_N=""; SP_C=""
        !          1566:     ST_V=""; ST_N=""; ST_C=""
        !          1567:     for var_lc in at ap ac st sp sc; do
        !          1568:         case "$opt_F" in
        !          1569:             *"%[${val_lc}]"* | *"%{${val_lc}}"* | *"%${val_lc}"* | *"%<${val_lc}>"* )
        !          1570:             var_uc=`util_upper "$var_lc"`
        !          1571:             eval "val=\"\$${var_uc}\""
        !          1572:             val_V=""; val_N=""; val_C=""
        !          1573:             case "$opt_F" in
        !          1574:                 *"%[${var_lc}]"* )
        !          1575:                     val_V=`echo ":$val" | \
        !          1576:                            sed -e 's/^://' \
        !          1577:                                -e 's;\[\([^]]*\)\];\1;g' \
        !          1578:                                -e 's;<\([^>]*\)>;\1;g' \
        !          1579:                                -e "s; ;§§;g" \
        !          1580:                                -e "s;/;%%;g" \
        !          1581:                                -e "s;§§;${opt_S};g" \
        !          1582:                                -e "s;%%;${opt_C};g"`
        !          1583:                     eval "${var_uc}_V=\"\${val_V}\""
        !          1584:                     ;;
        !          1585:             esac
        !          1586:             case "$opt_F" in
        !          1587:                 *"%{${var_lc}}"* | *"%${var_lc}"* )
        !          1588:                     val_N=`echo ":$val" | \
        !          1589:                            sed -e 's/^://' \
        !          1590:                                -e 's;\[\([^]]*\)\];;g' \
        !          1591:                                -e 's;<\([^>]*\)>;\1;g' \
        !          1592:                                -e "s; ;§§;g" \
        !          1593:                                -e "s;/;%%;g" \
        !          1594:                                -e "s;§§;${opt_S};g" \
        !          1595:                                -e "s;%%;${opt_C};g"`
        !          1596:                     eval "${var_uc}_N=\"\${val_N}\""
        !          1597:                     ;;
        !          1598:             esac
        !          1599:             case "$opt_F" in
        !          1600:                 *"%<${var_lc}>"* )
        !          1601:                     val_C=`echo ":$val" | \
        !          1602:                            sed -e 's/^://' \
        !          1603:                                -e 's;\[\([^]]*\)\];;g' \
        !          1604:                                -e 's;[^<]*<\([^>]*\)>[^<]*;\1;g' \
        !          1605:                                -e "s; ;§§;g" \
        !          1606:                                -e "s;/;%%;g" \
        !          1607:                                -e "s;§§;${opt_S};g" \
        !          1608:                                -e "s;%%;${opt_C};g"`
        !          1609:                     eval "${var_uc}_C=\"\${val_C}\""
        !          1610:                     ;;
        !          1611:             esac
        !          1612:             ;;
        !          1613:         esac
        !          1614:     done
        !          1615: 
        !          1616:     #   create output string
        !          1617:     output=`echo ":$opt_F" |\
        !          1618:             sed -e "s/^://" \
        !          1619:                 -e "s;%\\[ac\\];${AC_V};g" \
        !          1620:                 -e "s;%{ac};${AC_N};g" \
        !          1621:                 -e "s;%ac;${AC_N};g" \
        !          1622:                 -e "s;%<ac>;${AC_C};g" \
        !          1623:                 -e "s;%\\[ap\\];${AP_V};g" \
        !          1624:                 -e "s;%{ap};${AP_N};g" \
        !          1625:                 -e "s;%ap;${AP_N};g" \
        !          1626:                 -e "s;%<ap>;${AP_C};g" \
        !          1627:                 -e "s;%\\[at\\];${AT_V};g" \
        !          1628:                 -e "s;%{at};${AT_N};g" \
        !          1629:                 -e "s;%at;${AT_N};g" \
        !          1630:                 -e "s;%<at>;${AT_C};g" \
        !          1631:                 -e "s;%\\[sc\\];${SC_V};g" \
        !          1632:                 -e "s;%{sc};${SC_N};g" \
        !          1633:                 -e "s;%sc;${SC_N};g" \
        !          1634:                 -e "s;%<sc>;${SC_C};g" \
        !          1635:                 -e "s;%\\[sp\\];${SP_V};g" \
        !          1636:                 -e "s;%{sp};${SP_N};g" \
        !          1637:                 -e "s;%sp;${SP_N};g" \
        !          1638:                 -e "s;%<sp>;${SP_C};g" \
        !          1639:                 -e "s;%\\[st\\];${ST_V};g" \
        !          1640:                 -e "s;%{st};${ST_N};g" \
        !          1641:                 -e "s;%st;${ST_N};g" \
        !          1642:                 -e "s;%<st>;${ST_C};g" \
        !          1643:                 -e 's/\\\\n/^/g' |\
        !          1644:              tr '^' '\012'`
        !          1645: 
        !          1646:     #   support lower/upper-case mapping
        !          1647:     if [ ".$opt_L" = .yes ]; then
        !          1648:         output=`util_lower "$output"`
        !          1649:     elif [ ".$opt_U" = .yes ]; then
        !          1650:         output=`util_upper "$output"`
        !          1651:     fi
        !          1652: 
        !          1653:     #   display output string
        !          1654:     if [ ".$opt_n" = .yes ]; then
        !          1655:         echo . | awk '{ printf("%s", output); }' output="$output"
        !          1656:     else
        !          1657:         echo "$output"
        !          1658:     fi
        !          1659: 
        !          1660:     shtool_exit 0
        !          1661:     ;;
        !          1662: 
        !          1663: path )
        !          1664:     ##
        !          1665:     ##  path -- Deal with program paths
        !          1666:     ##  Copyright (c) 1998-2008 Ralf S. Engelschall <rse@engelschall.com>
        !          1667:     ##
        !          1668: 
        !          1669:     namelist="$*"
        !          1670: 
        !          1671:     #   check whether the test command supports the -x option
        !          1672:     if [ -x /bin/sh ] 2>/dev/null; then
        !          1673:         minusx="-x"
        !          1674:     else
        !          1675:         minusx="-r"
        !          1676:     fi
        !          1677: 
        !          1678:     #   split path string
        !          1679:     paths="`echo $opt_p |\
        !          1680:             sed -e 's/^:/.:/' \
        !          1681:                 -e 's/::/:.:/g' \
        !          1682:                 -e 's/:$/:./' \
        !          1683:                 -e 's/:/ /g'`"
        !          1684: 
        !          1685:     #   SPECIAL REQUEST
        !          1686:     #   translate forward to reverse path
        !          1687:     if [ ".$opt_r" = .yes ]; then
        !          1688:         if [ "x$namelist" = "x." ]; then
        !          1689:             rp='.'
        !          1690:         else
        !          1691:             rp=''
        !          1692:             for pe in `IFS="$IFS/"; echo $namelist`; do
        !          1693:                 rp="../$rp"
        !          1694:             done
        !          1695:         fi
        !          1696:         echo $rp | sed -e 's:/$::'
        !          1697:         shtool_exit 0
        !          1698:     fi
        !          1699: 
        !          1700:     #   SPECIAL REQUEST
        !          1701:     #   strip out directory or base name
        !          1702:     if [ ".$opt_d" = .yes ]; then
        !          1703:         echo "$namelist" |\
        !          1704:         sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;'
        !          1705:         shtool_exit 0
        !          1706:     fi
        !          1707:     if [ ".$opt_b" = .yes ]; then
        !          1708:         echo "$namelist" |\
        !          1709:         sed -e 's;.*/\([^/]*\)$;\1;'
        !          1710:         shtool_exit 0
        !          1711:     fi
        !          1712: 
        !          1713:     #   MAGIC SITUATION
        !          1714:     #   Perl Interpreter (perl)
        !          1715:     if [ ".$opt_m" = .yes ] && [ ".$namelist" = .perl ]; then
        !          1716:         rm -f $tmpfile >/dev/null 2>&1
        !          1717:         touch $tmpfile
        !          1718:         found=0
        !          1719:         pc=99
        !          1720:         for dir in $paths; do
        !          1721:             dir=`echo $dir | sed -e 's;/*$;;'`
        !          1722:             nc=99
        !          1723:             for name in perl perl5 miniperl; do
        !          1724:                  if [ $minusx "$dir/$name" ] && [ ! -d "$dir/$name" ]; then
        !          1725:                      perl="$dir/$name"
        !          1726:                      pv=`$perl -e 'printf("%.3f", $]);'`
        !          1727:                      echo "$pv:$pc:$nc:$perl" >>$tmpfile
        !          1728:                      found=1
        !          1729:                  fi
        !          1730:                  nc=`expr $nc - 1`
        !          1731:             done
        !          1732:             pc=`expr $pc - 1`
        !          1733:         done
        !          1734:         if [ $found = 1 ]; then
        !          1735:             perl="`cat $tmpfile | sort -r -u | sed -e 'q' | cut -d: -f4`"
        !          1736:             rm -f $tmpfile >/dev/null 2>&1
        !          1737:             echo "$perl"
        !          1738:             shtool_exit 0
        !          1739:         fi
        !          1740:         rm -f $tmpfile >/dev/null 2>&1
        !          1741:         shtool_exit 1
        !          1742:     fi
        !          1743: 
        !          1744:     #   MAGIC SITUATION
        !          1745:     #   C pre-processor (cpp)
        !          1746:     if [ ".$opt_m" = .yes ] && [ ".$namelist" = .cpp ]; then
        !          1747:         echo >$tmpfile.c "#include <assert.h>"
        !          1748:         echo >>$tmpfile.c "Syntax Error"
        !          1749:         #   1. try the standard cc -E approach
        !          1750:         cpp="${CC-cc} -E"
        !          1751:         (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out
        !          1752:         my_error=`grep -v '^ *+' $tmpfile.out`
        !          1753:         if [ ".$my_error" != . ]; then
        !          1754:             #   2. try the cc -E approach and GCC's -traditional-ccp option
        !          1755:             cpp="${CC-cc} -E -traditional-cpp"
        !          1756:             (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out
        !          1757:             my_error=`grep -v '^ *+' $tmpfile.out`
        !          1758:             if [ ".$my_error" != . ]; then
        !          1759:                 #   3. try a standalone cpp command in path and lib dirs
        !          1760:                 for path in $paths /lib /usr/lib /usr/local/lib; do
        !          1761:                     path=`echo $path | sed -e 's;/*$;;'`
        !          1762:                     if [ $minusx "$path/cpp" ] && [ ! -d "$path/cpp" ]; then
        !          1763:                         cpp="$path/cpp"
        !          1764:                         break
        !          1765:                     fi
        !          1766:                 done
        !          1767:                 if [ ".$cpp" != . ]; then
        !          1768:                     (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out
        !          1769:                     my_error=`grep -v '^ *+' $tmpfile.out`
        !          1770:                     if [ ".$my_error" != . ]; then
        !          1771:                         #   ok, we gave up...
        !          1772:                         cpp=''
        !          1773:                     fi
        !          1774:                 fi
        !          1775:             fi
        !          1776:         fi
        !          1777:         rm -f $tmpfile >/dev/null 2>&1
        !          1778:         rm -f $tmpfile.c $tmpfile.out >/dev/null 2>&1
        !          1779:         if [ ".$cpp" != . ]; then
        !          1780:             echo "$cpp"
        !          1781:             shtool_exit 0
        !          1782:         fi
        !          1783:         shtool_exit 1
        !          1784:     fi
        !          1785: 
        !          1786:     #   STANDARD SITUATION
        !          1787:     #   iterate over names
        !          1788:     for name in $namelist; do
        !          1789:         #   iterate over paths
        !          1790:         for path in $paths; do
        !          1791:             path=`echo $path | sed -e 's;/*$;;'`
        !          1792:             if [ $minusx "$path/$name" ] && [ ! -d "$path/$name" ]; then
        !          1793:                 if [ ".$opt_s" != .yes ]; then
        !          1794:                     echo "$path/$name"
        !          1795:                 fi
        !          1796:                 shtool_exit 0
        !          1797:             fi
        !          1798:         done
        !          1799:     done
        !          1800: 
        !          1801:     shtool_exit 1
        !          1802:     ;;
        !          1803: 
        !          1804: esac
        !          1805: 
        !          1806: shtool_exit 0
        !          1807: 

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