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