13955d011SMarcel Moolenaar: 23955d011SMarcel Moolenaar# NAME: 33955d011SMarcel Moolenaar# install.sh - portable version of install(1) 43955d011SMarcel Moolenaar# 53955d011SMarcel Moolenaar# SYNOPSIS: 63955d011SMarcel Moolenaar# install [-CNcs] [-f flags] [-i errs] [-o owner] [-g group] [-m mode] file1 file2 ... 73955d011SMarcel Moolenaar# install -d [-i errs] [-o owner] [-g group] [-m mode] directory ... 83955d011SMarcel Moolenaar# 93955d011SMarcel Moolenaar# DESCRIPTION: 103955d011SMarcel Moolenaar# Compatible with BSD install(1). Except that '-c' is always 113955d011SMarcel Moolenaar# true and we always move an already installed target aside as 123955d011SMarcel Moolenaar# this is important on many systems. Recent BSD install(1) 133955d011SMarcel Moolenaar# versions have a '-b' option for this. 143955d011SMarcel Moolenaar# 153955d011SMarcel Moolenaar# 163955d011SMarcel Moolenaar# OPTIONS: 173955d011SMarcel Moolenaar# -b move previous target file aside (always true). 183955d011SMarcel Moolenaar# 193955d011SMarcel Moolenaar# -B "suffix" 203955d011SMarcel Moolenaar# use "suffix" instead of .old for saving existing target. 213955d011SMarcel Moolenaar# 223955d011SMarcel Moolenaar# -c copy rather than move the file into place (always true). 233955d011SMarcel Moolenaar# 243955d011SMarcel Moolenaar# -C compare. Only install if target is missing or 253955d011SMarcel Moolenaar# different. 263955d011SMarcel Moolenaar# 273955d011SMarcel Moolenaar# -N newer. Only install if target is missing or older. 283955d011SMarcel Moolenaar# 293955d011SMarcel Moolenaar# -s strip target 303955d011SMarcel Moolenaar# 313955d011SMarcel Moolenaar# -o "owner" 323955d011SMarcel Moolenaar# make target owned by "owner" 333955d011SMarcel Moolenaar# 343955d011SMarcel Moolenaar# -g "group" 353955d011SMarcel Moolenaar# make target group owned by "group" 363955d011SMarcel Moolenaar# 373955d011SMarcel Moolenaar# -m "mode" 383955d011SMarcel Moolenaar# set permissions to "mode" 393955d011SMarcel Moolenaar# 403955d011SMarcel Moolenaar# -f "flags" 413955d011SMarcel Moolenaar# Pass "flags" onto chflags(1) 423955d011SMarcel Moolenaar# 433955d011SMarcel Moolenaar# -i "errs" 443955d011SMarcel Moolenaar# Ignore errors from steps indicated by "errs" (``s,o,g,m''). 453955d011SMarcel Moolenaar# 463955d011SMarcel Moolenaar# BUGS: 473955d011SMarcel Moolenaar# The '-i' option is to save your sanity when 'bsd.prog.mk' 483955d011SMarcel Moolenaar# insists on haveing a '-o' "owner" option which is doomed to 493955d011SMarcel Moolenaar# fail on many systems. We ignore '-b', '-B' and '-c' options. 503955d011SMarcel Moolenaar# 513955d011SMarcel Moolenaar# AUTHOR: 52*dc1b8c9aSSimon J. Gerraty# Simon J. Gerraty <sjg@crufty.net> 533955d011SMarcel Moolenaar# 543955d011SMarcel Moolenaar 553955d011SMarcel Moolenaar# RCSid: 56*dc1b8c9aSSimon J. Gerraty# $Id: install-sh,v 1.22 2023/01/28 16:21:19 sjg Exp $ 573955d011SMarcel Moolenaar# 58*dc1b8c9aSSimon J. Gerraty# @(#) Copyright (c) 1993-2023 Simon J. Gerraty 593955d011SMarcel Moolenaar# 603955d011SMarcel Moolenaar# This file is provided in the hope that it will 613955d011SMarcel Moolenaar# be of use. There is absolutely NO WARRANTY. 623955d011SMarcel Moolenaar# Permission to copy, redistribute or otherwise 633955d011SMarcel Moolenaar# use this file is hereby granted provided that 643955d011SMarcel Moolenaar# the above copyright notice and this notice are 653955d011SMarcel Moolenaar# left intact. 663955d011SMarcel Moolenaar# 673955d011SMarcel Moolenaar# Please send copies of changes and bug-fixes to: 68*dc1b8c9aSSimon J. Gerraty# sjg@crufty.net 693955d011SMarcel Moolenaar# 703955d011SMarcel Moolenaar 713955d011SMarcel Moolenaarset -- `getopt B:bpxCNcsdo:g:m:i:f: $*` 723955d011SMarcel Moolenaar 733955d011SMarcel MoolenaarMydir=`dirname $0` 743955d011SMarcel Moolenaar[ -s $Mydir/.installrc ] && . $Mydir/.installrc 753955d011SMarcel Moolenaar 763955d011SMarcel Moolenaarowner=: 773955d011SMarcel Moolenaargroup=: 783955d011SMarcel Moolenaarmode=: 79*dc1b8c9aSSimon J. GerratyMODE=0 803955d011SMarcel Moolenaarstrip=: 813955d011SMarcel Moolenaarmkdirs= 823955d011SMarcel Moolenaarcompare=: 833955d011SMarcel Moolenaarnewer=: 843955d011SMarcel Moolenaarchflags=: 85*dc1b8c9aSSimon J. GerratyLS_1= 86*dc1b8c9aSSimon J. GerratyCP_p= 873955d011SMarcel Moolenaar 88*dc1b8c9aSSimon J. Gerratywhile : 893955d011SMarcel Moolenaardo 90*dc1b8c9aSSimon J. Gerraty case "$1" in 913955d011SMarcel Moolenaar --) shift; break;; 92*dc1b8c9aSSimon J. Gerraty -p) CP_p=-p;; 933955d011SMarcel Moolenaar -x) set -x;; 943955d011SMarcel Moolenaar -B) OLD_EXT=$2; shift;; 953955d011SMarcel Moolenaar -C) compare=Different;; 963955d011SMarcel Moolenaar -N) newer=Newer; 973955d011SMarcel Moolenaar # check if /bin/ls supports -1 98*dc1b8c9aSSimon J. Gerraty 'ls' -1 $0 > /dev/null 2>&1 && LS_1=1 993955d011SMarcel Moolenaar ;; 1003955d011SMarcel Moolenaar -o) owner="${CHOWN:-chown} $2 "; shift;; 1013955d011SMarcel Moolenaar -g) group="${CHGRP:-chgrp} $2 "; shift;; 102*dc1b8c9aSSimon J. Gerraty -m) MODE=$2 mode="${CHMOD:-chmod} $2 "; shift;; 1033955d011SMarcel Moolenaar -s) strip=${STRIP:-strip};; 1043955d011SMarcel Moolenaar -d) mkdirs="mkdir -p";; 1053955d011SMarcel Moolenaar -i) ignore_err="$ignore_err$2"; shift;; 1063955d011SMarcel Moolenaar -f) chflags="${CHFLAGS:-chflags} $2 "; shift;; 107*dc1b8c9aSSimon J. Gerraty *) break;; 1083955d011SMarcel Moolenaar esac 1093955d011SMarcel Moolenaar shift 1103955d011SMarcel Moolenaardone 1113955d011SMarcel Moolenaar 1123955d011SMarcel MoolenaarNewer() { 113*dc1b8c9aSSimon J. Gerraty n=`'ls' -t$LS_1 $* 2> /dev/null | head -1` 1143955d011SMarcel Moolenaar [ $1 = $n ] 1153955d011SMarcel Moolenaar} 1163955d011SMarcel Moolenaar 1173955d011SMarcel MoolenaarDifferent() { 1183955d011SMarcel Moolenaar cmp -s $* 1193955d011SMarcel Moolenaar [ $? != 0 ] 1203955d011SMarcel Moolenaar} 1213955d011SMarcel Moolenaar 1223955d011SMarcel MoolenaarErr() { 1233955d011SMarcel Moolenaar case "$ignore_err" in 1243955d011SMarcel Moolenaar *$1*) ;; 1253955d011SMarcel Moolenaar *) exit 1;; 1263955d011SMarcel Moolenaar esac 1273955d011SMarcel Moolenaar} 1283955d011SMarcel Moolenaar 1293955d011SMarcel MoolenaarSetem() { 1303955d011SMarcel Moolenaar # the order is important 1313955d011SMarcel Moolenaar if [ ! -d $1 ]; then 1323955d011SMarcel Moolenaar $strip $1 || Err s 1333955d011SMarcel Moolenaar fi 1343955d011SMarcel Moolenaar $group $1 || Err g 1353955d011SMarcel Moolenaar $owner $1 || Err o 1363955d011SMarcel Moolenaar $mode $1 || Err m 1373955d011SMarcel Moolenaar $chflags $1 || Err f 1383955d011SMarcel Moolenaar return 0 1393955d011SMarcel Moolenaar} 1403955d011SMarcel Moolenaar 1413955d011SMarcel Moolenaar# a bug in HP-UX's /bin/sh, means we need to re-set $* 1423955d011SMarcel Moolenaar# after any calls to add_path() 1433955d011SMarcel Moolenaarargs="$*" 1443955d011SMarcel Moolenaar 145*dc1b8c9aSSimon J. Gerratyadd_path () { 146*dc1b8c9aSSimon J. Gerraty test -d $1 || return 147*dc1b8c9aSSimon J. Gerraty case ":$PATH:" in 148*dc1b8c9aSSimon J. Gerraty *:$1:*) return;; 149*dc1b8c9aSSimon J. Gerraty esac 150*dc1b8c9aSSimon J. Gerraty PATH=$PATH:$1 151*dc1b8c9aSSimon J. Gerraty} 152*dc1b8c9aSSimon J. Gerraty 1533955d011SMarcel Moolenaaradd_path /sbin 1543955d011SMarcel Moolenaaradd_path /usr/sbin 1553955d011SMarcel Moolenaar 156*dc1b8c9aSSimon J. Gerratycase "$owner" in 157*dc1b8c9aSSimon J. Gerraty:) ;; 158*dc1b8c9aSSimon J. Gerraty*) 159*dc1b8c9aSSimon J. Gerraty add_path /etc 160*dc1b8c9aSSimon J. Gerraty add_path /usr/etc 161*dc1b8c9aSSimon J. Gerraty ;; 162*dc1b8c9aSSimon J. Gerratyesac 163*dc1b8c9aSSimon J. Gerraty 1643955d011SMarcel Moolenaar# restore saved $* 1653955d011SMarcel Moolenaarset -- $args 1663955d011SMarcel Moolenaar 1673955d011SMarcel Moolenaar# make directories if needed 1683955d011SMarcel Moolenaar# and ensure mode etc are as desired 1693955d011SMarcel Moolenaarif [ "$mkdirs" ]; then 170*dc1b8c9aSSimon J. Gerraty case "$MODE" in 171*dc1b8c9aSSimon J. Gerraty [1-7]*) 172*dc1b8c9aSSimon J. Gerraty # make sure umask is compatible 173*dc1b8c9aSSimon J. Gerraty case "$MODE" in 174*dc1b8c9aSSimon J. Gerraty ????*) MODE=`echo $MODE | sed 's,.*\(...\)$,\1,'`;; 175*dc1b8c9aSSimon J. Gerraty esac 176*dc1b8c9aSSimon J. Gerraty umask `expr 0777 - 0$MODE | 177*dc1b8c9aSSimon J. Gerraty sed 's,^,000,;s,^.*\(...\)$,\1,'`;; 178*dc1b8c9aSSimon J. Gerraty esac 1793955d011SMarcel Moolenaar for d in $* 1803955d011SMarcel Moolenaar do 1813955d011SMarcel Moolenaar [ ! -d $d ] && $mkdirs $d 1823955d011SMarcel Moolenaar Setem $d 1833955d011SMarcel Moolenaar done 1843955d011SMarcel Moolenaar exit 0 # that's all we do 1853955d011SMarcel Moolenaarfi 1863955d011SMarcel Moolenaar 1873955d011SMarcel Moolenaar# install files 1883955d011SMarcel Moolenaarif [ $# -gt 2 ]; then 1893955d011SMarcel Moolenaar dest_dir=yes 1903955d011SMarcel Moolenaarelif [ $# -eq 1 ]; then 1913955d011SMarcel Moolenaar echo "what should I do with $*?" >&2 1923955d011SMarcel Moolenaar exit 1 1933955d011SMarcel Moolenaarfi 1943955d011SMarcel Moolenaar 1953955d011SMarcel Moolenaar# get list of files 1963955d011SMarcel Moolenaarwhile [ $# -gt 1 ] 1973955d011SMarcel Moolenaardo 1983955d011SMarcel Moolenaar files="$files $1" 1993955d011SMarcel Moolenaar shift 2003955d011SMarcel Moolenaardone 2013955d011SMarcel Moolenaar# last one is dest 2023955d011SMarcel Moolenaardest=$1 2033955d011SMarcel Moolenaarshift 2043955d011SMarcel Moolenaar 2053955d011SMarcel Moolenaar 2063955d011SMarcel Moolenaarif [ "$dest_dir" = yes -a ! -d $dest ]; then 2073955d011SMarcel Moolenaar echo "no directory $dest" >&2 2083955d011SMarcel Moolenaar exit 1 2093955d011SMarcel Moolenaarfi 2103955d011SMarcel Moolenaar 2113955d011SMarcel Moolenaarfor f in $files 2123955d011SMarcel Moolenaardo 2133955d011SMarcel Moolenaar b=`basename $f` 2143955d011SMarcel Moolenaar if [ -d $dest ]; then 2153955d011SMarcel Moolenaar t=$dest/$b 2163955d011SMarcel Moolenaar else 2173955d011SMarcel Moolenaar t=$dest 2183955d011SMarcel Moolenaar fi 2193955d011SMarcel Moolenaar $newer $f $t || continue 2203955d011SMarcel Moolenaar $compare $f $t || continue 2213955d011SMarcel Moolenaar [ -f $t ] && { mv -f $t $t.old || exit 1; } 222*dc1b8c9aSSimon J. Gerraty { cp $CP_p $f $t && Setem $t; } || exit 1 2233955d011SMarcel Moolenaardone 2243955d011SMarcel Moolenaarexit 0 225