/[LeafOK_CVS]/lbbs/install-sh
ViewVC logotype

Diff of /lbbs/install-sh

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.1 by sysadm, Mon Oct 11 10:28:03 2004 UTC Revision 1.2 by sysadm, Sun May 4 09:41:37 2025 UTC
# Line 1  Line 1 
1  #!/bin/sh  #!/bin/sh
 #  
2  # install - install a program, script, or datafile  # install - install a program, script, or datafile
3  # This comes from X11R5 (mit/util/scripts/install.sh).  
4    scriptversion=2020-11-14.01; # 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
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  # Copyright 1991 by the Massachusetts Institute of Technology  # 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  # Permission to use, copy, modify, distribute, and sell this software and its  #
35  # documentation for any purpose is hereby granted without fee, provided that  # FSF changes to this file are in the public domain.
 # the above copyright notice appear in all copies and that both that  
 # copyright notice and this permission notice appear in supporting  
 # documentation, and that the name of M.I.T. not be used in advertising or  
 # publicity pertaining to distribution of the software without specific,  
 # written prior permission.  M.I.T. makes no representations about the  
 # suitability of this software for any purpose.  It is provided "as is"  
 # without express or implied warranty.  
36  #  #
37  # Calling this script install-sh is preferred over install.sh, to prevent  # Calling this script install-sh is preferred over install.sh, to prevent
38  # `make' implicit rules from creating a file called install from it  # 'make' implicit rules from creating a file called install from it
39  # when there is no Makefile.  # when there is no Makefile.
40  #  #
41  # This script is compatible with the BSD install script, but was written  # 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  # from scratch.
 # shared with many OS's install programs.  
43    
44    tab='   '
45    nl='
46    '
47    IFS=" $tab$nl"
48    
49    # Set DOITPROG to "echo" to test this script.
50    
51    doit=${DOITPROG-}
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.
56    
57    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    
67    posix_mkdir=
68    
69    # Desired mode of installed file.
70    mode=0755
71    
72    # 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    chgrpcmd=
78    chmodcmd=$chmodprog
79    chowncmd=
80    mvcmd=$mvprog
81    rmcmd="$rmprog -f"
82    stripcmd=
83    
84  # set DOITPROG to echo to test this script  src=
85    dst=
86    dir_arg=
87    dst_arg=
88    
89  # Don't use :- since 4.3BSD and earlier shells don't like it.  copy_on_change=false
90  doit="${DOITPROG-}"  is_target_a_directory=possibly
91    
92    usage="\
93    Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
94       or: $0 [OPTION]... SRCFILES... DIRECTORY
95       or: $0 [OPTION]... -t DIRECTORY SRCFILES...
96       or: $0 [OPTION]... -d DIRECTORIES...
97    
98  # put in absolute paths if you don't have them in your path; or use env. vars.  In the 1st form, copy SRCFILE to DSTFILE.
99    In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
100  mvprog="${MVPROG-mv}"  In the 4th, create DIRECTORIES.
 cpprog="${CPPROG-cp}"  
 chmodprog="${CHMODPROG-chmod}"  
 chownprog="${CHOWNPROG-chown}"  
 chgrpprog="${CHGRPPROG-chgrp}"  
 stripprog="${STRIPPROG-strip}"  
 rmprog="${RMPROG-rm}"  
 mkdirprog="${MKDIRPROG-mkdir}"  
   
 transformbasename=""  
 transform_arg=""  
 instcmd="$mvprog"  
 chmodcmd="$chmodprog 0755"  
 chowncmd=""  
 chgrpcmd=""  
 stripcmd=""  
 rmcmd="$rmprog -f"  
 mvcmd="$mvprog"  
 src=""  
 dst=""  
 dir_arg=""  
   
 while [ x"$1" != x ]; do  
     case $1 in  
         -c) instcmd="$cpprog"  
             shift  
             continue;;  
   
         -d) dir_arg=true  
             shift  
             continue;;  
   
         -m) chmodcmd="$chmodprog $2"  
             shift  
             shift  
             continue;;  
   
         -o) chowncmd="$chownprog $2"  
             shift  
             shift  
             continue;;  
   
         -g) chgrpcmd="$chgrpprog $2"  
             shift  
             shift  
             continue;;  
   
         -s) stripcmd="$stripprog"  
             shift  
             continue;;  
   
         -t=*) transformarg=`echo $1 | sed 's/-t=//'`  
             shift  
             continue;;  
   
         -b=*) transformbasename=`echo $1 | sed 's/-b=//'`  
             shift  
             continue;;  
   
         *)  if [ x"$src" = x ]  
             then  
                 src=$1  
             else  
                 # this colon is to work around a 386BSD /bin/sh bug  
                 :  
                 dst=$1  
             fi  
             shift  
             continue;;  
     esac  
 done  
101    
102  if [ x"$src" = x ]  Options:
103  then       --help     display this help and exit.
104          echo "install:  no input file specified"       --version  display version info and exit.
         exit 1  
 else  
         :  
 fi  
