annotate install-sh @ 359:a3e674fade6c

From Jeffrey Morlan: pst_parse_block misreads Table Contexts (aka "type 2") with a multi-block Row Matrix ("ind2"). Rows are never split between blocks - every block except the last has padding at the end which should be ignored. I've only seen this affect the recipients table, but presumably it could affect attachments too. This was causing out-of-bounds memory ranges to be returned from pst_getBlockOffset and later access; patch fixes both the table reading issue and adds a missing bounds check to pst_getBlockOffset (so as not to risk a segfault if the PST is corrupted).
author Carl Byington <carl@five-ten-sg.com>
date Wed, 06 Jul 2016 10:20:12 -0700
parents ec7e344e0dfb
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
1 #!/bin/sh
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
2 # install - install a program, script, or datafile
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
3
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
4 scriptversion=2004-09-10.20
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
5
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
6 # This originates from X11R5 (mit/util/scripts/install.sh), which was
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
7 # later released in X11R6 (xc/config/util/install.sh) with the
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
8 # following copyright and license.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
9 #
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
10 # Copyright (C) 1994 X Consortium
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
11 #
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
12 # Permission is hereby granted, free of charge, to any person obtaining a copy
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
13 # of this software and associated documentation files (the "Software"), to
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
14 # deal in the Software without restriction, including without limitation the
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
15 # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
16 # sell copies of the Software, and to permit persons to whom the Software is
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
17 # furnished to do so, subject to the following conditions:
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
18 #
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
19 # The above copyright notice and this permission notice shall be included in
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
20 # all copies or substantial portions of the Software.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
21 #
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
22 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
23 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
24 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
25 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
26 # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
27 # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
28 #
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
29 # Except as contained in this notice, the name of the X Consortium shall not
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
30 # be used in advertising or otherwise to promote the sale, use or other deal-
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
31 # ings in this Software without prior written authorization from the X Consor-
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
32 # tium.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
33 #
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
34 #
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
35 # FSF changes to this file are in the public domain.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
36 #
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
37 # Calling this script install-sh is preferred over install.sh, to prevent
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
38 # `make' implicit rules from creating a file called install from it
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
39 # when there is no Makefile.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
40 #
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
41 # This script is compatible with the BSD install script, but was written
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
42 # from scratch. It can only install one file at a time, a restriction
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
43 # shared with many OS's install programs.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
44
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
45 # set DOITPROG to echo to test this script
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
46
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
47 # Don't use :- since 4.3BSD and earlier shells don't like it.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
48 doit="${DOITPROG-}"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
49
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
50 # put in absolute paths if you don't have them in your path; or use env. vars.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
51
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
52 mvprog="${MVPROG-mv}"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
53 cpprog="${CPPROG-cp}"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
54 chmodprog="${CHMODPROG-chmod}"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
55 chownprog="${CHOWNPROG-chown}"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
56 chgrpprog="${CHGRPPROG-chgrp}"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
57 stripprog="${STRIPPROG-strip}"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
58 rmprog="${RMPROG-rm}"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
59 mkdirprog="${MKDIRPROG-mkdir}"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
60
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
61 chmodcmd="$chmodprog 0755"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
62 chowncmd=
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
63 chgrpcmd=
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
64 stripcmd=
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
65 rmcmd="$rmprog -f"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
66 mvcmd="$mvprog"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
67 src=
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
68 dst=
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
69 dir_arg=
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
70 dstarg=
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
71 no_target_directory=
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
72
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
73 usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
74 or: $0 [OPTION]... SRCFILES... DIRECTORY
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
75 or: $0 [OPTION]... -t DIRECTORY SRCFILES...
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
76 or: $0 [OPTION]... -d DIRECTORIES...
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
77
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
78 In the 1st form, copy SRCFILE to DSTFILE.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
79 In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
80 In the 4th, create DIRECTORIES.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
81
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
82 Options:
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
83 -c (ignored)
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
84 -d create directories instead of installing files.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
85 -g GROUP $chgrpprog installed files to GROUP.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
86 -m MODE $chmodprog installed files to MODE.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
87 -o USER $chownprog installed files to USER.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
88 -s $stripprog installed files.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
89 -t DIRECTORY install into DIRECTORY.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
90 -T report an error if DSTFILE is a directory.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
91 --help display this help and exit.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
92 --version display version info and exit.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
93
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
94 Environment variables override the default commands:
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
95 CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
96 "
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
97
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
98 while test -n "$1"; do
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
99 case $1 in
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
100 -c) shift
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
101 continue;;
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
102
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
103 -d) dir_arg=true
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
104 shift
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
105 continue;;
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
106
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
107 -g) chgrpcmd="$chgrpprog $2"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
108 shift
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
109 shift
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
110 continue;;
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
111
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
112 --help) echo "$usage"; exit 0;;
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
113
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
114 -m) chmodcmd="$chmodprog $2"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
115 shift
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
116 shift
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
117 continue;;
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
118
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
119 -o) chowncmd="$chownprog $2"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
120 shift
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
121 shift
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
122 continue;;
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
123
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
124 -s) stripcmd=$stripprog
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
125 shift
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
126 continue;;
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
127
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
128 -t) dstarg=$2
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
129 shift
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
130 shift
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
131 continue;;
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
132
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
133 -T) no_target_directory=true
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
134 shift
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
135 continue;;
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
136
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
137 --version) echo "$0 $scriptversion"; exit 0;;
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
138
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
139 *) # When -d is used, all remaining arguments are directories to create.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
140 # When -t is used, the destination is already specified.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
141 test -n "$dir_arg$dstarg" && break
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
142 # Otherwise, the last argument is the destination. Remove it from $@.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
143 for arg
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
144 do
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
145 if test -n "$dstarg"; then
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
146 # $@ is not empty: it contains at least $arg.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
147 set fnord "$@" "$dstarg"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
148 shift # fnord
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
149 fi
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
150 shift # arg
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
151 dstarg=$arg
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
152 done
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
153 break;;
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
154 esac
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
155 done
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
156
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
157 if test -z "$1"; then
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
158 if test -z "$dir_arg"; then
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
159 echo "$0: no input file specified." >&2
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
160 exit 1
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
161 fi
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
162 # It's OK to call `install-sh -d' without argument.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
163 # This can happen when creating conditional directories.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
164 exit 0
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
165 fi
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
166
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
167 for src
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
168 do
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
169 # Protect names starting with `-'.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
170 case $src in
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
171 -*) src=./$src ;;
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
172 esac
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
173
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
174 if test -n "$dir_arg"; then
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
175 dst=$src
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
176 src=
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
177
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
178 if test -d "$dst"; then
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
179 mkdircmd=:
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
180 chmodcmd=
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
181 else
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
182 mkdircmd=$mkdirprog
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
183 fi
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
184 else
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
185 # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
186 # might cause directories to be created, which would be especially bad
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
187 # if $src (and thus $dsttmp) contains '*'.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
188 if test ! -f "$src" && test ! -d "$src"; then
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
189 echo "$0: $src does not exist." >&2
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
190 exit 1
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
191 fi
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
192
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
193 if test -z "$dstarg"; then
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
194 echo "$0: no destination specified." >&2
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
195 exit 1
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
196 fi
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
197
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
198 dst=$dstarg
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
199 # Protect names starting with `-'.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
200 case $dst in
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
201 -*) dst=./$dst ;;
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
202 esac
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
203
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
204 # If destination is a directory, append the input filename; won't work
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
205 # if double slashes aren't ignored.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
206 if test -d "$dst"; then
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
207 if test -n "$no_target_directory"; then
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
208 echo "$0: $dstarg: Is a directory" >&2
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
209 exit 1
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
210 fi
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
211 dst=$dst/`basename "$src"`
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
212 fi
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
213 fi
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
214
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
215 # This sed command emulates the dirname command.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
216 dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
217
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
218 # Make sure that the destination directory exists.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
219
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
220 # Skip lots of stat calls in the usual case.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
221 if test ! -d "$dstdir"; then
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
222 defaultIFS='
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
223 '
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
224 IFS="${IFS-$defaultIFS}"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
225
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
226 oIFS=$IFS
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
227 # Some sh's can't handle IFS=/ for some reason.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
228 IFS='%'
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
229 set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
230 IFS=$oIFS
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
231
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
232 pathcomp=
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
233
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
234 while test $# -ne 0 ; do
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
235 pathcomp=$pathcomp$1
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
236 shift
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
237 if test ! -d "$pathcomp"; then
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
238 $mkdirprog "$pathcomp"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
239 # mkdir can fail with a `File exist' error in case several
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
240 # install-sh are creating the directory concurrently. This
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
241 # is OK.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
242 test -d "$pathcomp" || exit
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
243 fi
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
244 pathcomp=$pathcomp/
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
245 done
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
246 fi
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
247
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
248 if test -n "$dir_arg"; then
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
249 $doit $mkdircmd "$dst" \
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
250 && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
251 && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
252 && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
253 && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
254
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
255 else
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
256 dstfile=`basename "$dst"`
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
257
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
258 # Make a couple of temp file names in the proper directory.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
259 dsttmp=$dstdir/_inst.$$_
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
260 rmtmp=$dstdir/_rm.$$_
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
261
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
262 # Trap to clean up those temp files at exit.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
263 trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
264 trap '(exit $?); exit' 1 2 13 15
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
265
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
266 # Copy the file name to the temp name.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
267 $doit $cpprog "$src" "$dsttmp" &&
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
268
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
269 # and set any options; do chmod last to preserve setuid bits.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
270 #
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
271 # If any of these fail, we abort the whole thing. If we want to
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
272 # ignore errors from any of these, just make sure not to ignore
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
273 # errors from the above "$doit $cpprog $src $dsttmp" command.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
274 #
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
275 { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
276 && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
277 && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
278 && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
279
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
280 # Now rename the file to the real destination.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
281 { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
282 || {
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
283 # The rename failed, perhaps because mv can't rename something else
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
284 # to itself, or perhaps because mv is so ancient that it does not
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
285 # support -f.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
286
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
287 # Now remove or move aside any old file at destination location.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
288 # We try this two ways since rm can't unlink itself on some
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
289 # systems and the destination file might be busy for other
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
290 # reasons. In this case, the final cleanup might fail but the new
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
291 # file should still install successfully.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
292 {
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
293 if test -f "$dstdir/$dstfile"; then
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
294 $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
295 || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
296 || {
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
297 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
298 (exit 1); exit
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
299 }
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
300 else
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
301 :
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
302 fi
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
303 } &&
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
304
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
305 # Now rename the file to the real destination.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
306 $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
307 }
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
308 }
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
309 fi || { (exit 1); exit; }
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
310 done
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
311
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
312 # The final little trick to "correctly" pass the exit status to the exit trap.
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
313 {
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
314 (exit 0); exit
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
315 }
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
316
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
317 # Local variables:
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
318 # eval: (add-hook 'write-file-hooks 'time-stamp)
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
319 # time-stamp-start: "scriptversion="
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
320 # time-stamp-format: "%:y-%02m-%02d.%02H"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
321 # time-stamp-end: "$"
ec7e344e0dfb switch to automake/autoconf
carl
parents:
diff changeset
322 # End: