File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / iperf / config / install-sh
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Sep 27 11:14:54 2023 UTC (8 months, 3 weeks ago) by misho
Branches: iperf, MAIN
CVS tags: v3_15, HEAD
Version 3.15

    1: #!/bin/sh
    2: # install - install a program, script, or datafile
    3: 
    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: # 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: # 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: src=
   85: dst=
   86: dir_arg=
   87: dst_arg=
   88: 
   89: copy_on_change=false
   90: 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: In the 1st form, copy SRCFILE to DSTFILE.
   99: In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
  100: In the 4th, create DIRECTORIES.
  101: 
  102: Options:
  103:      --help     display this help and exit.
  104:      --version  display version info and exit.
  105: 
  106:   -c            (ignored)
  107:   -C            install only if different (preserve data modification time)
  108:   -d            create directories instead of installing files.
  109:   -g GROUP      $chgrpprog installed files to GROUP.
  110:   -m MODE       $chmodprog installed files to MODE.
  111:   -o USER       $chownprog installed files to USER.
  112:   -p            pass -p to $cpprog.
  113:   -s            $stripprog installed files.
  114:   -S SUFFIX     attempt to back up existing files, with suffix SUFFIX.
  115:   -t DIRECTORY  install into DIRECTORY.
  116:   -T            report an error if DSTFILE is a directory.
  117: 
  118: Environment variables override the default commands:
  119:   CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
  120:   RMPROG STRIPPROG
  121: 
  122: By default, rm is invoked with -f; when overridden with RMPROG,
  123: it's up to you to specify -f if you want it.
  124: 
  125: If -S is not specified, no backups are attempted.
  126: 
  127: Email bug reports to bug-automake@gnu.org.
  128: Automake home page: https://www.gnu.org/software/automake/
  129: "
  130: 
  131: while test $# -ne 0; do
  132:   case $1 in
  133:     -c) ;;
  134: 
  135:     -C) copy_on_change=true;;
  136: 
  137:     -d) dir_arg=true;;
  138: 
  139:     -g) chgrpcmd="$chgrpprog $2"
  140:         shift;;
  141: 
  142:     --help) echo "$usage"; exit $?;;
  143: 
  144:     -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:     -o) chowncmd="$chownprog $2"
  153:         shift;;
  154: 
  155:     -p) cpprog="$cpprog -p";;
  156: 
  157:     -s) stripcmd=$stripprog;;
  158: 
  159:     -S) backupsuffix="$2"
  160:         shift;;
  161: 
  162:     -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:     -T) is_target_a_directory=never;;
  172: 
  173:     --version) echo "$0 $scriptversion"; exit $?;;
  174: 
  175:     --) shift
  176:         break;;
  177: 
  178:     -*) echo "$0: invalid option: $1" >&2
  179:         exit 1;;
  180: 
  181:     *)  break;;
  182:   esac
  183:   shift
  184: done
  185: 
  186: # We allow the use of options -d and -T together, by making -d
  187: # take the precedence; this is for compatibility with GNU install.
  188: 
  189: 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: if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
  197:   # 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: 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: # 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:

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>