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

Comparing:
ircd-hybrid-7.2/install-sh (file contents), Revision 913 by michael, Wed Nov 7 23:20:12 2007 UTC vs.
ircd-hybrid/trunk/install-sh (file contents), Revision 1592 by michael, Sat Oct 27 21:02:32 2012 UTC

# Line 1 | Line 1
1   #!/bin/sh
2   # install - install a program, script, or datafile
3  
4 < scriptversion=2006-10-14.15
4 > scriptversion=2011-11-20.07; # 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 35 | Line 35 | scriptversion=2006-10-14.15
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
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
# Line 48 | Line 48 | IFS=" ""       $nl"
48   # set DOITPROG to echo to test this script
49  
50   # Don't use :- since 4.3BSD and earlier shells don't like it.
51 < doit="${DOITPROG-}"
51 > doit=${DOITPROG-}
52   if test -z "$doit"; then
53    doit_exec=exec
54   else
# Line 58 | Line 58 | fi
58   # Put in absolute file names if you don't have them in your path;
59   # or use environment vars.
60  
61 < mvprog="${MVPROG-mv}"
62 < cpprog="${CPPROG-cp}"
63 < chmodprog="${CHMODPROG-chmod}"
64 < chownprog="${CHOWNPROG-chown}"
65 < chgrpprog="${CHGRPPROG-chgrp}"
66 < stripprog="${STRIPPROG-strip}"
67 < rmprog="${RMPROG-rm}"
68 < mkdirprog="${MKDIRPROG-mkdir}"
61 > chgrpprog=${CHGRPPROG-chgrp}
62 > chmodprog=${CHMODPROG-chmod}
63 > chownprog=${CHOWNPROG-chown}
64 > cmpprog=${CMPPROG-cmp}
65 > cpprog=${CPPROG-cp}
66 > mkdirprog=${MKDIRPROG-mkdir}
67 > mvprog=${MVPROG-mv}
68 > rmprog=${RMPROG-rm}
69 > stripprog=${STRIPPROG-strip}
70 >
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  
70 posix_glob=
82   posix_mkdir=
83  
84   # Desired mode of installed file.
85   mode=0755
86  
87 + chgrpcmd=
88   chmodcmd=$chmodprog
89   chowncmd=
90 < chgrpcmd=
79 < stripcmd=
90 > mvcmd=$mvprog
91   rmcmd="$rmprog -f"
92 < mvcmd="$mvprog"
92 > stripcmd=
93 >
94   src=
95   dst=
96   dir_arg=
97 < dstarg=
97 > dst_arg=
98 >
99 > copy_on_change=false
100   no_target_directory=
101  
102 < usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
102 > usage="\
103 > Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
104     or: $0 [OPTION]... SRCFILES... DIRECTORY
105     or: $0 [OPTION]... -t DIRECTORY SRCFILES...
106     or: $0 [OPTION]... -d DIRECTORIES...
# Line 95 | Line 110 | In the 2nd and 3rd, copy all SRCFILES to
110   In the 4th, create DIRECTORIES.
111  
112   Options:
113 < -c         (ignored)
114 < -d         create directories instead of installing files.
115 < -g GROUP   $chgrpprog installed files to GROUP.
116 < -m MODE    $chmodprog installed files to MODE.
117 < -o USER    $chownprog installed files to USER.
118 < -s         $stripprog installed files.
119 < -t DIRECTORY  install into DIRECTORY.
120 < -T         report an error if DSTFILE is a directory.
121 < --help     display this help and exit.
122 < --version  display version info and exit.
113 >     --help     display this help and exit.
114 >     --version  display version info and exit.
115 >
116 >  -c            (ignored)
117 >  -C            install only if different (preserve the last data modification time)
118 >  -d            create directories instead of installing files.
119 >  -g GROUP      $chgrpprog installed files to GROUP.
120 >  -m MODE       $chmodprog installed files to MODE.
121 >  -o USER       $chownprog installed files to USER.
122 >  -s            $stripprog installed files.
123 >  -t DIRECTORY  install into DIRECTORY.
124 >  -T            report an error if DSTFILE is a directory.
125  
126   Environment variables override the default commands:
127 <  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
127 >  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
128 >  RMPROG STRIPPROG
129   "
130  
131   while test $# -ne 0; do
132    case $1 in
133 <    -c) shift
134 <        continue;;
133 >    -c) ;;
134 >
135 >    -C) copy_on_change=true;;
136  
137 <    -d) dir_arg=true
119 <        shift
120 <        continue;;
137 >    -d) dir_arg=true;;
138  
139      -g) chgrpcmd="$chgrpprog $2"
140 <        shift
124 <        shift
125 <        continue;;
140 >        shift;;
141  
142      --help) echo "$usage"; exit $?;;
143  
144      -m) mode=$2
130        shift
131        shift
145          case $mode in
146            *' '* | *'    '* | *'
147   '*        | *'*'* | *'?'* | *'['*)
148              echo "$0: invalid mode: $mode" >&2
149              exit 1;;
150          esac
151 <        continue;;
151 >        shift;;
152  
153      -o) chowncmd="$chownprog $2"
154 <        shift
155 <        shift
156 <        continue;;
157 <
158 <    -s) stripcmd=$stripprog
159 <        shift
160 <        continue;;
161 <
162 <    -t) dstarg=$2
163 <        shift
164 <        shift
165 <        continue;;
153 <
154 <    -T) no_target_directory=true
155 <        shift
156 <        continue;;
154 >        shift;;
155 >
156 >    -s) stripcmd=$stripprog;;
157 >
158 >    -t) dst_arg=$2
159 >        # Protect names problematic for 'test' and other utilities.
160 >        case $dst_arg in
161 >          -* | [=\(\)!]) dst_arg=./$dst_arg;;
162 >        esac
163 >        shift;;
164 >
165 >    -T) no_target_directory=true;;
166  
167      --version) echo "$0 $scriptversion"; exit $?;;
168  
# Line 165 | Line 174 | while test $# -ne 0; do
174  
175      *)  break;;
176    esac
177 +  shift
178   done
179  
180 < if test $# -ne 0 && test -z "$dir_arg$dstarg"; then
180 > if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
181    # When -d is used, all remaining arguments are directories to create.
182    # When -t is used, the destination is already specified.
183    # Otherwise, the last argument is the destination.  Remove it from $@.
184    for arg
185    do
186 <    if test -n "$dstarg"; then
186 >    if test -n "$dst_arg"; then
187        # $@ is not empty: it contains at least $arg.
188 <      set fnord "$@" "$dstarg"
188 >      set fnord "$@" "$dst_arg"
189        shift # fnord
190      fi
191      shift # arg
192 <    dstarg=$arg
192 >    dst_arg=$arg
193 >    # Protect names problematic for 'test' and other utilities.
194 >    case $dst_arg in
195 >      -* | [=\(\)!]) dst_arg=./$dst_arg;;
196 >    esac
197    done
198   fi
199  
# Line 188 | Line 202 | if test $# -eq 0; then
202      echo "$0: no input file specified." >&2
203      exit 1
204    fi
205 <  # It's OK to call `install-sh -d' without argument.
205 >  # It's OK to call 'install-sh -d' without argument.
206    # This can happen when creating conditional directories.
207    exit 0
208   fi
209  
210   if test -z "$dir_arg"; then
211 <  trap '(exit $?); exit' 1 2 13 15
211 >  do_exit='(exit $ret); exit $ret'
212 >  trap "ret=129; $do_exit" 1
213 >  trap "ret=130; $do_exit" 2
214 >  trap "ret=141; $do_exit" 13
215 >  trap "ret=143; $do_exit" 15
216  
217    # Set umask so as not to create temps with too-generous modes.
218    # However, 'strip' requires both read and write access to temps.
# Line 222 | Line 240 | fi
240  
241   for src
242   do
243 <  # Protect names starting with `-'.
243 >  # Protect names problematic for 'test' and other utilities.
244    case $src in
245 <    -*) src=./$src ;;
245 >    -* | [=\(\)!]) src=./$src;;
246    esac
247  
248    if test -n "$dir_arg"; then
# Line 242 | Line 260 | do
260        exit 1
261      fi
262  
263 <    if test -z "$dstarg"; then
263 >    if test -z "$dst_arg"; then
264        echo "$0: no destination specified." >&2
265        exit 1
266      fi
267 <
250 <    dst=$dstarg
251 <    # Protect names starting with `-'.
252 <    case $dst in
253 <      -*) dst=./$dst ;;
254 <    esac
267 >    dst=$dst_arg
268  
269      # If destination is a directory, append the input filename; won't work
270      # if double slashes aren't ignored.
271      if test -d "$dst"; then
272        if test -n "$no_target_directory"; then
273 <        echo "$0: $dstarg: Is a directory" >&2
273 >        echo "$0: $dst_arg: Is a directory" >&2
274          exit 1
275        fi
276        dstdir=$dst
# Line 341 | Line 354 | do
354                if test -z "$dir_arg" || {
355                     # Check for POSIX incompatibilities with -m.
356                     # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
357 <                   # other-writeable bit of parent directory when it shouldn't.
357 >                   # other-writable bit of parent directory when it shouldn't.
358                     # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
359                     ls_ld_tmpdir=`ls -ld "$tmpdir"`
360                     case $ls_ld_tmpdir in
# Line 378 | Line 391 | do
391        # directory the slow way, step by step, checking for races as we go.
392  
393        case $dstdir in
394 <        /*) prefix=/ ;;
395 <        -*) prefix=./ ;;
396 <        *)  prefix= ;;
394 >        /*) prefix='/';;
395 >        [-=\(\)!]*) prefix='./';;
396 >        *)  prefix='';;
397        esac
398  
399 <      case $posix_glob in
387 <        '')
388 <          if (set -f) 2>/dev/null; then
389 <            posix_glob=true
390 <          else
391 <            posix_glob=false
392 <          fi ;;
393 <      esac
399 >      eval "$initialize_posix_glob"
400  
401        oIFS=$IFS
402        IFS=/
403 <      $posix_glob && set -f
403 >      $posix_glob set -f
404        set fnord $dstdir
405        shift
406 <      $posix_glob && set +f
406 >      $posix_glob set +f
407        IFS=$oIFS
408  
409        prefixes=
410  
411        for d
412        do
413 <        test -z "$d" && continue
413 >        test X"$d" = X && continue
414  
415          prefix=$prefix$d
416          if test -d "$prefix"; then
# Line 459 | Line 465 | do
465      # ignore errors from any of these, just make sure not to ignore
466      # errors from the above "$doit $cpprog $src $dsttmp" command.
467      #
468 <    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
469 <      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
470 <      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
471 <      && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
472 <
473 <    # Now rename the file to the real destination.
474 <    { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \
475 <      || {
476 <           # The rename failed, perhaps because mv can't rename something else
477 <           # to itself, or perhaps because mv is so ancient that it does not
478 <           # support -f.
479 <
480 <           # Now remove or move aside any old file at destination location.
481 <           # We try this two ways since rm can't unlink itself on some
482 <           # systems and the destination file might be busy for other
483 <           # reasons.  In this case, the final cleanup might fail but the new
484 <           # file should still install successfully.
485 <           {
486 <             if test -f "$dst"; then
487 <               $doit $rmcmd -f "$dst" 2>/dev/null \
488 <               || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \
489 <                     && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\
490 <               || {
491 <                 echo "$0: cannot unlink or rename $dst" >&2
492 <                 (exit 1); exit 1
493 <               }
494 <             else
495 <               :
496 <             fi
497 <           } &&
498 <
499 <           # Now rename the file to the real destination.
500 <           $doit $mvcmd "$dsttmp" "$dst"
501 <         }
502 <    } || exit 1
468 >    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
469 >    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
470 >    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
471 >    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
472 >
473 >    # If -C, don't bother to copy if it wouldn't change the file.
474 >    if $copy_on_change &&
475 >       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
476 >       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
477 >
478 >       eval "$initialize_posix_glob" &&
479 >       $posix_glob set -f &&
480 >       set X $old && old=:$2:$4:$5:$6 &&
481 >       set X $new && new=:$2:$4:$5:$6 &&
482 >       $posix_glob set +f &&
483 >
484 >       test "$old" = "$new" &&
485 >       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
486 >    then
487 >      rm -f "$dsttmp"
488 >    else
489 >      # Rename the file to the real destination.
490 >      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
491 >
492 >      # The rename failed, perhaps because mv can't rename something else
493 >      # to itself, or perhaps because mv is so ancient that it does not
494 >      # support -f.
495 >      {
496 >        # Now remove or move aside any old file at destination location.
497 >        # We try this two ways since rm can't unlink itself on some
498 >        # systems and the destination file might be busy for other
499 >        # reasons.  In this case, the final cleanup might fail but the new
500 >        # file should still install successfully.
501 >        {
502 >          test ! -f "$dst" ||
503 >          $doit $rmcmd -f "$dst" 2>/dev/null ||
504 >          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
505 >            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
506 >          } ||
507 >          { echo "$0: cannot unlink or rename $dst" >&2
508 >            (exit 1); exit 1
509 >          }
510 >        } &&
511 >
512 >        # Now rename the file to the real destination.
513 >        $doit $mvcmd "$dsttmp" "$dst"
514 >      }
515 >    fi || exit 1
516  
517      trap '' 0
518    fi
# Line 503 | Line 522 | done
522   # eval: (add-hook 'write-file-hooks 'time-stamp)
523   # time-stamp-start: "scriptversion="
524   # time-stamp-format: "%:y-%02m-%02d.%02H"
525 < # time-stamp-end: "$"
525 > # time-stamp-time-zone: "UTC"
526 > # time-stamp-end: "; # UTC"
527   # End:

Diff Legend

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