105    
106  if [ x"$dir_arg" != x ]; then    -c            (ignored)
107          dst=$src    -C            install only if different (preserve data modification time)
108          src=""    -d            create directories instead of installing files.
109              -g GROUP      $chgrpprog installed files to GROUP.
110          if [ -d $dst ]; then    -m MODE       $chmodprog installed files to MODE.
111                  instcmd=:    -o USER       $chownprog installed files to USER.
112                  chmodcmd=""    -p            pass -p to $cpprog.
113          else    -s            $stripprog installed files.
114                  instcmd=$mkdirprog    -S SUFFIX     attempt to back up existing files, with suffix SUFFIX.
115          fi    -t DIRECTORY  install into DIRECTORY.
116  else    -T            report an error if DSTFILE is a directory.
117    
118  # Waiting for this to be detected by the "$instcmd $src $dsttmp" command  Environment variables override the default commands:
119  # might cause directories to be created, which would be especially bad    CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
120  # if $src (and thus $dsttmp) contains '*'.    RMPROG STRIPPROG
121    
122          if [ -f "$src" ] || [ -d "$src" ]  By default, rm is invoked with -f; when overridden with RMPROG,
123          then  it's up to you to specify -f if you want it.
                 :  
         else  
                 echo "install:  $src does not exist"  
                 exit 1  
         fi  
           
         if [ x"$dst" = x ]  
         then  
                 echo "install:  no destination specified"  
                 exit 1  
         else  
                 :  
         fi  
124    
125  # If destination is a directory, append the input filename; if your system  If -S is not specified, no backups are attempted.
 # does not like double slashes in filenames, you may need to add some logic  
126    
127          if [ -d $dst ]  Email bug reports to bug-automake@gnu.org.
128          then  Automake home page: https://www.gnu.org/software/automake/
129                  dst="$dst"/`basename $src`  "
         else  
                 :  
         fi  
 fi  
130    
131  ## this sed command emulates the dirname command  while test $# -ne 0; do
132  dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`    case $1 in
133        -c) ;;
134    
135  # Make sure that the destination directory exists.      -C) copy_on_change=true;;
 #  this part is taken from Noah Friedman's mkinstalldirs script  
136    
137  # Skip lots of stat calls in the usual case.      -d) dir_arg=true;;
 if [ ! -d "$dstdir" ]; then  
 defaultIFS='  
         '  
 IFS="${IFS-${defaultIFS}}"  
   
 oIFS="${IFS}"  
 # Some sh's can't handle IFS=/ for some reason.  
 IFS='%'  
 set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`  
 IFS="${oIFS}"  
   
 pathcomp=''  
   
 while [ $# -ne 0 ] ; do  
         pathcomp="${pathcomp}${1}"  
         shift  
   
         if [ ! -d "${pathcomp}" ] ;  
         then  
                 $mkdirprog "${pathcomp}"  
         else  
                 :  
         fi  
138    
139          pathcomp="${pathcomp}/"      -g) chgrpcmd="$chgrpprog $2"
140  done          shift;;
 fi  
141    
142  if [ x"$dir_arg" != x ]      --help) echo "$usage"; exit $?;;
 then  
         $doit $instcmd $dst &&  
   
         if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi &&  
         if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi &&  
         if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi &&  
         if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi  
 else  
143    
144  # If we're going to rename the final executable, determine the name now.      -m) mode=$2
145            case $mode in
146              *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
147                echo "$0: invalid mode: $mode" >&2
148                exit 1;;
149            esac
150            shift;;
151    
152          if [ x"$transformarg" = x ]      -o) chowncmd="$chownprog $2"
153          then          shift;;
                 dstfile=`basename $dst`  
         else  
                 dstfile=`basename $dst $transformbasename |  
                         sed $transformarg`$transformbasename  
         fi  
154    
155  # don't allow the sed command to completely eliminate the filename      -p) cpprog="$cpprog -p";;
156    
157          if [ x"$dstfile" = x ]      -s) stripcmd=$stripprog;;
         then  
                 dstfile=`basename $dst`  
         else  
                 :  
         fi  
158    
159  # Make a temp file name in the proper directory.      -S) backupsuffix="$2"
160            shift;;
161    
162          dsttmp=$dstdir/#inst.$$#      -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    
171  # Move or copy the file name to the temp name      -T) is_target_a_directory=never;;
172    
173          $doit $instcmd $src $dsttmp &&      --version) echo "$0 $scriptversion"; exit $?;;
174    
175          trap "rm -f ${dsttmp}" 0 &&      --) shift
176            break;;
177    
178  # and set any options; do chmod last to preserve setuid bits      -*) echo "$0: invalid option: $1" >&2
179            exit 1;;
180    
181  # If any of these fail, we abort the whole thing.  If we want to      *)  break;;
182  # ignore errors from any of these, just make sure not to ignore    esac
183  # errors from the above "$doit $instcmd $src $dsttmp" command.    shift
184    done
185    
186          if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi &&  # We allow the use of options -d and -T together, by making -d
187          if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi &&  # take the precedence; this is for compatibility with GNU install.
         if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi &&  
         if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi &&  
