Annotation of embedaddon/bmon/install-sh, revision 1.1.1.1

1.1       misho       1: #!/bin/sh
                      2: #
                      3: # install - install a program, script, or datafile
                      4: #
                      5: # This originates from X11R5 (mit/util/scripts/install.sh), which was
                      6: # later released in X11R6 (xc/config/util/install.sh) with the
                      7: # following copyright and license.
                      8: #
                      9: # Copyright (C) 1994 X Consortium
                     10: #
                     11: # Permission is hereby granted, free of charge, to any person obtaining a copy
                     12: # of this software and associated documentation files (the "Software"), to
                     13: # deal in the Software without restriction, including without limitation the
                     14: # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
                     15: # sell copies of the Software, and to permit persons to whom the Software is
                     16: # furnished to do so, subject to the following conditions:
                     17: #
                     18: # The above copyright notice and this permission notice shall be included in
                     19: # all copies or substantial portions of the Software.
                     20: #
                     21: # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
                     22: # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
                     23: # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
                     24: # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
                     25: # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
                     26: # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
                     27: #
                     28: # Except as contained in this notice, the name of the X Consortium shall not
                     29: # be used in advertising or otherwise to promote the sale, use or other deal-
                     30: # ings in this Software without prior written authorization from the X Consor-
                     31: # tium.
                     32: #
                     33: #
                     34: # FSF changes to this file are in the public domain.
                     35: #
                     36: # Calling this script install-sh is preferred over install.sh, to prevent
                     37: # `make' implicit rules from creating a file called install from it
                     38: # when there is no Makefile.
                     39: #
                     40: # This script is compatible with the BSD install script, but was written
                     41: # from scratch.  It can only install one file at a time, a restriction
                     42: # shared with many OS's install programs.
                     43: 
                     44: 
                     45: # set DOITPROG to echo to test this script
                     46: 
                     47: # Don't use :- since 4.3BSD and earlier shells don't like it.
                     48: doit="${DOITPROG-}"
                     49: 
                     50: 
                     51: # put in absolute paths if you don't have them in your path; or use env. vars.
                     52: 
                     53: mvprog="${MVPROG-mv}"
                     54: cpprog="${CPPROG-cp}"
                     55: chmodprog="${CHMODPROG-chmod}"
                     56: chownprog="${CHOWNPROG-chown}"
                     57: chgrpprog="${CHGRPPROG-chgrp}"
                     58: stripprog="${STRIPPROG-strip}"
                     59: rmprog="${RMPROG-rm}"
                     60: mkdirprog="${MKDIRPROG-mkdir}"
                     61: 
                     62: transformbasename=""
                     63: transform_arg=""
                     64: instcmd="$mvprog"
                     65: chmodcmd="$chmodprog 0755"
                     66: chowncmd=""
                     67: chgrpcmd=""
                     68: stripcmd=""
                     69: rmcmd="$rmprog -f"
                     70: mvcmd="$mvprog"
                     71: src=""
                     72: dst=""
                     73: dir_arg=""
                     74: 
                     75: while [ x"$1" != x ]; do
                     76:     case $1 in
                     77:        -c) instcmd=$cpprog
                     78:            shift
                     79:            continue;;
                     80: 
                     81:        -d) dir_arg=true
                     82:            shift
                     83:            continue;;
                     84: 
                     85:        -m) chmodcmd="$chmodprog $2"
                     86:            shift
                     87:            shift
                     88:            continue;;
                     89: 
                     90:        -o) chowncmd="$chownprog $2"
                     91:            shift
                     92:            shift
                     93:            continue;;
                     94: 
                     95:        -g) chgrpcmd="$chgrpprog $2"
                     96:            shift
                     97:            shift
                     98:            continue;;
                     99: 
                    100:        -s) stripcmd=$stripprog
                    101:            shift
                    102:            continue;;
                    103: 
                    104:        -t=*) transformarg=`echo $1 | sed 's/-t=//'`
                    105:            shift
                    106:            continue;;
                    107: 
                    108:        -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
                    109:            shift
                    110:            continue;;
                    111: 
                    112:        *)  if [ x"$src" = x ]
                    113:            then
                    114:                src=$1
                    115:            else
                    116:                # this colon is to work around a 386BSD /bin/sh bug
                    117:                :
                    118:                dst=$1
                    119:            fi
                    120:            shift
                    121:            continue;;
                    122:     esac
                    123: done
                    124: 
                    125: if [ x"$src" = x ]
                    126: then
                    127:        echo "$0: no input file specified" >&2
                    128:        exit 1
                    129: else
                    130:        :
                    131: fi
                    132: 
                    133: if [ x"$dir_arg" != x ]; then
                    134:        dst=$src
                    135:        src=""
                    136: 
                    137:        if [ -d "$dst" ]; then
                    138:                instcmd=:
                    139:                chmodcmd=""
                    140:        else
                    141:                instcmd=$mkdirprog
                    142:        fi
                    143: else
                    144: 
                    145: # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
                    146: # might cause directories to be created, which would be especially bad
                    147: # if $src (and thus $dsttmp) contains '*'.
                    148: 
                    149:        if [ -f "$src" ] || [ -d "$src" ]
                    150:        then
                    151:                :
                    152:        else
                    153:                echo "$0: $src does not exist" >&2
                    154:                exit 1
                    155:        fi
                    156: 
                    157:        if [ x"$dst" = x ]
                    158:        then
                    159:                echo "$0: no destination specified" >&2
                    160:                exit 1
                    161:        else
                    162:                :
                    163:        fi
                    164: 
                    165: # If destination is a directory, append the input filename; if your system
                    166: # does not like double slashes in filenames, you may need to add some logic
                    167: 
                    168:        if [ -d "$dst" ]
                    169:        then
                    170:                dst=$dst/`basename "$src"`
                    171:        else
                    172:                :
                    173:        fi
                    174: fi
                    175: 
                    176: ## this sed command emulates the dirname command
                    177: dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
                    178: 
                    179: # Make sure that the destination directory exists.
                    180: #  this part is taken from Noah Friedman's mkinstalldirs script
                    181: 
                    182: # Skip lots of stat calls in the usual case.
                    183: if [ ! -d "$dstdir" ]; then
                    184: defaultIFS='
                    185:        '
                    186: IFS="${IFS-$defaultIFS}"
                    187: 
                    188: oIFS=$IFS
                    189: # Some sh's can't handle IFS=/ for some reason.
                    190: IFS='%'
                    191: set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
                    192: IFS=$oIFS
                    193: 
                    194: pathcomp=''
                    195: 
                    196: while [ $# -ne 0 ] ; do
                    197:        pathcomp=$pathcomp$1
                    198:        shift
                    199: 
                    200:        if [ ! -d "$pathcomp" ] ;
                    201:         then
                    202:                $mkdirprog "$pathcomp"
                    203:        else
                    204:                :
                    205:        fi
                    206: 
                    207:        pathcomp=$pathcomp/
                    208: done
                    209: fi
                    210: 
                    211: if [ x"$dir_arg" != x ]
                    212: then
                    213:        $doit $instcmd "$dst" &&
                    214: 
                    215:        if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
                    216:        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
                    217:        if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
                    218:        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
                    219: else
                    220: 
                    221: # If we're going to rename the final executable, determine the name now.
                    222: 
                    223:        if [ x"$transformarg" = x ]
                    224:        then
                    225:                dstfile=`basename "$dst"`
                    226:        else
                    227:                dstfile=`basename "$dst" $transformbasename |
                    228:                        sed $transformarg`$transformbasename
                    229:        fi
                    230: 
                    231: # don't allow the sed command to completely eliminate the filename
                    232: 
                    233:        if [ x"$dstfile" = x ]
                    234:        then
                    235:                dstfile=`basename "$dst"`
                    236:        else
                    237:                :
                    238:        fi
                    239: 
                    240: # Make a couple of temp file names in the proper directory.
                    241: 
                    242:        dsttmp=$dstdir/_inst.$$_
                    243:        rmtmp=$dstdir/_rm.$$_
                    244: 
                    245: # Trap to clean up temp files at exit.
                    246: 
                    247:        trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
                    248:        trap '(exit $?); exit' 1 2 13 15
                    249: 
                    250: # Move or copy the file name to the temp name
                    251: 
                    252:        $doit $instcmd "$src" "$dsttmp" &&
                    253: 
                    254: # and set any options; do chmod last to preserve setuid bits
                    255: 
                    256: # If any of these fail, we abort the whole thing.  If we want to
                    257: # ignore errors from any of these, just make sure not to ignore
                    258: # errors from the above "$doit $instcmd $src $dsttmp" command.
                    259: 
                    260:        if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
                    261:        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
                    262:        if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
                    263:        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
                    264: 
                    265: # Now remove or move aside any old file at destination location.  We try this
                    266: # two ways since rm can't unlink itself on some systems and the destination
                    267: # file might be busy for other reasons.  In this case, the final cleanup
                    268: # might fail but the new file should still install successfully.
                    269: 
                    270: {
                    271:        if [ -f "$dstdir/$dstfile" ]
                    272:        then
                    273:                $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
                    274:                $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
                    275:                {
                    276:                  echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
                    277:                  (exit 1); exit
                    278:                }
                    279:        else
                    280:                :
                    281:        fi
                    282: } &&
                    283: 
                    284: # Now rename the file to the real destination.
                    285: 
                    286:        $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
                    287: 
                    288: fi &&
                    289: 
                    290: # The final little trick to "correctly" pass the exit status to the exit trap.
                    291: 
                    292: {
                    293:        (exit 0); exit
                    294: }

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