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