1#!/bin/sh
2#
3# $NetBSD: install-sh,v 1.2 2009/06/30 02:44:52 agc Exp $
4# This script now also installs multiple files, but might choke on installing
5# multiple files with spaces in the file names.
6#
7# install - install a program, script, or datafile
8# This comes from X11R5 (mit/util/scripts/install.sh).
9#
10# Copyright 1991 by the Massachusetts Institute of Technology
11#
12# Permission to use, copy, modify, distribute, and sell this software and its
13# documentation for any purpose is hereby granted without fee, provided that
14# the above copyright notice appear in all copies and that both that
15# copyright notice and this permission notice appear in supporting
16# documentation, and that the name of M.I.T. not be used in advertising or
17# publicity pertaining to distribution of the software without specific,
18# written prior permission.  M.I.T. makes no representations about the
19# suitability of this software for any purpose.  It is provided "as is"
20# without express or implied warranty.
21#
22# Calling this script install-sh is preferred over install.sh, to prevent
23# `make' implicit rules from creating a file called install from it
24# when there is no Makefile.
25#
26# This script is compatible with the BSD install script, but was written
27# from scratch.
28
29# set DOITPROG to echo to test this script
30
31# Don't use :- since 4.3BSD and earlier shells don't like it.
32doit="${DOITPROG-}"
33
34
35# put in absolute paths if you don't have them in your path; or use env. vars.
36
37awkprog="${AWKPROG-awk}"
38mvprog="${MVPROG-mv}"
39cpprog="${CPPROG-cp}"
40chmodprog="${CHMODPROG-chmod}"
41chownprog="${CHOWNPROG-chown}"
42chgrpprog="${CHGRPPROG-chgrp}"
43stripprog="${STRIPPROG-strip}"
44rmprog="${RMPROG-rm}"
45mkdirprog="${MKDIRPROG-mkdir}"
46
47instcmd="$mvprog"
48pathcompchmodcmd="$chmodprog 755"
49chmodcmd="$chmodprog 755"
50chowncmd=""
51chgrpcmd=""
52stripcmd=""
53stripflags=""
54rmcmd="$rmprog -f"
55mvcmd="$mvprog"
56src=""
57msrc=""
58dst=""
59dir_arg=""
60suffix=""
61suffixfmt=""
62
63while [ x"$1" != x ]; do
64    case $1 in
65          -b) suffix=".old"
66              shift
67              continue;;
68
69          -B) suffixfmt="$2"
70              shift
71              shift
72              continue;;
73
74          -c) instcmd="$cpprog"
75              shift
76              continue;;
77
78          -d) dir_arg=true
79              shift
80              continue;;
81
82          -m) chmodcmd="$chmodprog $2"
83              shift
84              shift
85              continue;;
86
87          -o) chowncmd="$chownprog $2"
88              shift
89              shift
90              continue;;
91
92          -g) chgrpcmd="$chgrpprog $2"
93              shift
94              shift
95              continue;;
96
97          -s) stripcmd="$stripprog"
98              shift
99              continue;;
100
101          -S) stripcmd="$stripprog"
102              stripflags="-S $2 $stripflags"
103              shift
104              shift
105              continue;;
106
107          *)  if [ x"$msrc" = x ]
108              then
109                    msrc="$dst"
110              else
111                    msrc="$msrc $dst"
112              fi
113              src="$dst"
114              dst="$1"
115              shift
116              continue;;
117    esac
118done
119
120if [ x"$dir_arg" = x ]
121then
122          dstisfile=""
123          if [ ! -d "$dst" ]
124          then
125                    if [ x"$msrc" = x"$src" ]
126                    then
127                              dstisfile=true
128                    else
129                              echo "install: destination is not a directory"
130                              exit 1
131                    fi
132          fi
133else
134          msrc="$msrc $dst"
135fi
136
137if [ x"$msrc" = x ]
138then
139          echo "install: no destination specified"
140          exit 1
141fi
142
143for srcarg in $msrc; do
144
145if [ x"$dir_arg" != x ]; then
146
147          dstarg="$srcarg"
148else
149          dstarg="$dst"
150
151# Waiting for this to be detected by the "$instcmd $srcarg $dsttmp" command
152# might cause directories to be created, which would be especially bad
153# if $src (and thus $dsttmp) contains '*'.
154
155          if [ -f "$srcarg" ]
156          then
157                    doinst="$instcmd"
158          elif [ -d "$srcarg" ]
159          then
160                    echo "install: $srcarg: not a regular file"
161                    exit 1
162          elif [ "$srcarg" = "/dev/null" ]
163          then
164                    doinst="$cpprog"
165          else
166                    echo "install:  $srcarg does not exist"
167                    exit 1
168          fi
169
170# If destination is a directory, append the input filename; if your system
171# does not like double slashes in filenames, you may need to add some logic
172
173          if [ -d "$dstarg" ]
174          then
175                    dstarg="$dstarg"/`basename "$srcarg"`
176          fi
177fi
178
179## this sed command emulates the dirname command
180dstdir=`echo "$dstarg" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
181
182# Make sure that the destination directory exists.
183#  this part is taken from Noah Friedman's mkinstalldirs script
184
185# Skip lots of stat calls in the usual case.
186if [ ! -d "$dstdir" ]; then
187defaultIFS='
188'
189IFS="${IFS-${defaultIFS}}"
190
191oIFS="${IFS}"
192# Some sh's can't handle IFS=/ for some reason.
193IFS='%'
194set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
195IFS="${oIFS}"
196
197pathcomp=''
198
199while [ $# -ne 0 ] ; do
200          pathcomp="${pathcomp}${1}"
201          shift
202
203          if [ ! -d "${pathcomp}" ] ;
204        then
205                    $doit $mkdirprog "${pathcomp}"
206          if [ x"$chowncmd" != x ]; then $doit $chowncmd "${pathcomp}"; else true ; fi &&
207          if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "${pathcomp}"; else true ; fi &&
208          if [ x"$pathcompchmodcmd" != x ]; then $doit $pathcompchmodcmd "${pathcomp}"; else true ; fi
209
210          else
211                    true
212          fi
213
214          pathcomp="${pathcomp}/"
215done
216fi
217
218          if [ x"$dir_arg" != x ]
219          then
220                    if [ -d "$dstarg" ]; then
221                              true
222                    else
223                              $doit $mkdirprog "$dstarg" &&
224
225                              if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dstarg"; else true ; fi &&
226                              if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dstarg"; else true ; fi &&
227                              if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dstarg"; else true ; fi
228                    fi
229          else
230
231                    if [ x"$dstisfile" = x ]
232                    then
233                              file=$srcarg
234                    else
235                              file=$dst
236                    fi
237
238                    dstfile=`basename "$file"`
239                    dstfinal="$dstdir/$dstfile"
240
241# Make a temp file name in the proper directory.
242
243                    dsttmp=$dstdir/#inst.$$#
244
245# Make a backup file name in the proper directory.
246                    case x$suffixfmt in
247                    *%*)      suffix=`echo x |
248                              $awkprog -v bname="$dstfinal" -v fmt="$suffixfmt" '
249                              { cnt = 0;
250                                do {
251                                        sfx = sprintf(fmt, cnt++);
252                                        name = bname sfx;
253                                } while (system("test -f " name) == 0);
254                                print sfx; }' -`;;
255                    x)        ;;
256                    *)        suffix="$suffixfmt";;
257                    esac
258                    dstbackup="$dstfinal$suffix"
259
260# Move or copy the file name to the temp name
261
262                    $doit $doinst $srcarg "$dsttmp" &&
263
264                    trap "rm -f ${dsttmp}" 0 &&
265
266# and set any options; do chmod last to preserve setuid bits
267
268# If any of these fail, we abort the whole thing.  If we want to
269# ignore errors from any of these, just make sure not to ignore
270# errors from the above "$doit $instcmd $src $dsttmp" command.
271
272                    if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else true;fi &&
273                    if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else true;fi &&
274                    if [ x"$stripcmd" != x ]; then $doit $stripcmd $stripflags "$dsttmp"; else true;fi &&
275                    if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else true;fi &&
276
277# Now rename the file to the real destination.
278
279                    if [ x"$suffix" != x ] && [ -f "$dstfinal" ]
280                    then
281                              $doit $mvcmd "$dstfinal" "$dstbackup"
282                    else
283                              $doit $rmcmd -f "$dstfinal"
284                    fi &&
285                    $doit $mvcmd "$dsttmp" "$dstfinal"
286          fi
287
288done &&
289
290
291exit 0
292