~ubuntu-branches/ubuntu/hardy/freeradius/hardy-proposed

« back to all changes in this revision

Viewing changes to libltdl/install-sh

  • Committer: Bazaar Package Importer
  • Author(s): Mark Hymers
  • Date: 2006-12-16 20:45:11 UTC
  • mfrom: (3.1.10 feisty)
  • Revision ID: james.westby@ubuntu.com-20061216204511-3pbbsu4s8jtehsor
Tags: 1.1.3-3
Fix POSIX compliance problem in init script.  Closes: #403384. 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/bin/sh
 
2
# install - install a program, script, or datafile
 
3
 
 
4
scriptversion=2005-11-07.23
 
5
 
 
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
# `make' implicit rules from creating a file called install from it
 
39
# when there is no Makefile.
 
40
#
 
41
# This script is compatible with the BSD install script, but was written
 
42
# from scratch.  It can only install one file at a time, a restriction
 
43
# shared with many OS's install programs.
 
44
 
 
45
# set DOITPROG to echo to test this script
 
46
 
 
47
# Don't use :- since 4.3BSD and earlier shells don't like it.
 
48
doit="${DOITPROG-}"
 
49
 
 
50
# put in absolute paths if you don't have them in your path; or use env. vars.
 
51
 
 
52
mvprog="${MVPROG-mv}"
 
53
cpprog="${CPPROG-cp}"
 
54
chmodprog="${CHMODPROG-chmod}"
 
55
chownprog="${CHOWNPROG-chown}"
 
56
chgrpprog="${CHGRPPROG-chgrp}"
 
57
stripprog="${STRIPPROG-strip}"
 
58
rmprog="${RMPROG-rm}"
 
59
mkdirprog="${MKDIRPROG-mkdir}"
 
60
 
 
61
posix_glob=
 
62
posix_mkdir=
 
63
 
 
64
# Symbolic mode for testing mkdir with directories.
 
65
# It is the same as 755, but also tests that "u+" works.
 
66
test_mode=u=rwx,g=rx,o=rx,u+wx
 
67
 
 
68
# Desired mode of installed file.
 
69
mode=0755
 
70
 
 
71
# Desired mode of newly created intermediate directories.
 
72
# It is empty if not known yet.
 
73
intermediate_mode=
 
74
 
 
75
chmodcmd=$chmodprog
 
76
chowncmd=
 
77
chgrpcmd=
 
78
stripcmd=
 
79
rmcmd="$rmprog -f"
 
80
mvcmd="$mvprog"
 
81
src=
 
82
dst=
 
83
dir_arg=
 
84
dstarg=
 
85
no_target_directory=
 
86
 
 
87
usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
 
88
   or: $0 [OPTION]... SRCFILES... DIRECTORY
 
89
   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
 
90
   or: $0 [OPTION]... -d DIRECTORIES...
 
91
 
 
92
In the 1st form, copy SRCFILE to DSTFILE.
 
93
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
 
94
In the 4th, create DIRECTORIES.
 
95
 
 
96
Options:
 
97
-c         (ignored)
 
98
-d         create directories instead of installing files.
 
99
-g GROUP   $chgrpprog installed files to GROUP.
 
100
-m MODE    $chmodprog installed files to MODE.
 
101
-o USER    $chownprog installed files to USER.
 
102
-s         $stripprog installed files.
 
103
-t DIRECTORY  install into DIRECTORY.
 
104
-T         report an error if DSTFILE is a directory.
 
105
--help     display this help and exit.
 
106
--version  display version info and exit.
 
107
 
 
108
Environment variables override the default commands:
 
109
  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
 
110
"
 
111
 
 
112
while test -n "$1"; do
 
113
  case $1 in
 
114
    -c) shift
 
115
        continue;;
 
116
 
 
117
    -d) dir_arg=true
 
118
        shift
 
119
        continue;;
 
120
 
 
121
    -g) chgrpcmd="$chgrpprog $2"
 
122
        shift
 
123
        shift
 
124
        continue;;
 
125
 
 
126
    --help) echo "$usage"; exit $?;;
 
127
 
 
128
    -m) mode=$2
 
129
        shift
 
130
        shift
 
131
        continue;;
 
132
 
 
133
    -o) chowncmd="$chownprog $2"
 
134
        shift
 
135
        shift
 
136
        continue;;
 
137
 
 
138
    -s) stripcmd=$stripprog
 
139
        shift
 
140
        continue;;
 
141
 
 
142
    -t) dstarg=$2
 
143
        shift
 
144
        shift
 
145
        continue;;
 
146
 
 
147
    -T) no_target_directory=true
 
148
        shift
 
149
        continue;;
 
150
 
 
151
    --version) echo "$0 $scriptversion"; exit $?;;
 
