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