/[svn]/ircd-hybrid-7.2/install-sh
ViewVC logotype

Diff of /ircd-hybrid-7.2/install-sh

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

revision 944 by michael, Wed Nov 7 23:20:12 2007 UTC revision 945 by michael, Mon Jul 20 15:48:27 2009 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    
4  scriptversion=2006-10-14.15  scriptversion=2009-04-28.21; # UTC
5    
6  # This originates from X11R5 (mit/util/scripts/install.sh), which was  # This originates from X11R5 (mit/util/scripts/install.sh), which was
7  # later released in X11R6 (xc/config/util/install.sh) with the  # later released in X11R6 (xc/config/util/install.sh) with the
# Line 48  IFS=" ""       $nl" Line 48  IFS=" ""       $nl"
48  # set DOITPROG to echo to test this script  # set DOITPROG to echo to test this script
49    
50  # Don't use :- since 4.3BSD and earlier shells don't like it.  # Don't use :- since 4.3BSD and earlier shells don't like it.
51  doit="${DOITPROG-}"  doit=${DOITPROG-}
52  if test -z "$doit"; then  if test -z "$doit"; then
53    doit_exec=exec    doit_exec=exec
54  else  else
# Line 58  fi Line 58  fi
58  # Put in absolute file names if you don't have them in your path;  # Put in absolute file names if you don't have them in your path;
59  # or use environment vars.  # or use environment vars.
60    
61  mvprog="${MVPROG-mv}"  chgrpprog=${CHGRPPROG-chgrp}
62  cpprog="${CPPROG-cp}"  chmodprog=${CHMODPROG-chmod}
63  chmodprog="${CHMODPROG-chmod}"  chownprog=${CHOWNPROG-chown}
64  chownprog="${CHOWNPROG-chown}"  cmpprog=${CMPPROG-cmp}
65  chgrpprog="${CHGRPPROG-chgrp}"  cpprog=${CPPROG-cp}
66  stripprog="${STRIPPROG-strip}"  mkdirprog=${MKDIRPROG-mkdir}
67  rmprog="${RMPROG-rm}"  mvprog=${MVPROG-mv}
68  mkdirprog="${MKDIRPROG-mkdir}"  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    
 posix_glob=  
82  posix_mkdir=  posix_mkdir=
83    
84  # Desired mode of installed file.  # Desired mode of installed file.
85  mode=0755  mode=0755
86    
87    chgrpcmd=
88  chmodcmd=$chmodprog  chmodcmd=$chmodprog
89  chowncmd=  chowncmd=
90  chgrpcmd=  mvcmd=$mvprog
 stripcmd=  
91  rmcmd="$rmprog -f"  rmcmd="$rmprog -f"
92  mvcmd="$mvprog"  stripcmd=
93    
94  src=  src=
95  dst=  dst=
96  dir_arg=  dir_arg=
97  dstarg=  dst_arg=
98    
99    copy_on_change=false
100  no_target_directory=  no_target_directory=
101    
102  usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE  usage="\
103    Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
104     or: $0 [OPTION]... SRCFILES... DIRECTORY     or: $0 [OPTION]... SRCFILES... DIRECTORY
105     or: $0 [OPTION]... -t DIRECTORY SRCFILES...     or: $0 [OPTION]... -t DIRECTORY SRCFILES...
106     or: $0 [OPTION]... -d DIRECTORIES...     or: $0 [OPTION]... -d DIRECTORIES...
# Line 95  In the 2nd and 3rd, copy all SRCFILES to Line 110  In the 2nd and 3rd, copy all SRCFILES to
110  In the 4th, create DIRECTORIES.  In the 4th, create DIRECTORIES.
111    
112  Options:  Options:
113  -c         (ignored)       --help     display this help and exit.
114  -d         create directories instead of installing files.       --version  display version info and exit.
115  -g GROUP   $chgrpprog installed files to GROUP.  
116  -m MODE    $chmodprog installed files to MODE.    -c            (ignored)
117  -o USER    $chownprog installed files to USER.    -C            install only if different (preserve the last data modification time)
118  -s         $stripprog installed files.    -d            create directories instead of installing files.
119  -t DIRECTORY  install into DIRECTORY.    -g GROUP      $chgrpprog installed files to GROUP.
120  -T         report an error if DSTFILE is a directory.    -m MODE       $chmodprog installed files to MODE.
121  --help     display this help and exit.    -o USER       $chownprog installed files to USER.
122  --version  display version info and exit.    -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:  Environment variables override the default commands:
127    CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG    CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
128      RMPROG STRIPPROG
129  "  "
130    
131  while test $# -ne 0; do  while test $# -ne 0; do
132    case $1 in    case $1 in
133      -c) shift      -c) ;;
134          continue;;  
135        -C) copy_on_change=true;;
136    
137      -d) dir_arg=true      -d) dir_arg=true;;
         shift  
         continue;;  
