1#!/bin/sh 2# 3# $NetBSD: install-sh.in,v 1.5 2010/10/08 19:57:05 tez 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. 32doit="${DOITPROG-}" 33 34 35# put in absolute paths if you don't have them in your path; or use env. vars. 36 37awkprog="${AWKPROG-awk}" 38mvprog="${MVPROG-mv}" 39cpprog="${CPPROG-cp}" 40chmodprog="${CHMODPROG-chmod}" 41chownprog="${CHOWNPROG-chown}" 42chgrpprog="${CHGRPPROG-chgrp}" 43stripprog="${STRIPPROG-strip}" 44rmprog="${RMPROG-rm}" 45mkdirprog="${MKDIRPROG-mkdir}" 46 47instcmd="$cpprog" 48pathcompchmodcmd="$chmodprog 755" 49chmodcmd="$chmodprog 755" 50chowncmd="" 51chgrpcmd="" 52stripcmd="" 53stripflags="" 54rmcmd="$rmprog -f" 55mvcmd="$mvprog" 56src="" 57msrc="" 58dst="" 59dir_arg="" 60suffix="" 61suffixfmt="" 62 63while [ 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 118done 119 120if [ x"$dir_arg" = x ] 121then 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 133else 134 msrc="$msrc $dst" 135fi 136 137if [ x"$msrc" = x ] 138then 139 echo "install: no destination specified" 140 exit 1 141fi 142 143for srcarg in $msrc; do 144 145if [ x"$dir_arg" != x ]; then 146 147 dstarg="$srcarg" 148else 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 177fi 178 179## this sed command emulates the dirname command 180dstdir=`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. 186if [ ! -d "$dstdir" ]; then 187defaultIFS=' 188' 189IFS="${IFS-${defaultIFS}}" 190 191oIFS="${IFS}" 192# Some sh's can't handle IFS=/ for some reason. 193IFS='%' 194set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` 195IFS="${oIFS}" 196 197pathcomp='' 198 199while [ $# -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}/" 215done 216fi 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 288done && 289 290 291exit 0 292