Annotation of gpl/axl/install-sh, revision 1.1.1.1

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

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