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