Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. #!/bin/sh
  2. # install - install a program, script, or datafile
  3.  
  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
  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.
  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. chgrpcmd=
  73. chmodcmd=$chmodprog
  74. chowncmd=
  75. mvcmd=$mvprog
  76. rmcmd="$rmprog -f"
  77. stripcmd=
  78.  
  79. src=
  80. dst=
  81. dir_arg=
  82. dst_arg=
  83.  
  84. copy_on_change=false
  85. is_target_a_directory=possibly
  86.  
  87. usage="\
  88. Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
  89.    or: $0 [OPTION]... SRCFILES... DIRECTORY
  90.    or: $0 [OPTION]... -t DIRECTORY SRCFILES...
  91.    or: $0 [OPTION]... -d DIRECTORIES...
  92.  
  93. In the 1st form, copy SRCFILE to DSTFILE.
  94. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
  95. In the 4th, create DIRECTORIES.
  96.  
  97. Options:
  98.      --help     display this help and exit.
  99.      --version  display version info and exit.
  100.  
  101.   -c            (ignored)
  102.   -C            install only if different (preserve the last data modification time)
  103.   -d            create directories instead of installing files.
  104.   -g GROUP      $chgrpprog installed files to GROUP.
  105.   -m MODE       $chmodprog installed files to MODE.
  106.   -o USER       $chownprog installed files to USER.
  107.   -s            $stripprog installed files.
  108.   -t DIRECTORY  install into DIRECTORY.
  109.   -T            report an error if DSTFILE is a directory.
  110.  
  111. Environment variables override the default commands:
  112.   CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
  113.   RMPROG STRIPPROG
  114. "
  115.  
  116. while test $# -ne 0; do
  117.   case $1 in
  118.     -c) ;;
  119.  
  120.     -C) copy_on_change=true;;
  121.  
  122.     -d) dir_arg=true;;
  123.  
  124.     -g) chgrpcmd="$chgrpprog $2"
  125.         shift;;
  126.  
  127.     --help) echo "$usage"; exit $?;;
  128.  
  129.     -m) mode=$2
  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;;
  139.  
  140.     -s) stripcmd=$stripprog;;
  141.  
  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) is_target_a_directory=never;;
  152.  
  153.     --version) echo "$0 $scriptversion"; exit $?;;
  154.  
  155.     --) shift
  156.         break;;
  157.  
  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.
  179.   # Otherwise, the last argument is the destination.  Remove it from $@.
  180.   for arg
  181.   do
  182.     if test -n "$dst_arg"; then
  183.       # $@ is not empty: it contains at least $arg.
  184.       set fnord "$@" "$dst_arg"
  185.       shift # fnord
  186.     fi
  187.     shift # arg
  188.     dst_arg=$arg
  189.     # Protect names problematic for 'test' and other utilities.
  190.     case $dst_arg in
  191.       -* | [=\(\)!]) dst_arg=./$dst_arg;;
  192.     esac
  193.   done
  194. fi
  195.  
  196. if test $# -eq 0; then
  197.   if test -z "$dir_arg"; then
  198.     echo "$0: no input file specified." >&2
  199.     exit 1
  200.   fi
  201.   # It's OK to call 'install-sh -d' without argument.
  202.   # This can happen when creating conditional directories.
  203.   exit 0
  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
  219.   trap "ret=141; $do_exit" 13
  220.   trap "ret=143; $do_exit" 15
  221.  
  222.   # Set umask so as not to create temps with too-generous modes.
  223.   # However, 'strip' requires both read and write access to temps.
  224.   case $mode in
  225.     # Optimize common cases.
  226.     *644) cp_umask=133;;
  227.     *755) cp_umask=22;;
  228.  
  229.     *[0-7])
  230.       if test -z "$stripcmd"; then
  231.         u_plus_rw=
  232.       else
  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=
  239.       else
  240.         u_plus_rw=,u+rw
  241.       fi
  242.       cp_umask=$mode$u_plus_rw;;
  243.   esac
  244. fi
  245.  
  246. for src
  247. do
  248.   # Protect names problematic for 'test' and other utilities.
  249.   case $src in
  250.     -* | [=\(\)!]) src=./$src;;
  251.   esac
  252.  
  253.   if test -n "$dir_arg"; then
  254.     dst=$src
  255.     dstdir=$dst
  256.     test -d "$dstdir"
  257.     dstdir_status=$?
  258.   else
  259.  
  260.     # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
  261.     # might cause directories to be created, which would be especially bad
  262.     # if $src (and thus $dsttmp) contains '*'.
  263.     if test ! -f "$src" && test ! -d "$src"; then
  264.       echo "$0: $src does not exist." >&2
  265.       exit 1
  266.     fi
  267.  
  268.     if test -z "$dst_arg"; then
  269.       echo "$0: no destination specified." >&2
  270.       exit 1
  271.     fi
  272.     dst=$dst_arg
  273.  
  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 "$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.       dstdir=`dirname "$dst"`
  286.       test -d "$dstdir"
  287.       dstdir_status=$?
  288.     fi
  289.   fi
  290.  
  291.   obsolete_mkdir_used=false
  292.  
  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;;
  358.     esac
  359.  
  360.     if
  361.       $posix_mkdir && (
  362.         umask $mkdir_umask &&
  363.         $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
  364.       )
  365.     then :
  366.     else
  367.  
  368.       # The umask is ridiculous, or mkdir does not conform to POSIX,
  369.       # or it failed possibly due to a race condition.  Create the
  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='';;
  376.       esac
  377.  
  378.       oIFS=$IFS
  379.       IFS=/
  380.       set -f
  381.       set fnord $dstdir
  382.       shift
  383.       set +f
  384.       IFS=$oIFS
  385.  
  386.       prefixes=
  387.  
  388.       for d
  389.       do
  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/
  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
  418.       fi
  419.     fi
  420.   fi
  421.  
  422.   if test -n "$dir_arg"; then
  423.     { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
  424.     { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
  425.     { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
  426.       test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
  427.   else
  428.  
  429.     # Make a couple of temp file names in the proper directory.
  430.     dsttmp=$dstdir/_inst.$$_
  431.     rmtmp=$dstdir/_rm.$$_
  432.  
  433.     # Trap to clean up those temp files at exit.
  434.     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
  435.  
  436.     # Copy the file name to the temp name.
  437.     (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
  438.  
  439.     # and set any options; do chmod last to preserve setuid bits.
  440.     #
  441.     # If any of these fail, we abort the whole thing.  If we want to
  442.     # ignore errors from any of these, just make sure not to ignore
  443.     # errors from the above "$doit $cpprog $src $dsttmp" command.
  444.     #
  445.     { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
  446.     { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
  447.     { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
  448.     { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
  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.        set -f &&
  455.        set X $old && old=:$2:$4:$5:$6 &&
  456.        set X $new && new=:$2:$4:$5:$6 &&
  457.        set +f &&
  458.        test "$old" = "$new" &&
  459.        $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
  460.     then
  461.       rm -f "$dsttmp"
  462.     else
  463.       # Rename the file to the real destination.
  464.       $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
  465.  
  466.       # The rename failed, perhaps because mv can't rename something else
  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.         } &&
  485.  
  486.         # Now rename the file to the real destination.
  487.         $doit $mvcmd "$dsttmp" "$dst"
  488.       }
  489.     fi || exit 1
  490.  
  491.     trap '' 0
  492.   fi
  493. done
  494.  
  495. # Local variables:
  496. # eval: (add-hook 'write-file-hooks 'time-stamp)
  497. # time-stamp-start: "scriptversion="
  498. # time-stamp-format: "%:y-%02m-%02d.%02H"
  499. # time-stamp-time-zone: "UTC"
  500. # time-stamp-end: "; # UTC"
  501. # End:
  502.