Home | History | Annotate | Download | only in strace
      1 #!/bin/sh
      2 #
      3 # install - install a program, script, or datafile
      4 # This comes from X11R5 (mit/util/scripts/install.sh).
      5 #
      6 # Copyright 1991 by the Massachusetts Institute of Technology
      7 #
      8 # Permission to use, copy, modify, distribute, and sell this software and its
      9 # documentation for any purpose is hereby granted without fee, provided that
     10 # the above copyright notice appear in all copies and that both that
     11 # copyright notice and this permission notice appear in supporting
     12 # documentation, and that the name of M.I.T. not be used in advertising or
     13 # publicity pertaining to distribution of the software without specific,
     14 # written prior permission.  M.I.T. makes no representations about the
     15 # suitability of this software for any purpose.  It is provided "as is"
     16 # without express or implied warranty.
     17 #
     18 # Calling this script install-sh is preferred over install.sh, to prevent
     19 # `make' implicit rules from creating a file called install from it
     20 # when there is no Makefile.
     21 #
     22 # This script is compatible with the BSD install script, but was written
     23 # from scratch.  It can only install one file at a time, a restriction
     24 # shared with many OS's install programs.
     25 
     26 
     27 # set DOITPROG to echo to test this script
     28 
     29 # Don't use :- since 4.3BSD and earlier shells don't like it.
     30 doit="${DOITPROG-}"
     31 
     32 
     33 # put in absolute paths if you don't have them in your path; or use env. vars.
     34 
     35 mvprog="${MVPROG-mv}"
     36 cpprog="${CPPROG-cp}"
     37 chmodprog="${CHMODPROG-chmod}"
     38 chownprog="${CHOWNPROG-chown}"
     39 chgrpprog="${CHGRPPROG-chgrp}"
     40 stripprog="${STRIPPROG-strip}"
     41 rmprog="${RMPROG-rm}"
     42 mkdirprog="${MKDIRPROG-mkdir}"
     43 
     44 transformbasename=""
     45 transform_arg=""
     46 instcmd="$mvprog"
     47 chmodcmd="$chmodprog 0755"
     48 chowncmd=""
     49 chgrpcmd=""
     50 stripcmd=""
     51 rmcmd="$rmprog -f"
     52 mvcmd="$mvprog"
     53 src=""
     54 dst=""
     55 dir_arg=""
     56 
     57 while [ x"$1" != x ]; do
     58     case $1 in
     59 	-c) instcmd=$cpprog
     60 	    shift
     61 	    continue;;
     62 
     63 	-d) dir_arg=true
     64 	    shift
     65 	    continue;;
     66 
     67 	-m) chmodcmd="$chmodprog $2"
     68 	    shift
     69 	    shift
     70 	    continue;;
     71 
     72 	-o) chowncmd="$chownprog $2"
     73 	    shift
     74 	    shift
     75 	    continue;;
     76 
     77 	-g) chgrpcmd="$chgrpprog $2"
     78 	    shift
     79 	    shift
     80 	    continue;;
     81 
     82 	-s) stripcmd=$stripprog
     83 	    shift
     84 	    continue;;
     85 
     86 	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
     87 	    shift
     88 	    continue;;
     89 
     90 	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
     91 	    shift
     92 	    continue;;
     93 
     94 	*)  if [ x"$src" = x ]
     95 	    then
     96 		src=$1
     97 	    else
     98 		# this colon is to work around a 386BSD /bin/sh bug
     99 		:
    100 		dst=$1
    101 	    fi
    102 	    shift
    103 	    continue;;
    104     esac
    105 done
    106 
    107 if [ x"$src" = x ]
    108 then
    109 	echo "$0: no input file specified" >&2
    110 	exit 1
    111 else
    112 	:
    113 fi
    114 
    115 if [ x"$dir_arg" != x ]; then
    116 	dst=$src
    117 	src=""
    118 
    119 	if [ -d "$dst" ]; then
    120 		instcmd=:
    121 		chmodcmd=""
    122 	else
    123 		instcmd=$mkdirprog
    124 	fi
    125 else
    126 
    127 # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
    128 # might cause directories to be created, which would be especially bad
    129 # if $src (and thus $dsttmp) contains '*'.
    130 
    131 	if [ -f "$src" ] || [ -d "$src" ]
    132 	then
    133 		:
    134 	else
    135 		echo "$0: $src does not exist" >&2
    136 		exit 1
    137 	fi
    138 
    139 	if [ x"$dst" = x ]
    140 	then
    141 		echo "$0: no destination specified" >&2
    142 		exit 1
    143 	else
    144 		:
    145 	fi
    146 
    147 # If destination is a directory, append the input filename; if your system
    148 # does not like double slashes in filenames, you may need to add some logic
    149 
    150 	if [ -d "$dst" ]
    151 	then
    152 		dst=$dst/`basename "$src"`
    153 	else
    154 		:
    155 	fi
    156 fi
    157 
    158 ## this sed command emulates the dirname command
    159 dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
    160 
    161 # Make sure that the destination directory exists.
    162 #  this part is taken from Noah Friedman's mkinstalldirs script
    163 
    164 # Skip lots of stat calls in the usual case.
    165 if [ ! -d "$dstdir" ]; then
    166 defaultIFS='
    167 	'
    168 IFS="${IFS-$defaultIFS}"
    169 
    170 oIFS=$IFS
    171 # Some sh's can't handle IFS=/ for some reason.
    172 IFS='%'
    173 set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
    174 IFS=$oIFS
    175 
    176 pathcomp=''
    177 
    178 while [ $# -ne 0 ] ; do
    179 	pathcomp=$pathcomp$1
    180 	shift
    181 
    182 	if [ ! -d "$pathcomp" ] ;
    183         then
    184 		$mkdirprog "$pathcomp"
    185 	else
    186 		:
    187 	fi
    188 
    189 	pathcomp=$pathcomp/
    190 done
    191 fi
    192 
    193 if [ x"$dir_arg" != x ]
    194 then
    195 	$doit $instcmd "$dst" &&
    196 
    197 	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
    198 	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
    199 	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
    200 	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
    201 else
    202 
    203 # If we're going to rename the final executable, determine the name now.
    204 
    205 	if [ x"$transformarg" = x ]
    206 	then
    207 		dstfile=`basename "$dst"`
    208 	else
    209 		dstfile=`basename "$dst" $transformbasename |
    210 			sed $transformarg`$transformbasename
    211 	fi
    212 
    213 # don't allow the sed command to completely eliminate the filename
    214 
    215 	if [ x"$dstfile" = x ]
    216 	then
    217 		dstfile=`basename "$dst"`
    218 	else
    219 		:
    220 	fi
    221 
    222 # Make a couple of temp file names in the proper directory.
    223 
    224 	dsttmp=$dstdir/#inst.$$#
    225 	rmtmp=$dstdir/#rm.$$#
    226 
    227 # Trap to clean up temp files at exit.
    228 
    229 	trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
    230 	trap '(exit $?); exit' 1 2 13 15
    231 
    232 # Move or copy the file name to the temp name
    233 
    234 	$doit $instcmd "$src" "$dsttmp" &&
    235 
    236 # and set any options; do chmod last to preserve setuid bits
    237 
    238 # If any of these fail, we abort the whole thing.  If we want to
    239 # ignore errors from any of these, just make sure not to ignore
    240 # errors from the above "$doit $instcmd $src $dsttmp" command.
    241 
    242 	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
    243 	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
    244 	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
    245 	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
    246 
    247 # Now remove or move aside any old file at destination location.  We try this
    248 # two ways since rm can't unlink itself on some systems and the destination
    249 # file might be busy for other reasons.  In this case, the final cleanup
    250 # might fail but the new file should still install successfully.
    251 
    252 {
    253 	if [ -f "$dstdir/$dstfile" ]
    254 	then
    255 		$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
    256 		$doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
    257 		{
    258 		  echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
    259 		  (exit 1); exit
    260 		}
    261 	else
    262 		:
    263 	fi
    264 } &&
    265 
    266 # Now rename the file to the real destination.
    267 
    268 	$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
    269 
    270 fi &&
    271 
    272 # The final little trick to "correctly" pass the exit status to the exit trap.
    273 
    274 {
    275 	(exit 0); exit
    276 }
    277