Annotation of embedaddon/bmon/install-sh, revision 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>