138    
139      -g) chgrpcmd="$chgrpprog $2"      -g) chgrpcmd="$chgrpprog $2"
140          shift          shift;;
         shift  
         continue;;  
141    
142      --help) echo "$usage"; exit $?;;      --help) echo "$usage"; exit $?;;
143    
144      -m) mode=$2      -m) mode=$2
         shift  
         shift  
145          case $mode in          case $mode in
146            *' '* | *'    '* | *'            *' '* | *'    '* | *'
147  '*        | *'*'* | *'?'* | *'['*)  '*        | *'*'* | *'?'* | *'['*)
148              echo "$0: invalid mode: $mode" >&2              echo "$0: invalid mode: $mode" >&2
149              exit 1;;              exit 1;;
150          esac          esac
151          continue;;          shift;;
152    
153      -o) chowncmd="$chownprog $2"      -o) chowncmd="$chownprog $2"
154          shift          shift;;
155          shift  
156          continue;;      -s) stripcmd=$stripprog;;
157    
158      -s) stripcmd=$stripprog      -t) dst_arg=$2
159          shift          shift;;
160          continue;;  
161        -T) no_target_directory=true;;
     -t) dstarg=$2  
         shift  
         shift  
         continue;;  
   
     -T) no_target_directory=true  
         shift  
         continue;;  