152
 
 
153
    *)  # When -d is used, all remaining arguments are directories to create.
 
154
        # When -t is used, the destination is already specified.
 
155
        test -n "$dir_arg$dstarg" && break
 
156
        # Otherwise, the last argument is the destination.  Remove it from $@.
 
157
        for arg
 
158
        do
 
159
          if test -n "$dstarg"; then
 
160
            # $@ is not empty: it contains at least $arg.
 
161
            set fnord "$@" "$dstarg"
 
162
            shift # fnord
 
163
          fi
 
164
          shift # arg
 
165
          dstarg=$arg
 
166
        done
 
167
        break;;
 
168
  esac
 
169
done
 
170
 
 
171
if test -z "$1"; then
 
172
  if test -z "$dir_arg"; then
 
173
    echo "$0: no input file specified." >&2
 
174
    exit 1
 
175
  fi
 
176
  # It's OK to call `install-sh -d' without argument.
 
177
  # This can happen when creating conditional directories.
 
178
  exit 0
 
179
fi
 
180
 
 
181
test -n "$dir_arg" || trap '(exit $?); exit' 1 2 13 15
 
182
 
 
183
for src
 
184
do
 
185
  # Protect names starting with `-'.
 
186
  case $src in
 
187
    -*) src=./$src ;;
 
188
  esac
 
189
 
 
190
  if test -n "$dir_arg"; then
 
191
    dst=$src
 
192
    dstdir=$dst
 
193
    test -d "$dstdir"
 
194
    dstdir_status=$?
 
195
  else
 
196
 
 
197
    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
 
198
    # might cause directories to be created, which would be especially bad
 
199
    # if $src (and thus $dsttmp) contains '*'.
 
200
    if test ! -f "$src" && test ! -d "$src"; then
 
201
      echo "$0: $src does not exist." >&2
 
202
      exit 1
 
203
    fi
 
204
 
 
205
    if test -z "$dstarg"; then
 
206
      echo "$0: no destination specified." >&2
 
207
      exit 1
 
208
    fi
 
209
 
 
210
    dst=$dstarg
 
211
    # Protect names starting with `-'.
 
212
    case $dst in
 
213
      -*) dst=./$dst ;;
 
214
    esac
 
215
 
 
216
    # If destination is a directory, append the input filename; won't work
 
217
    # if double slashes aren't ignored.
 
218
    if test -d "$dst"; then
 
219
      if test -n "$no_target_directory"; then
 
220
        echo "$0: $dstarg: Is a directory" >&2
 
221
        exit 1
 
222
      fi
 
223
      dstdir=$dst
 
224
      dst=$dstdir/`basename "$src"`
 
225
      dstdir_status=0
 
226
    else
 
227
      # Prefer dirname, but fall back on a substitute if dirname fails.
 
228
      dstdir=`
 
229
        (dirname "$dst") 2>/dev/null ||
 
230
        expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 
231
             X"$dst" : 'X\(//\)[^/]' \| \
 
232
             X"$dst" : 'X\(//\)$' \| \
 
233
             X"$dst" : 'X\(/\)' \| \
 
234
             .       : '\(.\)' 2>/dev/null ||
 
235
        echo X"$dst" |
 
236
            sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
 
237
                  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
 
238
                  /^X\(\/\/\)$/{ s//\1/; q; }
 
239
                  /^X\(\/\).*/{ s//\1/; q; }
 
240
                  s/.*/./; q'
 
241
      `
 
242
 
 
243
      test -d "$dstdir"
 
244
      dstdir_status=$?
 
245
    fi
 
246
  fi
 
247
 
 
248
  obsolete_mkdir_used=false
 
249
 
 
250
  if test $dstdir_status != 0; then
 
251
    case $posix_mkdir in
 
252
      '')
 
253
        posix_mkdir=false
 
254
        if $mkdirprog -m $test_mode -p -- / >/dev/null 2>&1; then
 
255
          posix_mkdir=true
 
256
        else
 
257
          # Remove any dirs left behind by ancient mkdir implementations.
 
258
          rmdir ./-m "$test_mode" ./-p ./-- 2>/dev/null
 
259
        fi ;;
 
260
    esac
 
261
 
 
262
    if
 
263
      $posix_mkdir && {
 
264
 
 
265
        # With -d, create the new directory with the user-specified mode.
 
266
        # Otherwise, create it using the same intermediate mode that
 
267
        # mkdir -p would use when creating intermediate directories.
 
268
        # POSIX says that this mode is "$(umask -S),u+wx", so use that
 
269
        # if umask -S works.
 
270
 
 
271
        if test -n "$dir_arg"; then
 
272
          mkdir_mode=$mode
 
273
        else
 
274
          case $intermediate_mode in
 
275
            '')
 
