175a6cdb3SDavid E. O'Brien#!/bin/sh 2*80c86c36SDavid E. O'Brien# 3*80c86c36SDavid E. O'Brien# $NetBSD: install-sh.in,v 1.5 2010/10/08 19:57:05 tez Exp $ 4*80c86c36SDavid E. O'Brien# This script now also installs multiple files, but might choke on installing 5*80c86c36SDavid E. O'Brien# multiple files with spaces in the file names. 6*80c86c36SDavid E. O'Brien# 775a6cdb3SDavid E. O'Brien# install - install a program, script, or datafile 8*80c86c36SDavid E. O'Brien# This comes from X11R5 (mit/util/scripts/install.sh). 9a2e8fb4cSDavid E. O'Brien# 10*80c86c36SDavid E. O'Brien# Copyright 1991 by the Massachusetts Institute of Technology 11a2e8fb4cSDavid E. O'Brien# 12*80c86c36SDavid E. O'Brien# Permission to use, copy, modify, distribute, and sell this software and its 13*80c86c36SDavid E. O'Brien# documentation for any purpose is hereby granted without fee, provided that 14*80c86c36SDavid E. O'Brien# the above copyright notice appear in all copies and that both that 15*80c86c36SDavid E. O'Brien# copyright notice and this permission notice appear in supporting 16*80c86c36SDavid E. O'Brien# documentation, and that the name of M.I.T. not be used in advertising or 17*80c86c36SDavid E. O'Brien# publicity pertaining to distribution of the software without specific, 18*80c86c36SDavid E. O'Brien# written prior permission. M.I.T. makes no representations about the 19*80c86c36SDavid E. O'Brien# suitability of this software for any purpose. It is provided "as is" 20*80c86c36SDavid E. O'Brien# without express or implied warranty. 2175a6cdb3SDavid E. O'Brien# 2275a6cdb3SDavid E. O'Brien# Calling this script install-sh is preferred over install.sh, to prevent 2375a6cdb3SDavid E. O'Brien# `make' implicit rules from creating a file called install from it 2475a6cdb3SDavid E. O'Brien# when there is no Makefile. 2575a6cdb3SDavid E. O'Brien# 2675a6cdb3SDavid E. O'Brien# This script is compatible with the BSD install script, but was written 27974b70c4SDavid E. O'Brien# from scratch. 28974b70c4SDavid E. O'Brien 2975a6cdb3SDavid E. O'Brien# set DOITPROG to echo to test this script 3075a6cdb3SDavid E. O'Brien 3175a6cdb3SDavid E. O'Brien# Don't use :- since 4.3BSD and earlier shells don't like it. 3275a6cdb3SDavid E. O'Briendoit="${DOITPROG-}" 3375a6cdb3SDavid E. O'Brien 3475a6cdb3SDavid E. O'Brien 35*80c86c36SDavid E. O'Brien# put in absolute paths if you don't have them in your path; or use env. vars. 36*80c86c36SDavid E. O'Brien 37*80c86c36SDavid E. O'Brienawkprog="${AWKPROG-awk}" 3875a6cdb3SDavid E. O'Brienmvprog="${MVPROG-mv}" 3975a6cdb3SDavid E. O'Briencpprog="${CPPROG-cp}" 4075a6cdb3SDavid E. O'Brienchmodprog="${CHMODPROG-chmod}" 4175a6cdb3SDavid E. O'Brienchownprog="${CHOWNPROG-chown}" 4275a6cdb3SDavid E. O'Brienchgrpprog="${CHGRPPROG-chgrp}" 4375a6cdb3SDavid E. O'Brienstripprog="${STRIPPROG-strip}" 4475a6cdb3SDavid E. O'Brienrmprog="${RMPROG-rm}" 4575a6cdb3SDavid E. O'Brienmkdirprog="${MKDIRPROG-mkdir}" 4675a6cdb3SDavid E. O'Brien 47*80c86c36SDavid E. O'Brieninstcmd="$cpprog" 48*80c86c36SDavid E. O'Brienpathcompchmodcmd="$chmodprog 755" 49*80c86c36SDavid E. O'Brienchmodcmd="$chmodprog 755" 50*80c86c36SDavid E. O'Brienchowncmd="" 51*80c86c36SDavid E. O'Brienchgrpcmd="" 52*80c86c36SDavid E. O'Brienstripcmd="" 53*80c86c36SDavid E. O'Brienstripflags="" 5475a6cdb3SDavid E. O'Brienrmcmd="$rmprog -f" 5575a6cdb3SDavid E. O'Brienmvcmd="$mvprog" 56*80c86c36SDavid E. O'Briensrc="" 57*80c86c36SDavid E. O'Brienmsrc="" 58*80c86c36SDavid E. O'Briendst="" 59*80c86c36SDavid E. O'Briendir_arg="" 60*80c86c36SDavid E. O'Briensuffix="" 61*80c86c36SDavid E. O'Briensuffixfmt="" 6275a6cdb3SDavid E. O'Brien 63*80c86c36SDavid E. O'Brienwhile [ x"$1" != x ]; do 6475a6cdb3SDavid E. O'Brien case $1 in 65*80c86c36SDavid E. O'Brien -b) suffix=".old" 66*80c86c36SDavid E. O'Brien shift 67*80c86c36SDavid E. O'Brien continue;; 68*80c86c36SDavid E. O'Brien 69*80c86c36SDavid E. O'Brien -B) suffixfmt="$2" 70*80c86c36SDavid E. O'Brien shift 71*80c86c36SDavid E. O'Brien shift 72*80c86c36SDavid E. O'Brien continue;; 73*80c86c36SDavid E. O'Brien 74*80c86c36SDavid E. O'Brien -c) instcmd="$cpprog" 75*80c86c36SDavid E. O'Brien shift 7675a6cdb3SDavid E. O'Brien continue;; 7775a6cdb3SDavid E. O'Brien 7875a6cdb3SDavid E. O'Brien -d) dir_arg=true 7975a6cdb3SDavid E. O'Brien shift 8075a6cdb3SDavid E. O'Brien continue;; 8175a6cdb3SDavid E. O'Brien 82*80c86c36SDavid E. O'Brien -m) chmodcmd="$chmodprog $2" 83*80c86c36SDavid E. O'Brien shift 84*80c86c36SDavid E. O'Brien shift 85*80c86c36SDavid E. O'Brien continue;; 86*80c86c36SDavid E. O'Brien 87*80c86c36SDavid E. O'Brien -o) chowncmd="$chownprog $2" 88*80c86c36SDavid E. O'Brien shift 89*80c86c36SDavid E. O'Brien shift 90*80c86c36SDavid E. O'Brien continue;; 91*80c86c36SDavid E. O'Brien 92d1d50c78SDavid E. O'Brien -g) chgrpcmd="$chgrpprog $2" 93d1d50c78SDavid E. O'Brien shift 94d1d50c78SDavid E. O'Brien shift 95d1d50c78SDavid E. O'Brien continue;; 96d1d50c78SDavid E. O'Brien 97*80c86c36SDavid E. O'Brien -s) stripcmd="$stripprog" 9875a6cdb3SDavid E. O'Brien shift 9975a6cdb3SDavid E. O'Brien continue;; 10075a6cdb3SDavid E. O'Brien 101*80c86c36SDavid E. O'Brien -S) stripcmd="$stripprog" 102*80c86c36SDavid E. O'Brien stripflags="-S $2 $stripflags" 10375a6cdb3SDavid E. O'Brien shift 10475a6cdb3SDavid E. O'Brien shift 10575a6cdb3SDavid E. O'Brien continue;; 10675a6cdb3SDavid E. O'Brien 107*80c86c36SDavid E. O'Brien *) if [ x"$msrc" = x ] 108*80c86c36SDavid E. O'Brien then 109*80c86c36SDavid E. O'Brien msrc="$dst" 110*80c86c36SDavid E. O'Brien else 111*80c86c36SDavid E. O'Brien msrc="$msrc $dst" 112*80c86c36SDavid E. O'Brien fi 113*80c86c36SDavid E. O'Brien src="$dst" 114*80c86c36SDavid E. O'Brien dst="$1" 115d1d50c78SDavid E. O'Brien shift 116d1d50c78SDavid E. O'Brien continue;; 117974b70c4SDavid E. O'Brien esac 118974b70c4SDavid E. O'Briendone 119974b70c4SDavid E. O'Brien 120*80c86c36SDavid E. O'Brienif [ x"$dir_arg" = x ] 121*80c86c36SDavid E. O'Brienthen 122*80c86c36SDavid E. O'Brien dstisfile="" 123*80c86c36SDavid E. O'Brien if [ ! -d "$dst" ] 124*80c86c36SDavid E. O'Brien then 125*80c86c36SDavid E. O'Brien if [ x"$msrc" = x"$src" ] 126*80c86c36SDavid E. O'Brien then 127*80c86c36SDavid E. O'Brien dstisfile=true 128*80c86c36SDavid E. O'Brien else 129*80c86c36SDavid E. O'Brien echo "install: destination is not a directory" 13075a6cdb3SDavid E. O'Brien exit 1 131d1d50c78SDavid E. O'Brien fi 13275a6cdb3SDavid E. O'Brien fi 133974b70c4SDavid E. O'Brienelse 134*80c86c36SDavid E. O'Brien msrc="$msrc $dst" 135974b70c4SDavid E. O'Brienfi 136*80c86c36SDavid E. O'Brien 137*80c86c36SDavid E. O'Brienif [ x"$msrc" = x ] 138*80c86c36SDavid E. O'Brienthen 139*80c86c36SDavid E. O'Brien echo "install: no destination specified" 140*80c86c36SDavid E. O'Brien exit 1 141*80c86c36SDavid E. O'Brienfi 142*80c86c36SDavid E. O'Brien 143*80c86c36SDavid E. O'Brienfor srcarg in $msrc; do 144*80c86c36SDavid E. O'Brien 145*80c86c36SDavid E. O'Brienif [ x"$dir_arg" != x ]; then 146*80c86c36SDavid E. O'Brien 147*80c86c36SDavid E. O'Brien dstarg="$srcarg" 148974b70c4SDavid E. O'Brienelse 149*80c86c36SDavid E. O'Brien dstarg="$dst" 150974b70c4SDavid E. O'Brien 151*80c86c36SDavid E. O'Brien# Waiting for this to be detected by the "$instcmd $srcarg $dsttmp" command 15275a6cdb3SDavid E. O'Brien# might cause directories to be created, which would be especially bad 15375a6cdb3SDavid E. O'Brien# if $src (and thus $dsttmp) contains '*'. 15475a6cdb3SDavid E. O'Brien 155*80c86c36SDavid E. O'Brien if [ -f "$srcarg" ] 156974b70c4SDavid E. O'Brien then 157*80c86c36SDavid E. O'Brien doinst="$instcmd" 158*80c86c36SDavid E. O'Brien elif [ -d "$srcarg" ] 159*80c86c36SDavid E. O'Brien then 160*80c86c36SDavid E. O'Brien echo "install: $srcarg: not a regular file" 161*80c86c36SDavid E. O'Brien exit 1 162*80c86c36SDavid E. O'Brien elif [ "$srcarg" = "/dev/null" ] 163*80c86c36SDavid E. O'Brien then 164*80c86c36SDavid E. O'Brien doinst="$cpprog" 165*80c86c36SDavid E. O'Brien else 166*80c86c36SDavid E. O'Brien echo "install: $srcarg does not exist" 167*80c86c36SDavid E. O'Brien exit 1 168974b70c4SDavid E. O'Brien fi 169*80c86c36SDavid E. O'Brien 170*80c86c36SDavid E. O'Brien# If destination is a directory, append the input filename; if your system 171*80c86c36SDavid E. O'Brien# does not like double slashes in filenames, you may need to add some logic 172*80c86c36SDavid E. O'Brien 173*80c86c36SDavid E. O'Brien if [ -d "$dstarg" ] 174*80c86c36SDavid E. O'Brien then 175*80c86c36SDavid E. O'Brien dstarg="$dstarg"/`basename "$srcarg"` 176974b70c4SDavid E. O'Brien fi 177*80c86c36SDavid E. O'Brienfi 178974b70c4SDavid E. O'Brien 179*80c86c36SDavid E. O'Brien## this sed command emulates the dirname command 180*80c86c36SDavid E. O'Briendstdir=`echo "$dstarg" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` 181974b70c4SDavid E. O'Brien 182*80c86c36SDavid E. O'Brien# Make sure that the destination directory exists. 183*80c86c36SDavid E. O'Brien# this part is taken from Noah Friedman's mkinstalldirs script 184974b70c4SDavid E. O'Brien 185*80c86c36SDavid E. O'Brien# Skip lots of stat calls in the usual case. 186*80c86c36SDavid E. O'Brienif [ ! -d "$dstdir" ]; then 187*80c86c36SDavid E. O'BriendefaultIFS=' 188*80c86c36SDavid E. O'Brien' 189*80c86c36SDavid E. O'BrienIFS="${IFS-${defaultIFS}}" 190974b70c4SDavid E. O'Brien 191*80c86c36SDavid E. O'BrienoIFS="${IFS}" 192*80c86c36SDavid E. O'Brien# Some sh's can't handle IFS=/ for some reason. 193*80c86c36SDavid E. O'BrienIFS='%' 194*80c86c36SDavid E. O'Brienset - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` 195*80c86c36SDavid E. O'BrienIFS="${oIFS}" 19675a6cdb3SDavid E. O'Brien 197*80c86c36SDavid E. O'Brienpathcomp='' 198*80c86c36SDavid E. O'Brien 199*80c86c36SDavid E. O'Brienwhile [ $# -ne 0 ] ; do 200*80c86c36SDavid E. O'Brien pathcomp="${pathcomp}${1}" 20175a6cdb3SDavid E. O'Brien shift 20275a6cdb3SDavid E. O'Brien 203*80c86c36SDavid E. O'Brien if [ ! -d "${pathcomp}" ] ; 204*80c86c36SDavid E. O'Brien then 205*80c86c36SDavid E. O'Brien $doit $mkdirprog "${pathcomp}" 206*80c86c36SDavid E. O'Brien if [ x"$chowncmd" != x ]; then $doit $chowncmd "${pathcomp}"; else true ; fi && 207*80c86c36SDavid E. O'Brien if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "${pathcomp}"; else true ; fi && 208*80c86c36SDavid E. O'Brien if [ x"$pathcompchmodcmd" != x ]; then $doit $pathcompchmodcmd "${pathcomp}"; else true ; fi 209d1d50c78SDavid E. O'Brien 210974b70c4SDavid E. O'Brien else 211*80c86c36SDavid E. O'Brien true 21275a6cdb3SDavid E. O'Brien fi 213*80c86c36SDavid E. O'Brien 214*80c86c36SDavid E. O'Brien pathcomp="${pathcomp}/" 21575a6cdb3SDavid E. O'Briendone 21675a6cdb3SDavid E. O'Brienfi 21775a6cdb3SDavid E. O'Brien 218*80c86c36SDavid E. O'Brien if [ x"$dir_arg" != x ] 219*80c86c36SDavid E. O'Brien then 220*80c86c36SDavid E. O'Brien if [ -d "$dstarg" ]; then 221*80c86c36SDavid E. O'Brien true 222*80c86c36SDavid E. O'Brien else 223*80c86c36SDavid E. O'Brien $doit $mkdirprog "$dstarg" && 224*80c86c36SDavid E. O'Brien 225*80c86c36SDavid E. O'Brien if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dstarg"; else true ; fi && 226*80c86c36SDavid E. O'Brien if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dstarg"; else true ; fi && 227*80c86c36SDavid E. O'Brien if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dstarg"; else true ; fi 228*80c86c36SDavid E. O'Brien fi 22975a6cdb3SDavid E. O'Brien else 23075a6cdb3SDavid E. O'Brien 231*80c86c36SDavid E. O'Brien if [ x"$dstisfile" = x ] 232*80c86c36SDavid E. O'Brien then 233*80c86c36SDavid E. O'Brien file=$srcarg 234*80c86c36SDavid E. O'Brien else 235*80c86c36SDavid E. O'Brien file=$dst 236*80c86c36SDavid E. O'Brien fi 23775a6cdb3SDavid E. O'Brien 238*80c86c36SDavid E. O'Brien dstfile=`basename "$file"` 239*80c86c36SDavid E. O'Brien dstfinal="$dstdir/$dstfile" 24075a6cdb3SDavid E. O'Brien 241*80c86c36SDavid E. O'Brien# Make a temp file name in the proper directory. 24275a6cdb3SDavid E. O'Brien 243*80c86c36SDavid E. O'Brien dsttmp=$dstdir/#inst.$$# 244*80c86c36SDavid E. O'Brien 245*80c86c36SDavid E. O'Brien# Make a backup file name in the proper directory. 246*80c86c36SDavid E. O'Brien case x$suffixfmt in 247*80c86c36SDavid E. O'Brien *%*) suffix=`echo x | 248*80c86c36SDavid E. O'Brien $awkprog -v bname="$dstfinal" -v fmt="$suffixfmt" ' 249*80c86c36SDavid E. O'Brien { cnt = 0; 250*80c86c36SDavid E. O'Brien do { 251*80c86c36SDavid E. O'Brien sfx = sprintf(fmt, cnt++); 252*80c86c36SDavid E. O'Brien name = bname sfx; 253*80c86c36SDavid E. O'Brien } while (system("test -f " name) == 0); 254*80c86c36SDavid E. O'Brien print sfx; }' -`;; 255*80c86c36SDavid E. O'Brien x) ;; 256*80c86c36SDavid E. O'Brien *) suffix="$suffixfmt";; 257*80c86c36SDavid E. O'Brien esac 258*80c86c36SDavid E. O'Brien dstbackup="$dstfinal$suffix" 259*80c86c36SDavid E. O'Brien 260*80c86c36SDavid E. O'Brien# Move or copy the file name to the temp name 261*80c86c36SDavid E. O'Brien 262*80c86c36SDavid E. O'Brien $doit $doinst $srcarg "$dsttmp" && 263*80c86c36SDavid E. O'Brien 264*80c86c36SDavid E. O'Brien trap "rm -f ${dsttmp}" 0 && 265*80c86c36SDavid E. O'Brien 266*80c86c36SDavid E. O'Brien# and set any options; do chmod last to preserve setuid bits 267*80c86c36SDavid E. O'Brien 268d1d50c78SDavid E. O'Brien# If any of these fail, we abort the whole thing. If we want to 269d1d50c78SDavid E. O'Brien# ignore errors from any of these, just make sure not to ignore 270*80c86c36SDavid E. O'Brien# errors from the above "$doit $instcmd $src $dsttmp" command. 271*80c86c36SDavid E. O'Brien 272*80c86c36SDavid E. O'Brien if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else true;fi && 273*80c86c36SDavid E. O'Brien if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else true;fi && 274*80c86c36SDavid E. O'Brien if [ x"$stripcmd" != x ]; then $doit $stripcmd $stripflags "$dsttmp"; else true;fi && 275*80c86c36SDavid E. O'Brien if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else true;fi && 276d1d50c78SDavid E. O'Brien 277d1d50c78SDavid E. O'Brien# Now rename the file to the real destination. 278d1d50c78SDavid E. O'Brien 279*80c86c36SDavid E. O'Brien if [ x"$suffix" != x ] && [ -f "$dstfinal" ] 280*80c86c36SDavid E. O'Brien then 281*80c86c36SDavid E. O'Brien $doit $mvcmd "$dstfinal" "$dstbackup" 28275a6cdb3SDavid E. O'Brien else 283*80c86c36SDavid E. O'Brien $doit $rmcmd -f "$dstfinal" 284*80c86c36SDavid E. O'Brien fi && 285*80c86c36SDavid E. O'Brien $doit $mvcmd "$dsttmp" "$dstfinal" 28675a6cdb3SDavid E. O'Brien fi 28775a6cdb3SDavid E. O'Brien 288*80c86c36SDavid E. O'Briendone && 28975a6cdb3SDavid E. O'Brien 29075a6cdb3SDavid E. O'Brien 291*80c86c36SDavid E. O'Brienexit 0 292