162    
163      --version) echo "$0 $scriptversion"; exit $?;;      --version) echo "$0 $scriptversion"; exit $?;;
164    
# Line 165  while test $# -ne 0; do Line 170  while test $# -ne 0; do
170    
171      *)  break;;      *)  break;;
172    esac    esac
173      shift
174  done  done
175    
176  if test $# -ne 0 && test -z "$dir_arg$dstarg"; then  if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
177    # When -d is used, all remaining arguments are directories to create.    # When -d is used, all remaining arguments are directories to create.
178    # When -t is used, the destination is already specified.    # When -t is used, the destination is already specified.
179    # Otherwise, the last argument is the destination.  Remove it from $@.    # Otherwise, the last argument is the destination.  Remove it from $@.
180    for arg    for arg
181    do    do
182      if test -n "$dstarg"; then      if test -n "$dst_arg"; then
183        # $@ is not empty: it contains at least $arg.        # $@ is not empty: it contains at least $arg.
184        set fnord "$@" "$dstarg"        set fnord "$@" "$dst_arg"
185        shift # fnord        shift # fnord
186      fi      fi
187      shift # arg      shift # arg
188      dstarg=$arg      dst_arg=$arg
189    done    done
190  fi  fi
191    
# Line 224  for src Line 230  for src
230  do  do
231    # Protect names starting with `-'.    # Protect names starting with `-'.
232    case $src in    case $src in
233      -*) src=./$src ;;      -*) src=./$src;;
234    esac    esac
235    
236    if test -n "$dir_arg"; then    if test -n "$dir_arg"; then
# Line 242  do Line 248  do
248        exit 1        exit 1
249      fi      fi
250    
251      if test -z "$dstarg"; then      if test -z "$dst_arg"; then
252        echo "$0: no destination specified." >&2        echo "$0: no destination specified." >&2
253        exit 1        exit 1
254      fi      fi
255    
256      dst=$dstarg      dst=$dst_arg
257      # Protect names starting with `-'.      # Protect names starting with `-'.
258      case $dst in      case $dst in
259        -*) dst=./$dst ;;        -*) dst=./$dst;;
260      esac      esac
261    
262      # If destination is a directory, append the input filename; won't work      # If destination is a directory, append the input filename; won't work
263      # if double slashes aren't ignored.      # if double slashes aren't ignored.
264      if test -d "$dst"; then      if test -d "$dst"; then
265        if test -n "$no_target_directory"; then        if test -n "$no_target_directory"; then
266          echo "$0: $dstarg: Is a directory" >&2          echo "$0: $dst_arg: Is a directory" >&2
267          exit 1          exit 1
268        fi        fi
269        dstdir=$dst        dstdir=$dst
# Line 378  do Line 384  do
384        # directory the slow way, step by step, checking for races as we go.        # directory the slow way, step by step, checking for races as we go.
385    
386        case $dstdir in        case $dstdir in
387          /*) prefix=/ ;;          /*) prefix='/';;
388          -*) prefix=./ ;;          -*) prefix='./';;
389          *)  prefix= ;;          *)  prefix='';;
390        esac        esac
391    
392        case $posix_glob in        eval "$initialize_posix_glob"
         '')  
           if (set -f) 2>/dev/null; then  
             posix_glob=true  
           else  
             posix_glob=false  
           fi ;;  
       esac  
393    
394        oIFS=$IFS        oIFS=$IFS
395        IFS=/        IFS=/
396        $posix_glob && set -f        $posix_glob set -f
397        set fnord $dstdir        set fnord $dstdir
398        shift        shift
399        $posix_glob && set +f        $posix_glob set +f
400        IFS=$oIFS        IFS=$oIFS
401    
402        prefixes=        prefixes=
# Line 459  do Line 458  do
458      # ignore errors from any of these, just make sure not to ignore      # ignore errors from any of these, just make sure not to ignore
459      # errors from the above "$doit $cpprog $src $dsttmp" command.      # errors from the above "$doit $cpprog $src $dsttmp" command.
460      #      #
461      { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \      { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
462        && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \      { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
463        && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \      { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
464        && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&      { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
465    
466      # Now rename the file to the real destination.      # If -C, don't bother to copy if it wouldn't change the file.
467      { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \      if $copy_on_change &&
468        || {         old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
469             # The rename failed, perhaps because mv can't rename something else         new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
470             # to itself, or perhaps because mv is so ancient that it does not  
471             # support -f.         eval "$initialize_posix_glob" &&
472           $posix_glob set -f &&
473             # Now remove or move aside any old file at destination location.         set X $old && old=:$2:$4:$5:$6 &&
474             # We try this two ways since rm can't unlink itself on some         set X $new && new=:$2:$4:$5:$6 &&
475             # systems and the destination file might be busy for other         $posix_glob set +f &&
476             # reasons.  In this case, the final cleanup might fail but the new  
477             # file should still install successfully.         test "$old" = "$new" &&
478             {         $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
479               if test -f "$dst"; then      then
480                 $doit $rmcmd -f "$dst" 2>/dev/null \        rm -f "$dsttmp"
481                 || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \      else
482                       && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\        # Rename the file to the real destination.
483                 || {        $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
484                   echo "$0: cannot unlink or rename $dst" >&2  
485                   (exit 1); exit 1        # The rename failed, perhaps because mv can't rename something else
486                 }        # to itself, or perhaps because mv is so ancient that it does not
487               else        # support -f.
488                 :        {
489               fi          # Now remove or move aside any old file at destination location.
490             } &&          # We try this two ways since rm can't unlink itself on some
491            # systems and the destination file might be busy for other
492             # Now rename the file to the real destination.          # reasons.  In this case, the final cleanup might fail but the new
493             $doit $mvcmd "$dsttmp" "$dst"          # file should still install successfully.
494           }          {
495      } || exit 1            test ! -f "$dst" ||
496              $doit $rmcmd -f "$dst" 2>/dev/null ||
497              { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
498                { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
499              } ||
500              { echo "$0: cannot unlink or rename $dst" >&2
501                (exit 1); exit 1
502              }
503            } &&
504    
505            # Now rename the file to the real destination.
506            $doit $mvcmd "$dsttmp" "$dst"
507          }
508        fi || exit 1
509    
510      trap '' 0      trap '' 0
511    fi    fi
# Line 503  done Line 515  done
515  # eval: (add-hook 'write-file-hooks 'time-stamp)  # eval: (add-hook 'write-file-hooks 'time-stamp)
516  # time-stamp-start: "scriptversion="  # time-stamp-start: "scriptversion="
517  # time-stamp-format: "%:y-%02m-%02d.%02H"  # time-stamp-format: "%:y-%02m-%02d.%02H"
518  # time-stamp-end: "$"  # time-stamp-time-zone: "UTC"
519    # time-stamp-end: "; # UTC"
520  # End:  # End:

Legend:
Removed from v.944  
changed lines
  Added in v.945

svnadmin@ircd-hybrid.org
ViewVC Help
Powered by ViewVC 1.1.26