276
              if umask_S=`(umask -S) 2>/dev/null`; then
 
277
                intermediate_mode=$umask_S,u+wx
 
278
              else
 
279
                intermediate_mode=$test_mode
 
280
              fi ;;
 
281
          esac
 
282
          mkdir_mode=$intermediate_mode
 
283
        fi
 
284
 
 
285
        $mkdirprog -m "$mkdir_mode" -p -- "$dstdir"
 
286
      }
 
287
    then :
 
288
    else
 
289
 
 
290
      # mkdir does not conform to POSIX, or it failed possibly due to
 
291
      # a race condition.  Create the directory the slow way, step by
 
292
      # step, checking for races as we go.
 
293
 
 
294
      case $dstdir in
 
295
        /*) pathcomp=/ ;;
 
296
        -*) pathcomp=./ ;;
 
297
        *)  pathcomp= ;;
 
298
      esac
 
299
 
 
300
      case $posix_glob in
 
301
        '')
 
302
          if (set -f) 2>/dev/null; then
 
303
            posix_glob=true
 
304
          else
 
305
            posix_glob=false
 
306
          fi ;;
 
307
      esac
 
308
 
 
309
      oIFS=$IFS
 
310
      IFS=/
 
311
      $posix_glob && set -f
 
312
      set fnord $dstdir
 
313
      shift
 
314
      $posix_glob && set +f
 
315
      IFS=$oIFS
 
316
 
 
317
      for d
 
318
      do
 
319
        test "x$d" = x && continue
 
320
 
 
321
        pathcomp=$pathcomp$d
 
322
        if test ! -d "$pathcomp"; then
 
323
          $mkdirprog "$pathcomp"
 
324
          # Don't fail if two instances are running concurrently.
 
325
          test -d "$pathcomp" || exit 1
 
326
        fi
 
327
        pathcomp=$pathcomp/
 
328
      done
 
329
      obsolete_mkdir_used=true
 
330
    fi
 
331
  fi
 
332
 
 
333
  if test -n "$dir_arg"; then
 
334
    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
 
335
    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
 
336
    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
 
337
      test -z "$chmodcmd" || $doit $chmodcmd "$mode" "$dst"; } || exit 1
 
338
  else
 
339
 
 
340
    # Make a couple of temp file names in the proper directory.
 
341
    dsttmp=$dstdir/_inst.$$_
 
342
    rmtmp=$dstdir/_rm.$$_
 
343
 
 
344
    # Trap to clean up those temp files at exit.
 
345
    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
 
346
 
 
347
    # Copy the file name to the temp name.
 
348
    $doit $cpprog "$src" "$dsttmp" &&
 
349
 
 
350
    # and set any options; do chmod last to preserve setuid bits.
 
351
    #
 
352
    # If any of these fail, we abort the whole thing.  If we want to
 
353
    # ignore errors from any of these, just make sure not to ignore
 
354
    # errors from the above "$doit $cpprog $src $dsttmp" command.
 
355
    #
 
356
    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
 
357
      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
 
358
      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
 
359
      && { test -z "$chmodcmd" || $doit $chmodcmd "$mode" "$dsttmp"; } &&
 
360
 
 
361
    # Now rename the file to the real destination.
 
362
    { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \
 
363
      || {
 
364
           # The rename failed, perhaps because mv can't rename something else
 
365
           # to itself, or perhaps because mv is so ancient that it does not
 
366
           # support -f.
 
367
 
 
368
           # Now remove or move aside any old file at destination location.
 
369
           # We try this two ways since rm can't unlink itself on some
 
370
           # systems and the destination file might be busy for other
 
371
           # reasons.  In this case, the final cleanup might fail but the new
 
372
           # file should still install successfully.
 
373
           {
 
374
             if test -f "$dst"; then
 
375
               $doit $rmcmd -f "$dst" 2>/dev/null \
 
376
               || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \
 
377
                     && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\
 
378
               || {
 
379
                 echo "$0: cannot unlink or rename $dst" >&2
 
380
                 (exit 1); exit 1
 
381
               }
 
382
             else
 
383
               :
 
384
             fi
 
385
           } &&
 
386
 
 
387
           # Now rename the file to the real destination.
 
388
           $doit $mvcmd "$dsttmp" "$dst"
 
389
         }
 
390
    } || exit 1
 
391
 
 
392
    trap '' 0
 
393
  fi
 
394
done
 
395
 
 
396
# Local variables:
 
397
# eval: (add-hook 'write-file-hooks 'time-stamp)
 
398
# time-stamp-start: "scriptversion="
 
399
# time-stamp-format: "%:y-%02m-%02d.%02H"
 
400
# time-stamp-end: "$"
 
401
# End: