File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bmon / install-sh
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:19:56 2012 UTC (12 years, 3 months ago) by misho
Branches: bmon, MAIN
CVS tags: v2_1_0p0, v2_1_0, HEAD
bmon

    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>