]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/file/install-sh
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / file / install-sh
1 #!/bin/sh
2 #
3 # $NetBSD: install-sh.in,v 1.5 2010/10/08 19:57:05 tez 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.
32 doit="${DOITPROG-}"
33
34
35 # put in absolute paths if you don't have them in your path; or use env. vars.
36
37 awkprog="${AWKPROG-awk}"
38 mvprog="${MVPROG-mv}"
39 cpprog="${CPPROG-cp}"
40 chmodprog="${CHMODPROG-chmod}"
41 chownprog="${CHOWNPROG-chown}"
42 chgrpprog="${CHGRPPROG-chgrp}"
43 stripprog="${STRIPPROG-strip}"
44 rmprog="${RMPROG-rm}"
45 mkdirprog="${MKDIRPROG-mkdir}"
46
47 instcmd="$cpprog"
48 pathcompchmodcmd="$chmodprog 755"
49 chmodcmd="$chmodprog 755"
50 chowncmd=""
51 chgrpcmd=""
52 stripcmd=""
53 stripflags=""
54 rmcmd="$rmprog -f"
55 mvcmd="$mvprog"
56 src=""
57 msrc=""
58 dst=""
59 dir_arg=""
60 suffix=""
61 suffixfmt=""
62
63 while [ 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
118 done
119
120 if [ x"$dir_arg" = x ]
121 then
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
133 else
134         msrc="$msrc $dst"
135 fi
136
137 if [ x"$msrc" = x ]
138 then
139         echo "install: no destination specified"
140         exit 1
141 fi      
142
143 for srcarg in $msrc; do
144
145 if [ x"$dir_arg" != x ]; then
146
147         dstarg="$srcarg"
148 else
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
177 fi
178
179 ## this sed command emulates the dirname command
180 dstdir=`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.
186 if [ ! -d "$dstdir" ]; then
187 defaultIFS='    
188 '
189 IFS="${IFS-${defaultIFS}}"
190
191 oIFS="${IFS}"
192 # Some sh's can't handle IFS=/ for some reason.
193 IFS='%'
194 set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
195 IFS="${oIFS}"
196
197 pathcomp=''
198
199 while [ $# -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}/"
215 done
216 fi
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
288 done &&
289
290
291 exit 0