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