source: trunk/third/control-center/install-sh @ 21319

Revision 21319, 7.0 KB checked in by ghudson, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r21318, which included commits to RCS files with non-trunk default branches.
  • Property svn:executable set to *
Line 
1#!/bin/sh
2#
3# install - install a program, script, or datafile
4#
5# This originates from X11R5 (mit/util/scripts/install.sh), which was
6# later released in X11R6 (xc/config/util/install.sh) with the
7# following copyright and license.
8#
9# Copyright (C) 1994 X Consortium
10#
11# Permission is hereby granted, free of charge, to any person obtaining a copy
12# of this software and associated documentation files (the "Software"), to
13# deal in the Software without restriction, including without limitation the
14# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
15# sell copies of the Software, and to permit persons to whom the Software is
16# furnished to do so, subject to the following conditions:
17#
18# The above copyright notice and this permission notice shall be included in
19# all copies or substantial portions of the Software.
20#
21# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
24# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
25# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
26# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27#
28# Except as contained in this notice, the name of the X Consortium shall not
29# be used in advertising or otherwise to promote the sale, use or other deal-
30# ings in this Software without prior written authorization from the X Consor-
31# tium.
32#
33#
34# FSF changes to this file are in the public domain.
35#
36# Calling this script install-sh is preferred over install.sh, to prevent
37# `make' implicit rules from creating a file called install from it
38# when there is no Makefile.
39#
40# This script is compatible with the BSD install script, but was written
41# from scratch.  It can only install one file at a time, a restriction
42# shared with many OS's install programs.
43
44
45# set DOITPROG to echo to test this script
46
47# Don't use :- since 4.3BSD and earlier shells don't like it.
48doit="${DOITPROG-}"
49
50
51# put in absolute paths if you don't have them in your path; or use env. vars.
52
53mvprog="${MVPROG-mv}"
54cpprog="${CPPROG-cp}"
55chmodprog="${CHMODPROG-chmod}"
56chownprog="${CHOWNPROG-chown}"
57chgrpprog="${CHGRPPROG-chgrp}"
58stripprog="${STRIPPROG-strip}"
59rmprog="${RMPROG-rm}"
60mkdirprog="${MKDIRPROG-mkdir}"
61
62transformbasename=""
63transform_arg=""
64instcmd="$mvprog"
65chmodcmd="$chmodprog 0755"
66chowncmd=""
67chgrpcmd=""
68stripcmd=""
69rmcmd="$rmprog -f"
70mvcmd="$mvprog"
71src=""
72dst=""
73dir_arg=""
74
75while [ x"$1" != x ]; do
76    case $1 in
77        -c) instcmd=$cpprog
78            shift
79            continue;;
80
81        -d) dir_arg=true
82            shift
83            continue;;
84
85        -m) chmodcmd="$chmodprog $2"
86            shift
87            shift
88            continue;;
89
90        -o) chowncmd="$chownprog $2"
91            shift
92            shift
93            continue;;
94
95        -g) chgrpcmd="$chgrpprog $2"
96            shift
97            shift
98            continue;;
99
100        -s) stripcmd=$stripprog
101            shift
102            continue;;
103
104        -t=*) transformarg=`echo $1 | sed 's/-t=//'`
105            shift
106            continue;;
107
108        -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
109            shift
110            continue;;
111
112        *)  if [ x"$src" = x ]
113            then
114                src=$1
115            else
116                # this colon is to work around a 386BSD /bin/sh bug
117                :
118                dst=$1
119            fi
120            shift
121            continue;;
122    esac
123done
124
125if [ x"$src" = x ]
126then
127        echo "$0: no input file specified" >&2
128        exit 1
129else
130        :
131fi
132
133if [ x"$dir_arg" != x ]; then
134        dst=$src
135        src=""
136
137        if [ -d "$dst" ]; then
138                instcmd=:
139                chmodcmd=""
140        else
141                instcmd=$mkdirprog
142        fi
143else
144
145# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
146# might cause directories to be created, which would be especially bad
147# if $src (and thus $dsttmp) contains '*'.
148
149        if [ -f "$src" ] || [ -d "$src" ]
150        then
151                :
152        else
153                echo "$0: $src does not exist" >&2
154                exit 1
155        fi
156
157        if [ x"$dst" = x ]
158        then
159                echo "$0: no destination specified" >&2
160                exit 1
161        else
162                :
163        fi
164
165# If destination is a directory, append the input filename; if your system
166# does not like double slashes in filenames, you may need to add some logic
167
168        if [ -d "$dst" ]
169        then
170                dst=$dst/`basename "$src"`
171        else
172                :
173        fi
174fi
175
176## this sed command emulates the dirname command
177dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
178
179# Make sure that the destination directory exists.
180#  this part is taken from Noah Friedman's mkinstalldirs script
181
182# Skip lots of stat calls in the usual case.
183if [ ! -d "$dstdir" ]; then
184defaultIFS='
185        '
186IFS="${IFS-$defaultIFS}"
187
188oIFS=$IFS
189# Some sh's can't handle IFS=/ for some reason.
190IFS='%'
191set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
192IFS=$oIFS
193
194pathcomp=''
195
196while [ $# -ne 0 ] ; do
197        pathcomp=$pathcomp$1
198        shift
199
200        if [ ! -d "$pathcomp" ] ;
201        then
202                $mkdirprog "$pathcomp"
203        else
204                :
205        fi
206
207        pathcomp=$pathcomp/
208done
209fi
210
211if [ x"$dir_arg" != x ]
212then
213        $doit $instcmd "$dst" &&
214
215        if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
216        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
217        if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
218        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
219else
220
221# If we're going to rename the final executable, determine the name now.
222
223        if [ x"$transformarg" = x ]
224        then
225                dstfile=`basename "$dst"`
226        else
227                dstfile=`basename "$dst" $transformbasename |
228                        sed $transformarg`$transformbasename
229        fi
230
231# don't allow the sed command to completely eliminate the filename
232
233        if [ x"$dstfile" = x ]
234        then
235                dstfile=`basename "$dst"`
236        else
237                :
238        fi
239
240# Make a couple of temp file names in the proper directory.
241
242        dsttmp=$dstdir/_inst.$$_
243        rmtmp=$dstdir/_rm.$$_
244
245# Trap to clean up temp files at exit.
246
247        trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
248        trap '(exit $?); exit' 1 2 13 15
249
250# Move or copy the file name to the temp name
251
252        $doit $instcmd "$src" "$dsttmp" &&
253
254# and set any options; do chmod last to preserve setuid bits
255
256# If any of these fail, we abort the whole thing.  If we want to
257# ignore errors from any of these, just make sure not to ignore
258# errors from the above "$doit $instcmd $src $dsttmp" command.
259
260        if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
261        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
262        if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
263        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
264
265# Now remove or move aside any old file at destination location.  We try this
266# two ways since rm can't unlink itself on some systems and the destination
267# file might be busy for other reasons.  In this case, the final cleanup
268# might fail but the new file should still install successfully.
269
270{
271        if [ -f "$dstdir/$dstfile" ]
272        then
273                $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
274                $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
275                {
276                  echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
277                  (exit 1); exit
278                }
279        else
280                :
281        fi
282} &&
283
284# Now rename the file to the real destination.
285
286        $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
287
288fi &&
289
290# The final little trick to "correctly" pass the exit status to the exit trap.
291
292{
293        (exit 0); exit
294}
Note: See TracBrowser for help on using the repository browser.