ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/branches/8.2.x/install-sh
(Generate patch)

Comparing ircd-hybrid/branches/8.2.x/install-sh (file contents):
Revision 3377 by michael, Thu Apr 24 16:15:51 2014 UTC vs.
Revision 5394 by michael, Tue Jan 20 14:03:09 2015 UTC

# Line 1 | Line 1
1   #!/bin/sh
2   # install - install a program, script, or datafile
3  
4 < scriptversion=2011-11-20.07; # UTC
4 > scriptversion=2013-12-25.23; # UTC
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
# Line 41 | Line 41 | scriptversion=2011-11-20.07; # UTC
41   # This script is compatible with the BSD install script, but was written
42   # from scratch.
43  
44 + tab='   '
45   nl='
46   '
47 < IFS=" ""        $nl"
47 > IFS=" $tab$nl"
48  
49 < # set DOITPROG to echo to test this script
49 > # Set DOITPROG to "echo" to test this script.
50  
50 # Don't use :- since 4.3BSD and earlier shells don't like it.
51   doit=${DOITPROG-}
52 < if test -z "$doit"; then
53 <  doit_exec=exec
54 < else
55 <  doit_exec=$doit
56 < fi
52 > doit_exec=${doit:-exec}
53  
54   # Put in absolute file names if you don't have them in your path;
55   # or use environment vars.
# Line 68 | Line 64 | mvprog=${MVPROG-mv}
64   rmprog=${RMPROG-rm}
65   stripprog=${STRIPPROG-strip}
66  
71 posix_glob='?'
72 initialize_posix_glob='
73  test "$posix_glob" != "?" || {
74    if (set -f) 2>/dev/null; then
75      posix_glob=
76    else
77      posix_glob=:
78    fi
79  }
80 '
81
67   posix_mkdir=
68  
69   # Desired mode of installed file.
# Line 97 | Line 82 | dir_arg=
82   dst_arg=
83  
84   copy_on_change=false
85 < no_target_directory=
85 > is_target_a_directory=possibly
86  
87   usage="\
88   Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
# Line 137 | Line 122 | while test $# -ne 0; do
122      -d) dir_arg=true;;
123  
124      -g) chgrpcmd="$chgrpprog $2"
125 <        shift;;
125 >        shift;;
126  
127      --help) echo "$usage"; exit $?;;
128  
129      -m) mode=$2
130 <        case $mode in
131 <          *' '* | *'    '* | *'
132 < '*        | *'*'* | *'?'* | *'['*)
133 <            echo "$0: invalid mode: $mode" >&2
134 <            exit 1;;
135 <        esac
151 <        shift;;
130 >        case $mode in
131 >          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
132 >            echo "$0: invalid mode: $mode" >&2
133 >            exit 1;;
134 >        esac
135 >        shift;;
136  
137      -o) chowncmd="$chownprog $2"
138 <        shift;;
138 >        shift;;
139  
140      -s) stripcmd=$stripprog;;
141  
142 <    -t) dst_arg=$2
143 <        # Protect names problematic for 'test' and other utilities.
144 <        case $dst_arg in
145 <          -* | [=\(\)!]) dst_arg=./$dst_arg;;
146 <        esac
147 <        shift;;
142 >    -t)
143 >        is_target_a_directory=always
144 >        dst_arg=$2
145 >        # Protect names problematic for 'test' and other utilities.
146 >        case $dst_arg in
147 >          -* | [=\(\)!]) dst_arg=./$dst_arg;;
148 >        esac
149 >        shift;;
150  
151 <    -T) no_target_directory=true;;
151 >    -T) is_target_a_directory=never;;
152  
153      --version) echo "$0 $scriptversion"; exit $?;;
154  
155 <    --) shift
156 <        break;;
155 >    --) shift
156 >        break;;
157  
158 <    -*) echo "$0: invalid option: $1" >&2
159 <        exit 1;;
158 >    -*) echo "$0: invalid option: $1" >&2
159 >        exit 1;;
160  
161      *)  break;;
162    esac
163    shift
164   done
165  
166 + # We allow the use of options -d and -T together, by making -d
167 + # take the precedence; this is for compatibility with GNU install.
168 +
169 + if test -n "$dir_arg"; then
170 +  if test -n "$dst_arg"; then
171 +    echo "$0: target directory not allowed when installing a directory." >&2
172 +    exit 1
173 +  fi
174 + fi
175 +
176   if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
177    # When -d is used, all remaining arguments are directories to create.
178    # When -t is used, the destination is already specified.
# Line 208 | Line 204 | if test $# -eq 0; then
204   fi
205  
206   if test -z "$dir_arg"; then
207 +  if test $# -gt 1 || test "$is_target_a_directory" = always; then
208 +    if test ! -d "$dst_arg"; then
209 +      echo "$0: $dst_arg: Is not a directory." >&2
210 +      exit 1
211 +    fi
212 +  fi
213 + fi
214 +
215 + if test -z "$dir_arg"; then
216    do_exit='(exit $ret); exit $ret'
217    trap "ret=129; $do_exit" 1
218    trap "ret=130; $do_exit" 2
# Line 223 | Line 228 | if test -z "$dir_arg"; then
228  
229      *[0-7])
230        if test -z "$stripcmd"; then
231 <        u_plus_rw=
231 >        u_plus_rw=
232        else
233 <        u_plus_rw='% 200'
233 >        u_plus_rw='% 200'
234        fi
235        cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
236      *)
237        if test -z "$stripcmd"; then
238 <        u_plus_rw=
238 >        u_plus_rw=
239        else
240 <        u_plus_rw=,u+rw
240 >        u_plus_rw=,u+rw
241        fi
242        cp_umask=$mode$u_plus_rw;;
243    esac
# Line 269 | Line 274 | do
274      # If destination is a directory, append the input filename; won't work
275      # if double slashes aren't ignored.
276      if test -d "$dst"; then
277 <      if test -n "$no_target_directory"; then
278 <        echo "$0: $dst_arg: Is a directory" >&2
279 <        exit 1
277 >      if test "$is_target_a_directory" = never; then
278 >        echo "$0: $dst_arg: Is a directory" >&2
279 >        exit 1
280        fi
281        dstdir=$dst
282        dst=$dstdir/`basename "$src"`
283        dstdir_status=0
284      else
285 <      # Prefer dirname, but fall back on a substitute if dirname fails.
281 <      dstdir=`
282 <        (dirname "$dst") 2>/dev/null ||
283 <        expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
284 <             X"$dst" : 'X\(//\)[^/]' \| \
285 <             X"$dst" : 'X\(//\)$' \| \
286 <             X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
287 <        echo X"$dst" |
288 <            sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
289 <                   s//\1/
290 <                   q
291 <                 }
292 <                 /^X\(\/\/\)[^/].*/{
293 <                   s//\1/
294 <                   q
295 <                 }
296 <                 /^X\(\/\/\)$/{
297 <                   s//\1/
298 <                   q
299 <                 }
300 <                 /^X\(\/\).*/{
301 <                   s//\1/
302 <                   q
303 <                 }
304 <                 s/.*/./; q'
305 <      `
306 <
285 >      dstdir=`dirname "$dst"`
286        test -d "$dstdir"
287        dstdir_status=$?
288      fi
# Line 314 | Line 293 | do
293    if test $dstdir_status != 0; then
294      case $posix_mkdir in
295        '')
296 <        # Create intermediate dirs using mode 755 as modified by the umask.
297 <        # This is like FreeBSD 'install' as of 1997-10-28.
298 <        umask=`umask`
299 <        case $stripcmd.$umask in
300 <          # Optimize common cases.
301 <          *[2367][2367]) mkdir_umask=$umask;;
302 <          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
303 <
304 <          *[0-7])
305 <            mkdir_umask=`expr $umask + 22 \
306 <              - $umask % 100 % 40 + $umask % 20 \
307 <              - $umask % 10 % 4 + $umask % 2
308 <            `;;
309 <          *) mkdir_umask=$umask,go-w;;
310 <        esac
311 <
312 <        # With -d, create the new directory with the user-specified mode.
313 <        # Otherwise, rely on $mkdir_umask.
314 <        if test -n "$dir_arg"; then
315 <          mkdir_mode=-m$mode
316 <        else
317 <          mkdir_mode=
318 <        fi
319 <
320 <        posix_mkdir=false
321 <        case $umask in
322 <          *[123567][0-7][0-7])
323 <            # POSIX mkdir -p sets u+wx bits regardless of umask, which
324 <            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
325 <            ;;
326 <          *)
327 <            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
328 <            trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
329 <
330 <            if (umask $mkdir_umask &&
331 <                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
332 <            then
333 <              if test -z "$dir_arg" || {
334 <                   # Check for POSIX incompatibilities with -m.
335 <                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
336 <                   # other-writable bit of parent directory when it shouldn't.
337 <                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
338 <                   ls_ld_tmpdir=`ls -ld "$tmpdir"`
339 <                   case $ls_ld_tmpdir in
340 <                     d????-?r-*) different_mode=700;;
341 <                     d????-?--*) different_mode=755;;
342 <                     *) false;;
343 <                   esac &&
344 <                   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
345 <                     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
346 <                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
347 <                   }
348 <                 }
349 <              then posix_mkdir=:
350 <              fi
351 <              rmdir "$tmpdir/d" "$tmpdir"
352 <            else
353 <              # Remove any dirs left behind by ancient mkdir implementations.
354 <              rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
355 <            fi
356 <            trap '' 0;;
357 <        esac;;
296 >        # Create intermediate dirs using mode 755 as modified by the umask.
297 >        # This is like FreeBSD 'install' as of 1997-10-28.
298 >        umask=`umask`
299 >        case $stripcmd.$umask in
300 >          # Optimize common cases.
301 >          *[2367][2367]) mkdir_umask=$umask;;
302 >          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
303 >
304 >          *[0-7])
305 >            mkdir_umask=`expr $umask + 22 \
306 >              - $umask % 100 % 40 + $umask % 20 \
307 >              - $umask % 10 % 4 + $umask % 2
308 >            `;;
309 >          *) mkdir_umask=$umask,go-w;;
310 >        esac
311 >
312 >        # With -d, create the new directory with the user-specified mode.
313 >        # Otherwise, rely on $mkdir_umask.
314 >        if test -n "$dir_arg"; then
315 >          mkdir_mode=-m$mode
316 >        else
317 >          mkdir_mode=
318 >        fi
319 >
320 >        posix_mkdir=false
321 >        case $umask in
322 >          *[123567][0-7][0-7])
323 >            # POSIX mkdir -p sets u+wx bits regardless of umask, which
324 >            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
325 >            ;;
326 >          *)
327 >            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
328 >            trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
329 >
330 >            if (umask $mkdir_umask &&
331 >                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
332 >            then
333 >              if test -z "$dir_arg" || {
334 >                   # Check for POSIX incompatibilities with -m.
335 >                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
336 >                   # other-writable bit of parent directory when it shouldn't.
337 >                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
338 >                   ls_ld_tmpdir=`ls -ld "$tmpdir"`
339 >                   case $ls_ld_tmpdir in
340 >                     d????-?r-*) different_mode=700;;
341 >                     d????-?--*) different_mode=755;;
342 >                     *) false;;
343 >                   esac &&
344 >                   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
345 >                     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
346 >                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
347 >                   }
348 >                 }
349 >              then posix_mkdir=:
350 >              fi
351 >              rmdir "$tmpdir/d" "$tmpdir"
352 >            else
353 >              # Remove any dirs left behind by ancient mkdir implementations.
354 >              rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
355 >            fi
356 >            trap '' 0;;
357 >        esac;;
358      esac
359  
360      if
361        $posix_mkdir && (
362 <        umask $mkdir_umask &&
363 <        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
362 >        umask $mkdir_umask &&
363 >        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
364        )
365      then :
366      else
# Line 391 | Line 370 | do
370        # directory the slow way, step by step, checking for races as we go.
371  
372        case $dstdir in
373 <        /*) prefix='/';;
374 <        [-=\(\)!]*) prefix='./';;
375 <        *)  prefix='';;
373 >        /*) prefix='/';;
374 >        [-=\(\)!]*) prefix='./';;
375 >        *)  prefix='';;
376        esac
377  
399      eval "$initialize_posix_glob"
400
378        oIFS=$IFS
379        IFS=/
380 <      $posix_glob set -f
380 >      set -f
381        set fnord $dstdir
382        shift
383 <      $posix_glob set +f
383 >      set +f
384        IFS=$oIFS
385  
386        prefixes=
387  
388        for d
389        do
390 <        test X"$d" = X && continue
390 >        test X"$d" = X && continue
391  
392 <        prefix=$prefix$d
393 <        if test -d "$prefix"; then
394 <          prefixes=
395 <        else
396 <          if $posix_mkdir; then
397 <            (umask=$mkdir_umask &&
398 <             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
399 <            # Don't fail if two instances are running concurrently.
400 <            test -d "$prefix" || exit 1
401 <          else
402 <            case $prefix in
403 <              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
404 <              *) qprefix=$prefix;;
405 <            esac
406 <            prefixes="$prefixes '$qprefix'"
407 <          fi
408 <        fi
409 <        prefix=$prefix/
392 >        prefix=$prefix$d
393 >        if test -d "$prefix"; then
394 >          prefixes=
395 >        else
396 >          if $posix_mkdir; then
397 >            (umask=$mkdir_umask &&
398 >             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
399 >            # Don't fail if two instances are running concurrently.
400 >            test -d "$prefix" || exit 1
401 >          else
402 >            case $prefix in
403 >              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
404 >              *) qprefix=$prefix;;
405 >            esac
406 >            prefixes="$prefixes '$qprefix'"
407 >          fi
408 >        fi
409 >        prefix=$prefix/
410        done
411  
412        if test -n "$prefixes"; then
413 <        # Don't fail if two instances are running concurrently.
414 <        (umask $mkdir_umask &&
415 <         eval "\$doit_exec \$mkdirprog $prefixes") ||
416 <          test -d "$dstdir" || exit 1
417 <        obsolete_mkdir_used=true
413 >        # Don't fail if two instances are running concurrently.
414 >        (umask $mkdir_umask &&
415 >         eval "\$doit_exec \$mkdirprog $prefixes") ||
416 >          test -d "$dstdir" || exit 1
417 >        obsolete_mkdir_used=true
418        fi
419      fi
420    fi
# Line 472 | Line 449 | do
449  
450      # If -C, don't bother to copy if it wouldn't change the file.
451      if $copy_on_change &&
452 <       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
453 <       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
454 <
478 <       eval "$initialize_posix_glob" &&
479 <       $posix_glob set -f &&
452 >       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
453 >       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
454 >       set -f &&
455         set X $old && old=:$2:$4:$5:$6 &&
456         set X $new && new=:$2:$4:$5:$6 &&
457 <       $posix_glob set +f &&
483 <
457 >       set +f &&
458         test "$old" = "$new" &&
459         $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
460      then
# Line 493 | Line 467 | do
467        # to itself, or perhaps because mv is so ancient that it does not
468        # support -f.
469        {
470 <        # Now remove or move aside any old file at destination location.
471 <        # We try this two ways since rm can't unlink itself on some
472 <        # systems and the destination file might be busy for other
473 <        # reasons.  In this case, the final cleanup might fail but the new
474 <        # file should still install successfully.
475 <        {
476 <          test ! -f "$dst" ||
477 <          $doit $rmcmd -f "$dst" 2>/dev/null ||
478 <          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
479 <            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
480 <          } ||
481 <          { echo "$0: cannot unlink or rename $dst" >&2
482 <            (exit 1); exit 1
483 <          }
484 <        } &&
470 >        # Now remove or move aside any old file at destination location.
471 >        # We try this two ways since rm can't unlink itself on some
472 >        # systems and the destination file might be busy for other
473 >        # reasons.  In this case, the final cleanup might fail but the new
474 >        # file should still install successfully.
475 >        {
476 >          test ! -f "$dst" ||
477 >          $doit $rmcmd -f "$dst" 2>/dev/null ||
478 >          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
479 >            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
480 >          } ||
481 >          { echo "$0: cannot unlink or rename $dst" >&2
482 >            (exit 1); exit 1
483 >          }
484 >        } &&
485  
486 <        # Now rename the file to the real destination.
487 <        $doit $mvcmd "$dsttmp" "$dst"
486 >        # Now rename the file to the real destination.
487 >        $doit $mvcmd "$dsttmp" "$dst"
488        }
489      fi || exit 1
490  

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)