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