]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blame - include/install-sh
xfs: fix off-by-one error in xfs_rtalloc_query_range
[thirdparty/xfsprogs-dev.git] / include / install-sh
CommitLineData
f6a20170 1#! /bin/bash
fc49813f 2#
0d3e0b37 3# Copyright (c) 2000-2001 Silicon Graphics, Inc. All Rights Reserved.
fc49813f
NS
4#
5# This script emulates bsd install and also recognises
6# two environment variables, with the following semantics :-
7#
8# $DIST_MANIFEST - if set, the name of the file to append manifest
9# information in the following format:
10# File : f mode owner group src target
11# Directory: d mode owner group target
12# Symlink : l linkval target
13#
14# $DIST_ROOT - if set, prepend to target
15#
16# The sematics of all combinations of these two variables
17# are as follows:
18#
19# $DIST_MANIFEST? $DIST_ROOT? | Copy? Append Manifest?
20# -----------------------------+--------------------------
21# not set not set | yes no
22# not set set | yes no
23# set not set | no yes
24# set set | yes yes
da23017d 25#
fc49813f
NS
26_usage() {
27 echo "Usage: $prog [-o owner] [-g group] [-m mode] -d directory"
28 echo "or $prog [-D] [-o owner] [-g group] [-m mode] file directory/file"
29 echo "or $prog [-o owner] [-g group] [-m mode] file [file ...] directory"
30 echo "or $prog -S file target (creates \"target\" symlink)"
c3a5f8f8 31 echo "or $prog -T lt_arg [-o owner] [-g group] [-m mode] libtool.lai directory"
fc49813f
NS
32 echo ""
33 echo "The \$DIST_MANIFEST and \$DIST_ROOT environment variables affect the"
34 echo "behaviour of this command - see comments in the script."
35 echo "The -D flag is only available for the second usage, and causes"
36 echo "the target directory to be created before installing the file."
37 echo ""
38 exit 1
39}
40
41_chown ()
42{
43 _st=255
44 if [ $# -eq 3 ] ; then
45 chown $1:$2 $3
46 _st=$?
47 if [ $_st -ne 0 ] ; then
48 if [ $REAL_UID != '0' ] ; then
c3a5f8f8 49 if [ ! -f $DIST_ROOT/.chown.quiet ] ; then
fc49813f
NS
50 echo '==============================================='
51 echo Ownership of files under ${DIST_ROOT:-/}
52 echo cannot be changed
53 echo '==============================================='
54 if [ -n "$DIST_ROOT" ] ; then
c3a5f8f8 55 touch $DIST_ROOT/.chown.quiet
fc49813f
NS
56 fi
57 fi
58 _st=0
f8149110 59 fi
fc49813f
NS
60 fi
61 fi
62
63 return $_st
64}
65
66
67_manifest ()
f8149110 68{
fc49813f
NS
69 echo $* | sed -e 's/\/\//\//g' >>${DIST_MANIFEST:-/dev/null}
70}
71
72prog=`basename $0`
73HERE=`pwd`
74dflag=false
75Dflag=false
76Sflag=false
c3a5f8f8 77Tflag=false
fc49813f
NS
78DIRMODE=755
79FILEMODE=644
80OWNER=`id -u`
81GROUP=`id -g`
82REAL_UID=$OWNER
83
84# default is to install and don't append manifest
85INSTALL=true
86MANIFEST=:
87
6e6aa9c2
MF
88: ${DIST_ROOT:=${DESTDIR}}
89
fc49813f
NS
90[ -n "$DIST_MANIFEST" -a -z "$DIST_ROOT" ] && INSTALL=false
91[ -n "$DIST_MANIFEST" ] && MANIFEST="_manifest"
92
93[ $# -eq 0 ] && _usage
94
95if $INSTALL
96then
97 CP=cp; LN=ln; MKDIR=mkdir; CHMOD=chmod; CHOWN=_chown
98else
99 CP=true; LN=true; MKDIR=true; CHMOD=true; CHOWN=true
100fi
101
102[ -n "$DIST_ROOT" -a $REAL_UID -ne 0 ] && CHOWN=true
103
c3a5f8f8 104while getopts "Dcm:d:S:o:g:T:" c $*
fc49813f
NS
105do
106 case $c in
107 c)
108 ;;
109 g)
110 GROUP=$OPTARG
111 ;;
112 o)
113 OWNER=$OPTARG
114 ;;
115 m)
116 DIRMODE=`expr $OPTARG`
117 FILEMODE=$DIRMODE
118 ;;
f8149110 119 D)
fc49813f
NS
120 Dflag=true
121 ;;
f8149110 122 S)
fc49813f
NS
123 symlink=$OPTARG
124 Sflag=true
125 ;;
f8149110 126 d)
fc49813f
NS
127 dir=$DIST_ROOT/$OPTARG
128 dflag=true
129 ;;
c3a5f8f8
NS
130 T)
131 lt_install=$OPTARG
132 Tflag=true
133 ;;
fc49813f
NS
134 *)
135 _usage
136 ;;
137 esac
138done
139
140shift `expr $OPTIND - 1`
141
142status=0
143if $dflag
144then
145 #
146 # first usage
147 #
f8149110 148 $MKDIR -p $dir
fc49813f
NS
149 status=$?
150 if [ $status -eq 0 ]
151 then
152 $CHMOD $DIRMODE $dir
153 status=$?
154 fi
155 if [ $status -eq 0 ]
156 then
157 $CHOWN $OWNER $GROUP $dir
158 status=$?
159 fi
160 $MANIFEST d $DIRMODE $OWNER $GROUP ${dir#$DIST_ROOT}
161elif $Sflag
162then
163 #
164 # fourth usage (symlink)
165 #
166 if [ $# -ne 1 ]
167 then
c3a5f8f8 168 _usage
fc49813f 169 else
c3a5f8f8 170 target=$DIST_ROOT/$1
fc49813f
NS
171 fi
172 $LN -s -f $symlink $target
173 status=$?
f8149110 174 $MANIFEST l $symlink ${target#$DIST_ROOT}
c3a5f8f8
NS
175elif $Tflag
176then
177 #
178 # -T (install libs built by libtool)
179 #
180 if [ $# -ne 2 ]
181 then
182 _usage
183 else
184 libtool_lai=$1
185 # source the libtool variables
186 if [ ! -f $libtool_lai ]
187 then
188 echo "$prog: Unable to find libtool library file $libtool_lai"
189 exit 2
190 fi
76d78074 191 . ./$libtool_lai
c3a5f8f8
NS
192 target=$DIST_ROOT/$2
193 fi
194 case $lt_install in
195 so_dot_version)
196 # Loop until we find libfoo.so.x.y.z, then break out.
197 for solib in $library_names
198 do
199 # does it have enough parts? libfoo.so.x.y.z == 5
200 cnt=`echo "$solib" | sed -e 's/\./ /g' | wc -w`
201 if [ $cnt -eq 5 ]
202 then
203 install_name=$target/$solib
204 $CP $solib $install_name
205 status=$?
206 $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$solib ${install_name#$DIST_ROOT}
207 break
208 fi
209 done
210 ;;
211
212 so_*)
213 case $lt_install in
214 so_dot_current)
215 # ln -s libfoo.so.x.y.z to libfoo.so.x
216 from_parts=5 # libfoo.so.x.y.z
217 to_parts=3 # libfoo.so.x
218 ;;
219 so_base)
220 # ln -s libfoo.so.x to libfoo.so
221 from_parts=3 # libfoo.so.x
222 to_parts=2 # libfoo.so
223 ;;
224 *)
225 echo "$prog: -T $lt_install invalid"
226 exit 2
227 ;;
228 esac
229
230 # Loop until we find the names, then break out.
231 for solib in $library_names
232 do
233 # does it have enough parts?
234 cnt=`echo "$solib" | sed -e 's/\./ /g' | wc -w`
235 if [ $cnt -eq $from_parts ]
236 then
237 from_name=$solib
238 elif [ $cnt -eq $to_parts ]
239 then
240 to_name=$solib
241 fi
242
243 if [ -n "$from_name" ] && [ -n "$to_name" ]
244 then
245 install_name=$target/$to_name
246 $LN -s -f $from_name $install_name
247 status=$?
248 $MANIFEST l $from_name ${install_name#$DIST_ROOT}
249 break
250 fi
251 done
252 ;;
253 old_lib)
254 install_name=$target/$old_library
255 $CP $old_library $install_name
256 status=$?
257 $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$old_library ${install_name#$DIST_ROOT}
258 ;;
259 *)
260 echo "$prog: -T $lt_install invalid"
261 exit 2
262 ;;
263 esac
264
265 case $lt_install in
266 old_lib|so_dot_version)
267 if [ $status -eq 0 ]
268 then
269 $CHMOD $FILEMODE $install_name
270 $CHOWN $OWNER $GROUP $install_name
271 fi
272 ;;
273 esac
274
fc49813f
NS
275else
276 list=""
277 dir=""
278 if [ $# -eq 2 ]
279 then
280 #
281 # second usage
282 #
283 f=$1
284 dir=$DIST_ROOT/$2
285 if $Dflag
286 then
287 mkdir -p `dirname $dir`
288 fi
289 $CP $f $dir
290 status=$?
291 if [ $status -eq 0 ]
f8149110 292 then
fc49813f
NS
293 if [ -f $dir/$f ]
294 then
295 $CHMOD $FILEMODE $dir/$f
296 status=$?
297 if [ $status -eq 0 ]
298 then
299 $CHOWN $OWNER $GROUP $dir/$f
300 status=$?
301 fi
302 $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f
c3a5f8f8 303 else
fc49813f
NS
304 $CHMOD $FILEMODE $dir
305 status=$?
306 if [ $status -eq 0 ]
307 then
308 $CHOWN $OWNER $GROUP $dir
309 status=$?
310 fi
311 $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$dir ${dir#$DIST_ROOT}
312 fi
313 fi
314 else
315 #
316 # third usage
317 #
318 n=1
319 while [ $# -gt 0 ]
320 do
321 if [ $# -gt 1 ]
322 then
323 list="$list $1"
324 else
325 dir=$DIST_ROOT/$1
326 fi
327 shift
328 done
329
330 # echo DIR=$dir list=\"$list\"
331 for f in $list
332 do
333 $CP $f $dir
334 status=$?
335 if [ $status -eq 0 ]
336 then
337 $CHMOD $FILEMODE $dir/$f
338 status=$?
339 if [ $status -eq 0 ]
340 then
341 $CHOWN $OWNER $GROUP $dir/$f
342 status=$?
343 fi
344 $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f
345 fi
346 [ $status -ne 0 ] && break
347 done
348 fi
349fi
350
351exit $status