ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/branches/8.2.x/install-sh
Revision: 10082
Committed: Sat Jun 11 11:40:12 2022 UTC (4 years, 1 month ago) by michael
File size: 15358 byte(s)
Log Message:
- autoreconf

File Contents

# User Rev Content
1 michael 913 #!/bin/sh
2     # install - install a program, script, or datafile
3    
4 michael 10082 scriptversion=2020-11-14.01; # UTC
5 michael 913
6     # This originates from X11R5 (mit/util/scripts/install.sh), which was
7     # later released in X11R6 (xc/config/util/install.sh) with the
8     # following copyright and license.
9     #
10     # Copyright (C) 1994 X Consortium
11     #
12     # Permission is hereby granted, free of charge, to any person obtaining a copy
13     # of this software and associated documentation files (the "Software"), to
14     # deal in the Software without restriction, including without limitation the
15     # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
16     # sell copies of the Software, and to permit persons to whom the Software is
17     # furnished to do so, subject to the following conditions:
18     #
19     # The above copyright notice and this permission notice shall be included in
20     # all copies or substantial portions of the Software.
21     #
22     # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23     # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24     # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25     # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26     # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
27     # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28     #
29     # Except as contained in this notice, the name of the X Consortium shall not
30     # be used in advertising or otherwise to promote the sale, use or other deal-
31     # ings in this Software without prior written authorization from the X Consor-
32     # tium.
33     #
34     #
35     # FSF changes to this file are in the public domain.
36     #
37     # Calling this script install-sh is preferred over install.sh, to prevent
38 michael 1375 # 'make' implicit rules from creating a file called install from it
39 michael 913 # when there is no Makefile.
40     #
41     # This script is compatible with the BSD install script, but was written
42     # from scratch.
43    
44 michael 5394 tab=' '
45 michael 913 nl='
46     '
47 michael 5394 IFS=" $tab$nl"
48 michael 913
49 michael 5394 # Set DOITPROG to "echo" to test this script.
50 michael 913
51 michael 945 doit=${DOITPROG-}
52 michael 5394 doit_exec=${doit:-exec}
53 michael 913
54     # Put in absolute file names if you don't have them in your path;
55     # or use environment vars.
56    
57 michael 945 chgrpprog=${CHGRPPROG-chgrp}
58     chmodprog=${CHMODPROG-chmod}
59     chownprog=${CHOWNPROG-chown}
60     cmpprog=${CMPPROG-cmp}
61     cpprog=${CPPROG-cp}
62     mkdirprog=${MKDIRPROG-mkdir}
63     mvprog=${MVPROG-mv}
64     rmprog=${RMPROG-rm}
65     stripprog=${STRIPPROG-strip}
66 michael 913
67     posix_mkdir=
68    
69     # Desired mode of installed file.
70     mode=0755
71    
72 michael 10082 # Create dirs (including intermediate dirs) using mode 755.
73     # This is like GNU 'install' as of coreutils 8.32 (2020).
74     mkdir_umask=22
75    
76     backupsuffix=
77 michael 945 chgrpcmd=
78 michael 913 chmodcmd=$chmodprog
79     chowncmd=
80 michael 945 mvcmd=$mvprog
81     rmcmd="$rmprog -f"
82 michael 913 stripcmd=
83 michael 945
84 michael 913 src=
85     dst=
86     dir_arg=
87 michael 945 dst_arg=
88    
89     copy_on_change=false
90 michael 5394 is_target_a_directory=possibly
91 michael 913
92 michael 945 usage="\
93     Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
94 michael 913 or: $0 [OPTION]... SRCFILES... DIRECTORY
95     or: $0 [OPTION]... -t DIRECTORY SRCFILES...
96     or: $0 [OPTION]... -d DIRECTORIES...
97    
98     In the 1st form, copy SRCFILE to DSTFILE.
99     In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
100     In the 4th, create DIRECTORIES.
101    
102     Options:
103 michael 945 --help display this help and exit.
104     --version display version info and exit.
105 michael 913
106 michael 945 -c (ignored)
107 michael 10082 -C install only if different (preserve data modification time)
108 michael 945 -d create directories instead of installing files.
109     -g GROUP $chgrpprog installed files to GROUP.
110     -m MODE $chmodprog installed files to MODE.
111     -o USER $chownprog installed files to USER.
112 michael 10082 -p pass -p to $cpprog.
113 michael 945 -s $stripprog installed files.
114 michael 10082 -S SUFFIX attempt to back up existing files, with suffix SUFFIX.
115 michael 945 -t DIRECTORY install into DIRECTORY.
116     -T report an error if DSTFILE is a directory.
117    
118 michael 913 Environment variables override the default commands:
119 michael 945 CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
120     RMPROG STRIPPROG
121 michael 10082
122     By default, rm is invoked with -f; when overridden with RMPROG,
123     it's up to you to specify -f if you want it.
124    
125     If -S is not specified, no backups are attempted.
126    
127     Email bug reports to bug-automake@gnu.org.
128     Automake home page: https://www.gnu.org/software/automake/
129 michael 913 "
130    
131     while test $# -ne 0; do
132     case $1 in
133 michael 945 -c) ;;
134 michael 913
135 michael 945 -C) copy_on_change=true;;
136 michael 913
137 michael 945 -d) dir_arg=true;;
138    
139 michael 913 -g) chgrpcmd="$chgrpprog $2"
140 michael 5394 shift;;
141 michael 913
142     --help) echo "$usage"; exit $?;;
143    
144     -m) mode=$2
145 michael 5394 case $mode in
146     *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
147     echo "$0: invalid mode: $mode" >&2
148     exit 1;;
149     esac
150     shift;;
151 michael 913
152     -o) chowncmd="$chownprog $2"
153 michael 5394 shift;;
154 michael 913
155 michael 10082 -p) cpprog="$cpprog -p";;
156    
157 michael 945 -s) stripcmd=$stripprog;;
158 michael 913
159 michael 10082 -S) backupsuffix="$2"
160     shift;;
161    
162 michael 5394 -t)
163     is_target_a_directory=always
164     dst_arg=$2
165     # Protect names problematic for 'test' and other utilities.
166     case $dst_arg in
167     -* | [=\(\)!]) dst_arg=./$dst_arg;;
168     esac
169     shift;;
170 michael 913
171 michael 5394 -T) is_target_a_directory=never;;
172 michael 913
173     --version) echo "$0 $scriptversion"; exit $?;;
174    
175 michael 5394 --) shift
176     break;;
177 michael 913
178 michael 5394 -*) echo "$0: invalid option: $1" >&2
179     exit 1;;
180 michael 913
181     *) break;;
182     esac
183 michael 945 shift
184 michael 913 done
185    
186 michael 5394 # We allow the use of options -d and -T together, by making -d
187     # take the precedence; this is for compatibility with GNU install.
188    
189     if test -n "$dir_arg"; then
190     if test -n "$dst_arg"; then
191     echo "$0: target directory not allowed when installing a directory." >&2
192     exit 1
193     fi
194     fi
195    
196 michael 945 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
197 michael 913 # When -d is used, all remaining arguments are directories to create.
198     # When -t is used, the destination is already specified.
199     # Otherwise, the last argument is the destination. Remove it from $@.
200     for arg
201     do
202 michael 945 if test -n "$dst_arg"; then
203 michael 913 # $@ is not empty: it contains at least $arg.
204 michael 945 set fnord "$@" "$dst_arg"
205 michael 913 shift # fnord
206     fi
207     shift # arg
208 michael 945 dst_arg=$arg
209 michael 1375 # Protect names problematic for 'test' and other utilities.
210 michael 1257 case $dst_arg in
211     -* | [=\(\)!]) dst_arg=./$dst_arg;;
212     esac
213 michael 913 done
214     fi
215    
216     if test $# -eq 0; then
217     if test -z "$dir_arg"; then
218     echo "$0: no input file specified." >&2
219     exit 1
220     fi
221 michael 1375 # It's OK to call 'install-sh -d' without argument.
222 michael 913 # This can happen when creating conditional directories.
223     exit 0
224     fi
225    
226     if test -z "$dir_arg"; then
227 michael 5394 if test $# -gt 1 || test "$is_target_a_directory" = always; then
228     if test ! -d "$dst_arg"; then
229     echo "$0: $dst_arg: Is not a directory." >&2
230     exit 1
231     fi
232     fi
233     fi
234    
235     if test -z "$dir_arg"; then
236 michael 1094 do_exit='(exit $ret); exit $ret'
237     trap "ret=129; $do_exit" 1
238     trap "ret=130; $do_exit" 2
239     trap "ret=141; $do_exit" 13
240     trap "ret=143; $do_exit" 15
241 michael 913
242     # Set umask so as not to create temps with too-generous modes.
243     # However, 'strip' requires both read and write access to temps.
244     case $mode in
245     # Optimize common cases.
246     *644) cp_umask=133;;
247     *755) cp_umask=22;;
248    
249     *[0-7])
250     if test -z "$stripcmd"; then
251 michael 5394 u_plus_rw=
252 michael 913 else
253 michael 5394 u_plus_rw='% 200'
254 michael 913 fi
255     cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
256     *)
257     if test -z "$stripcmd"; then
258 michael 5394 u_plus_rw=
259 michael 913 else
260 michael 5394 u_plus_rw=,u+rw
261 michael 913 fi
262     cp_umask=$mode$u_plus_rw;;
263     esac
264     fi
265    
266     for src
267     do
268 michael 1375 # Protect names problematic for 'test' and other utilities.
269 michael 913 case $src in
270 michael 1257 -* | [=\(\)!]) src=./$src;;
271 michael 913 esac
272    
273     if test -n "$dir_arg"; then
274     dst=$src
275     dstdir=$dst
276     test -d "$dstdir"
277     dstdir_status=$?
278 michael 10082 # Don't chown directories that already exist.
279     if test $dstdir_status = 0; then
280     chowncmd=""
281     fi
282 michael 913 else
283    
284     # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
285     # might cause directories to be created, which would be especially bad
286     # if $src (and thus $dsttmp) contains '*'.
287     if test ! -f "$src" && test ! -d "$src"; then
288     echo "$0: $src does not exist." >&2
289     exit 1
290     fi
291    
292 michael 945 if test -z "$dst_arg"; then
293 michael 913 echo "$0: no destination specified." >&2
294     exit 1
295     fi
296 michael 945 dst=$dst_arg
297 michael 913
298 michael 8746 # If destination is a directory, append the input filename.
299 michael 913 if test -d "$dst"; then
300 michael 5394 if test "$is_target_a_directory" = never; then
301     echo "$0: $dst_arg: Is a directory" >&2
302     exit 1
303 michael 913 fi
304     dstdir=$dst
305 michael 8746 dstbase=`basename "$src"`
306     case $dst in
307     */) dst=$dst$dstbase;;
308     *) dst=$dst/$dstbase;;
309     esac
310 michael 913 dstdir_status=0
311     else
312 michael 5394 dstdir=`dirname "$dst"`
313 michael 913 test -d "$dstdir"
314     dstdir_status=$?
315     fi
316     fi
317    
318 michael 8746 case $dstdir in
319     */) dstdirslash=$dstdir;;
320     *) dstdirslash=$dstdir/;;
321     esac
322    
323 michael 913 obsolete_mkdir_used=false
324    
325     if test $dstdir_status != 0; then
326     case $posix_mkdir in
327     '')
328 michael 5394 # With -d, create the new directory with the user-specified mode.
329     # Otherwise, rely on $mkdir_umask.
330     if test -n "$dir_arg"; then
331     mkdir_mode=-m$mode
332     else
333     mkdir_mode=
334     fi
335 michael 913
336 michael 5394 posix_mkdir=false
337 michael 10082 # The $RANDOM variable is not portable (e.g., dash). Use it
338     # here however when possible just to lower collision chance.
339     tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
340 michael 913
341 michael 10082 trap '
342     ret=$?
343     rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
344     exit $ret
345     ' 0
346 michael 8746
347 michael 10082 # Because "mkdir -p" follows existing symlinks and we likely work
348     # directly in world-writeable /tmp, make sure that the '$tmpdir'
349     # directory is successfully created first before we actually test
350     # 'mkdir -p'.
351     if (umask $mkdir_umask &&
352     $mkdirprog $mkdir_mode "$tmpdir" &&
353     exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
354     then
355     if test -z "$dir_arg" || {
356     # Check for POSIX incompatibilities with -m.
357     # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
358     # other-writable bit of parent directory when it shouldn't.
359     # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
360     test_tmpdir="$tmpdir/a"
361     ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
362     case $ls_ld_tmpdir in
363     d????-?r-*) different_mode=700;;
364     d????-?--*) different_mode=755;;
365     *) false;;
366     esac &&
367     $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
368     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
369     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
370     }
371     }
372     then posix_mkdir=:
373     fi
374     rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
375     else
376     # Remove any dirs left behind by ancient mkdir implementations.
377     rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
378     fi
379     trap '' 0;;
380 michael 913 esac
381    
382     if
383     $posix_mkdir && (
384 michael 5394 umask $mkdir_umask &&
385     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
386 michael 913 )
387     then :
388     else
389    
390 michael 10082 # mkdir does not conform to POSIX,
391 michael 913 # or it failed possibly due to a race condition. Create the
392     # directory the slow way, step by step, checking for races as we go.
393    
394     case $dstdir in
395 michael 5394 /*) prefix='/';;
396     [-=\(\)!]*) prefix='./';;
397     *) prefix='';;
398 michael 913 esac
399    
400     oIFS=$IFS
401     IFS=/
402 michael 5394 set -f
403 michael 913 set fnord $dstdir
404     shift
405 michael 5394 set +f
406 michael 913 IFS=$oIFS
407    
408     prefixes=
409    
410     for d
411     do
412 michael 5394 test X"$d" = X && continue
413 michael 913
414 michael 5394 prefix=$prefix$d
415     if test -d "$prefix"; then
416     prefixes=
417     else
418     if $posix_mkdir; then
419 michael 10082 (umask $mkdir_umask &&
420 michael 5394 $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
421     # Don't fail if two instances are running concurrently.
422     test -d "$prefix" || exit 1
423     else
424     case $prefix in
425     *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
426     *) qprefix=$prefix;;
427     esac
428     prefixes="$prefixes '$qprefix'"
429     fi
430     fi
431     prefix=$prefix/
432 michael 913 done
433    
434     if test -n "$prefixes"; then
435 michael 5394 # Don't fail if two instances are running concurrently.
436     (umask $mkdir_umask &&
437     eval "\$doit_exec \$mkdirprog $prefixes") ||
438     test -d "$dstdir" || exit 1
439     obsolete_mkdir_used=true
440 michael 913 fi
441     fi
442     fi
443    
444     if test -n "$dir_arg"; then
445     { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
446     { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
447     { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
448     test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
449     else
450    
451     # Make a couple of temp file names in the proper directory.
452 michael 8746 dsttmp=${dstdirslash}_inst.$$_
453     rmtmp=${dstdirslash}_rm.$$_
454 michael 913
455     # Trap to clean up those temp files at exit.
456     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
457    
458     # Copy the file name to the temp name.
459 michael 10082 (umask $cp_umask &&
460     { test -z "$stripcmd" || {
461     # Create $dsttmp read-write so that cp doesn't create it read-only,
462     # which would cause strip to fail.
463     if test -z "$doit"; then
464     : >"$dsttmp" # No need to fork-exec 'touch'.
465     else
466     $doit touch "$dsttmp"
467     fi
468     }
469     } &&
470     $doit_exec $cpprog "$src" "$dsttmp") &&
471 michael 913
472     # and set any options; do chmod last to preserve setuid bits.
473     #
474     # If any of these fail, we abort the whole thing. If we want to
475     # ignore errors from any of these, just make sure not to ignore
476     # errors from the above "$doit $cpprog $src $dsttmp" command.
477     #
478 michael 945 { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
479     { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
480     { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
481     { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
482 michael 913
483 michael 945 # If -C, don't bother to copy if it wouldn't change the file.
484     if $copy_on_change &&
485 michael 5394 old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
486     new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
487     set -f &&
488 michael 945 set X $old && old=:$2:$4:$5:$6 &&
489     set X $new && new=:$2:$4:$5:$6 &&
490 michael 5394 set +f &&
491 michael 945 test "$old" = "$new" &&
492     $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
493     then
494     rm -f "$dsttmp"
495     else
496 michael 10082 # If $backupsuffix is set, and the file being installed
497     # already exists, attempt a backup. Don't worry if it fails,
498     # e.g., if mv doesn't support -f.
499     if test -n "$backupsuffix" && test -f "$dst"; then
500     $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
501     fi
502    
503 michael 945 # Rename the file to the real destination.
504     $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
505 michael 913
506 michael 945 # The rename failed, perhaps because mv can't rename something else
507     # to itself, or perhaps because mv is so ancient that it does not
508     # support -f.
509     {
510 michael 5394 # Now remove or move aside any old file at destination location.
511     # We try this two ways since rm can't unlink itself on some
512     # systems and the destination file might be busy for other
513     # reasons. In this case, the final cleanup might fail but the new
514     # file should still install successfully.
515     {
516     test ! -f "$dst" ||
517 michael 10082 $doit $rmcmd "$dst" 2>/dev/null ||
518 michael 5394 { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
519 michael 10082 { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
520 michael 5394 } ||
521     { echo "$0: cannot unlink or rename $dst" >&2
522     (exit 1); exit 1
523     }
524     } &&
525 michael 945
526 michael 5394 # Now rename the file to the real destination.
527     $doit $mvcmd "$dsttmp" "$dst"
528 michael 945 }
529     fi || exit 1
530    
531 michael 913 trap '' 0
532     fi
533     done
534    
535     # Local variables:
536 michael 8746 # eval: (add-hook 'before-save-hook 'time-stamp)
537 michael 913 # time-stamp-start: "scriptversion="
538     # time-stamp-format: "%:y-%02m-%02d.%02H"
539 michael 8316 # time-stamp-time-zone: "UTC0"
540 michael 945 # time-stamp-end: "; # UTC"
541 michael 913 # End:

Properties

Name Value
svn:eol-style native
svn:executable *