188    
189  # Now rename the file to the real destination.  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          $doit $rmcmd -f $dstdir/$dstfile &&  if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
197          $doit $mvcmd $dsttmp $dstdir/$dstfile    # 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        if test -n "$dst_arg"; then
203          # $@ is not empty: it contains at least $arg.
204          set fnord "$@" "$dst_arg"
205          shift # fnord
206        fi
207        shift # arg
208        dst_arg=$arg
209        # Protect names problematic for 'test' and other utilities.
210        case $dst_arg in
211          -* | [=\(\)!]) dst_arg=./$dst_arg;;
212        esac
213      done
214    fi
215    
216  fi &&  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      # It's OK to call 'install-sh -d' without argument.
222      # This can happen when creating conditional directories.
223      exit 0
224    fi
225    
226    if test -z "$dir_arg"; then
227      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      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    
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            u_plus_rw=
252          else
253            u_plus_rw='% 200'
254          fi
255          cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
256        *)
257          if test -z "$stripcmd"; then
258            u_plus_rw=
259          else
260            u_plus_rw=,u+rw
261          fi
262          cp_umask=$mode$u_plus_rw;;
263      esac
264    fi
265    
266    for src
267    do
268      # Protect names problematic for 'test' and other utilities.
269      case $src in
270        -* | [=\(\)!]) src=./$src;;
271      esac
272    
273      if test -n "$dir_arg"; then
274        dst=$src
275        dstdir=$dst
276        test -d "$dstdir"
277        dstdir_status=$?
278        # Don't chown directories that already exist.
279        if test $dstdir_status = 0; then
280          chowncmd=""
281        fi
282      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        if test -z "$dst_arg"; then
293          echo "$0: no destination specified." >&2
294          exit 1
295        fi
296        dst=$dst_arg
297    
298        # If destination is a directory, append the input filename.
299        if test -d "$dst"; then
300          if test "$is_target_a_directory" = never; then
301            echo "$0: $dst_arg: Is a directory" >&2
302            exit 1
303          fi
304          dstdir=$dst
305          dstbase=`basename "$src"`
306          case $dst in
307            */) dst=$dst$dstbase;;
308            *)  dst=$dst/$dstbase;;
309          esac
310          dstdir_status=0
311        else
312          dstdir=`dirname "$dst"`
313          test -d "$dstdir"
314          dstdir_status=$?
315        fi
316      fi
317    
318      case $dstdir in
319        */) dstdirslash=$dstdir;;
320        *)  dstdirslash=$dstdir/;;
321      esac
322    
323      obsolete_mkdir_used=false
324    
325      if test $dstdir_status != 0; then
326        case $posix_mkdir in
327          '')
328            # 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    
336            posix_mkdir=false
337            # 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    
341            trap '
342              ret=$?
343              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
344              exit $ret
345            ' 0
346    
347            # 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        esac
381    
382        if
383          $posix_mkdir && (
384            umask $mkdir_umask &&
385            $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
386          )
387        then :
388        else
389    
390          # mkdir does not conform to POSIX,
391          # 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            /*) prefix='/';;
396            [-=\(\)!]*) prefix='./';;
397            *)  prefix='';;
398          esac
399    
400          oIFS=$IFS
401          IFS=/
402          set -f
403          set fnord $dstdir
404          shift
405          set +f
406          IFS=$oIFS
407    
408          prefixes=
409    
410          for d
411          do
412            test X"$d" = X && continue
413    
414            prefix=$prefix$d
415            if test -d "$prefix"; then
416              prefixes=
417            else
418              if $posix_mkdir; then
419                (umask $mkdir_umask &&
420                 $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          done
433    
434          if test -n "$prefixes"; then
435            # 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          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        dsttmp=${dstdirslash}_inst.$$_
453        rmtmp=${dstdirslash}_rm.$$_
454    
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        (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    
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        { 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    
483        # If -C, don't bother to copy if it wouldn't change the file.
484        if $copy_on_change &&
485           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           set X $old && old=:$2:$4:$5:$6 &&
489           set X $new && new=:$2:$4:$5:$6 &&
490           set +f &&
491           test "$old" = "$new" &&
492           $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
493        then
494          rm -f "$dsttmp"
495        else
496          # 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          # Rename the file to the real destination.
504          $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
505    
506          # 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            # 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              $doit $rmcmd "$dst" 2>/dev/null ||
518              { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
519                { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
520              } ||
521              { echo "$0: cannot unlink or rename $dst" >&2
522                (exit 1); exit 1
523              }
524            } &&
525    
526            # Now rename the file to the real destination.
527            $doit $mvcmd "$dsttmp" "$dst"
528          }
529        fi || exit 1
530    
531        trap '' 0
532      fi
533    done
534    
535  exit 0  # Local variables:
536    # eval: (add-hook 'before-save-hook 'time-stamp)
537    # time-stamp-start: "scriptversion="
538    # time-stamp-format: "%:y-%02m-%02d.%02H"
539    # time-stamp-time-zone: "UTC0"
540    # time-stamp-end: "; # UTC"
541    # End:


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1