198875883SSimon J. Gerraty#!/bin/sh 298875883SSimon J. Gerraty 33955d011SMarcel Moolenaar# NAME: 43955d011SMarcel Moolenaar# install.sh - portable version of install(1) 53955d011SMarcel Moolenaar# 63955d011SMarcel Moolenaar# SYNOPSIS: 73955d011SMarcel Moolenaar# install [-CNcs] [-f flags] [-i errs] [-o owner] [-g group] [-m mode] file1 file2 ... 83955d011SMarcel Moolenaar# install -d [-i errs] [-o owner] [-g group] [-m mode] directory ... 93955d011SMarcel Moolenaar# 103955d011SMarcel Moolenaar# DESCRIPTION: 113955d011SMarcel Moolenaar# Compatible with BSD install(1). Except that '-c' is always 123955d011SMarcel Moolenaar# true and we always move an already installed target aside as 133955d011SMarcel Moolenaar# this is important on many systems. Recent BSD install(1) 143955d011SMarcel Moolenaar# versions have a '-b' option for this. 153955d011SMarcel Moolenaar# 163955d011SMarcel Moolenaar# 173955d011SMarcel Moolenaar# OPTIONS: 183955d011SMarcel Moolenaar# -b move previous target file aside (always true). 193955d011SMarcel Moolenaar# 203955d011SMarcel Moolenaar# -B "suffix" 213955d011SMarcel Moolenaar# use "suffix" instead of .old for saving existing target. 223955d011SMarcel Moolenaar# 233955d011SMarcel Moolenaar# -c copy rather than move the file into place (always true). 243955d011SMarcel Moolenaar# 253955d011SMarcel Moolenaar# -C compare. Only install if target is missing or 263955d011SMarcel Moolenaar# different. 273955d011SMarcel Moolenaar# 283955d011SMarcel Moolenaar# -N newer. Only install if target is missing or older. 293955d011SMarcel Moolenaar# 303955d011SMarcel Moolenaar# -s strip target 313955d011SMarcel Moolenaar# 323955d011SMarcel Moolenaar# -o "owner" 333955d011SMarcel Moolenaar# make target owned by "owner" 343955d011SMarcel Moolenaar# 353955d011SMarcel Moolenaar# -g "group" 363955d011SMarcel Moolenaar# make target group owned by "group" 373955d011SMarcel Moolenaar# 383955d011SMarcel Moolenaar# -m "mode" 393955d011SMarcel Moolenaar# set permissions to "mode" 403955d011SMarcel Moolenaar# 413955d011SMarcel Moolenaar# -f "flags" 423955d011SMarcel Moolenaar# Pass "flags" onto chflags(1) 433955d011SMarcel Moolenaar# 443955d011SMarcel Moolenaar# -i "errs" 453955d011SMarcel Moolenaar# Ignore errors from steps indicated by "errs" (``s,o,g,m''). 463955d011SMarcel Moolenaar# 473955d011SMarcel Moolenaar# BUGS: 483955d011SMarcel Moolenaar# The '-i' option is to save your sanity when 'bsd.prog.mk' 493955d011SMarcel Moolenaar# insists on haveing a '-o' "owner" option which is doomed to 5098875883SSimon J. Gerraty# fail on many systems. We ignore '-b' and '-c' options. 513955d011SMarcel Moolenaar# 523955d011SMarcel Moolenaar# AUTHOR: 53dc1b8c9aSSimon J. Gerraty# Simon J. Gerraty <sjg@crufty.net> 543955d011SMarcel Moolenaar# 553955d011SMarcel Moolenaar 56*c59c3bf3SSimon J. Gerraty# SPDX-License-Identifier: BSD-2-Clause 57*c59c3bf3SSimon J. Gerraty# 583955d011SMarcel Moolenaar# RCSid: 59*c59c3bf3SSimon J. Gerraty# $Id: install-sh,v 1.26 2024/02/17 17:26:57 sjg Exp $ 603955d011SMarcel Moolenaar# 61dc1b8c9aSSimon J. Gerraty# @(#) Copyright (c) 1993-2023 Simon J. Gerraty 623955d011SMarcel Moolenaar# 633955d011SMarcel Moolenaar# This file is provided in the hope that it will 643955d011SMarcel Moolenaar# be of use. There is absolutely NO WARRANTY. 653955d011SMarcel Moolenaar# Permission to copy, redistribute or otherwise 663955d011SMarcel Moolenaar# use this file is hereby granted provided that 673955d011SMarcel Moolenaar# the above copyright notice and this notice are 683955d011SMarcel Moolenaar# left intact. 693955d011SMarcel Moolenaar# 703955d011SMarcel Moolenaar# Please send copies of changes and bug-fixes to: 71dc1b8c9aSSimon J. Gerraty# sjg@crufty.net 723955d011SMarcel Moolenaar# 733955d011SMarcel Moolenaar 743955d011SMarcel Moolenaarset -- `getopt B:bpxCNcsdo:g:m:i:f: $*` 753955d011SMarcel Moolenaar 763955d011SMarcel MoolenaarMydir=`dirname $0` 773955d011SMarcel Moolenaar[ -s $Mydir/.installrc ] && . $Mydir/.installrc 783955d011SMarcel Moolenaar 7998875883SSimon J. GerratyOLD_EXT=.old 803955d011SMarcel Moolenaarowner=: 813955d011SMarcel Moolenaargroup=: 823955d011SMarcel Moolenaarmode=: 83dc1b8c9aSSimon J. GerratyMODE=0 843955d011SMarcel Moolenaarstrip=: 853955d011SMarcel Moolenaarmkdirs= 863955d011SMarcel Moolenaarcompare=: 873955d011SMarcel Moolenaarnewer=: 883955d011SMarcel Moolenaarchflags=: 89dc1b8c9aSSimon J. GerratyLS_1= 90dc1b8c9aSSimon J. GerratyCP_p= 913955d011SMarcel Moolenaar 92dc1b8c9aSSimon J. Gerratywhile : 933955d011SMarcel Moolenaardo 94dc1b8c9aSSimon J. Gerraty case "$1" in 953955d011SMarcel Moolenaar --) shift; break;; 9698875883SSimon J. Gerraty -[bc]) ;; # ignore 97dc1b8c9aSSimon J. Gerraty -p) CP_p=-p;; 983955d011SMarcel Moolenaar -x) set -x;; 993955d011SMarcel Moolenaar -B) OLD_EXT=$2; shift;; 1003955d011SMarcel Moolenaar -C) compare=Different;; 1013955d011SMarcel Moolenaar -N) newer=Newer; 1023955d011SMarcel Moolenaar # check if /bin/ls supports -1 103dc1b8c9aSSimon J. Gerraty 'ls' -1 $0 > /dev/null 2>&1 && LS_1=1 1043955d011SMarcel Moolenaar ;; 1053955d011SMarcel Moolenaar -o) owner="${CHOWN:-chown} $2 "; shift;; 1063955d011SMarcel Moolenaar -g) group="${CHGRP:-chgrp} $2 "; shift;; 107dc1b8c9aSSimon J. Gerraty -m) MODE=$2 mode="${CHMOD:-chmod} $2 "; shift;; 1083955d011SMarcel Moolenaar -s) strip=${STRIP:-strip};; 1093955d011SMarcel Moolenaar -d) mkdirs="mkdir -p";; 1103955d011SMarcel Moolenaar -i) ignore_err="$ignore_err$2"; shift;; 1113955d011SMarcel Moolenaar -f) chflags="${CHFLAGS:-chflags} $2 "; shift;; 112dc1b8c9aSSimon J. Gerraty *) break;; 1133955d011SMarcel Moolenaar esac 1143955d011SMarcel Moolenaar shift 1153955d011SMarcel Moolenaardone 1163955d011SMarcel Moolenaar 1173955d011SMarcel MoolenaarNewer() { 118dc1b8c9aSSimon J. Gerraty n=`'ls' -t$LS_1 $* 2> /dev/null | head -1` 1193955d011SMarcel Moolenaar [ $1 = $n ] 1203955d011SMarcel Moolenaar} 1213955d011SMarcel Moolenaar 1223955d011SMarcel MoolenaarDifferent() { 1233955d011SMarcel Moolenaar cmp -s $* 1243955d011SMarcel Moolenaar [ $? != 0 ] 1253955d011SMarcel Moolenaar} 1263955d011SMarcel Moolenaar 1273955d011SMarcel MoolenaarErr() { 1283955d011SMarcel Moolenaar case "$ignore_err" in 1293955d011SMarcel Moolenaar *$1*) ;; 1303955d011SMarcel Moolenaar *) exit 1;; 1313955d011SMarcel Moolenaar esac 1323955d011SMarcel Moolenaar} 1333955d011SMarcel Moolenaar 1343955d011SMarcel MoolenaarSetem() { 1353955d011SMarcel Moolenaar # the order is important 1363955d011SMarcel Moolenaar if [ ! -d $1 ]; then 1373955d011SMarcel Moolenaar $strip $1 || Err s 1383955d011SMarcel Moolenaar fi 1393955d011SMarcel Moolenaar $group $1 || Err g 1403955d011SMarcel Moolenaar $owner $1 || Err o 1413955d011SMarcel Moolenaar $mode $1 || Err m 1423955d011SMarcel Moolenaar $chflags $1 || Err f 1433955d011SMarcel Moolenaar return 0 1443955d011SMarcel Moolenaar} 1453955d011SMarcel Moolenaar 1463955d011SMarcel Moolenaar# a bug in HP-UX's /bin/sh, means we need to re-set $* 1473955d011SMarcel Moolenaar# after any calls to add_path() 1483955d011SMarcel Moolenaarargs="$*" 1493955d011SMarcel Moolenaar 150dc1b8c9aSSimon J. Gerratyadd_path () { 151dc1b8c9aSSimon J. Gerraty test -d $1 || return 152dc1b8c9aSSimon J. Gerraty case ":$PATH:" in 153dc1b8c9aSSimon J. Gerraty *:$1:*) return;; 154dc1b8c9aSSimon J. Gerraty esac 155dc1b8c9aSSimon J. Gerraty PATH=$PATH:$1 156dc1b8c9aSSimon J. Gerraty} 157dc1b8c9aSSimon J. Gerraty 1583955d011SMarcel Moolenaaradd_path /sbin 1593955d011SMarcel Moolenaaradd_path /usr/sbin 1603955d011SMarcel Moolenaar 161dc1b8c9aSSimon J. Gerratycase "$owner" in 162dc1b8c9aSSimon J. Gerraty:) ;; 16398875883SSimon J. Gerraty*) # some systems put chown in odd places 164dc1b8c9aSSimon J. Gerraty add_path /etc 165dc1b8c9aSSimon J. Gerraty add_path /usr/etc 166dc1b8c9aSSimon J. Gerraty ;; 167dc1b8c9aSSimon J. Gerratyesac 168dc1b8c9aSSimon J. Gerraty 1693955d011SMarcel Moolenaar# restore saved $* 1703955d011SMarcel Moolenaarset -- $args 1713955d011SMarcel Moolenaar 1723955d011SMarcel Moolenaar# make directories if needed 1733955d011SMarcel Moolenaar# and ensure mode etc are as desired 1743955d011SMarcel Moolenaarif [ "$mkdirs" ]; then 175dc1b8c9aSSimon J. Gerraty case "$MODE" in 176dc1b8c9aSSimon J. Gerraty [1-7]*) 177dc1b8c9aSSimon J. Gerraty # make sure umask is compatible 178dc1b8c9aSSimon J. Gerraty case "$MODE" in 179dc1b8c9aSSimon J. Gerraty ????*) MODE=`echo $MODE | sed 's,.*\(...\)$,\1,'`;; 180dc1b8c9aSSimon J. Gerraty esac 181dc1b8c9aSSimon J. Gerraty umask `expr 0777 - 0$MODE | 182dc1b8c9aSSimon J. Gerraty sed 's,^,000,;s,^.*\(...\)$,\1,'`;; 183dc1b8c9aSSimon J. Gerraty esac 1843955d011SMarcel Moolenaar for d in $* 1853955d011SMarcel Moolenaar do 1863955d011SMarcel Moolenaar [ ! -d $d ] && $mkdirs $d 1873955d011SMarcel Moolenaar Setem $d 1883955d011SMarcel Moolenaar done 1893955d011SMarcel Moolenaar exit 0 # that's all we do 1903955d011SMarcel Moolenaarfi 1913955d011SMarcel Moolenaar 1923955d011SMarcel Moolenaar# install files 19398875883SSimon J. Gerratyif [ $# -eq 1 ]; then 1943955d011SMarcel Moolenaar echo "what should I do with $*?" >&2 1953955d011SMarcel Moolenaar exit 1 1963955d011SMarcel Moolenaarfi 1973955d011SMarcel Moolenaar 1983955d011SMarcel Moolenaar# get list of files 19998875883SSimon J. Gerratyfiles= 2003955d011SMarcel Moolenaarwhile [ $# -gt 1 ] 2013955d011SMarcel Moolenaardo 20298875883SSimon J. Gerraty test "x$files" = x || dest_dir=yes 2033955d011SMarcel Moolenaar files="$files $1" 2043955d011SMarcel Moolenaar shift 2053955d011SMarcel Moolenaardone 2063955d011SMarcel Moolenaar# last one is dest 2073955d011SMarcel Moolenaardest=$1 2083955d011SMarcel Moolenaarshift 2093955d011SMarcel Moolenaar 2103955d011SMarcel Moolenaarif [ "$dest_dir" = yes -a ! -d $dest ]; then 2113955d011SMarcel Moolenaar echo "no directory $dest" >&2 2123955d011SMarcel Moolenaar exit 1 2133955d011SMarcel Moolenaarfi 2143955d011SMarcel Moolenaar 2153955d011SMarcel Moolenaarfor f in $files 2163955d011SMarcel Moolenaardo 2173955d011SMarcel Moolenaar b=`basename $f` 2183955d011SMarcel Moolenaar if [ -d $dest ]; then 2193955d011SMarcel Moolenaar t=$dest/$b 2203955d011SMarcel Moolenaar else 2213955d011SMarcel Moolenaar t=$dest 2223955d011SMarcel Moolenaar fi 2233955d011SMarcel Moolenaar $newer $f $t || continue 2243955d011SMarcel Moolenaar $compare $f $t || continue 22598875883SSimon J. Gerraty [ -f $t ] && { mv -f $t $t$OLD_EXT || exit 1; } 226dc1b8c9aSSimon J. Gerraty { cp $CP_p $f $t && Setem $t; } || exit 1 2273955d011SMarcel Moolenaardone 2283955d011SMarcel Moolenaarexit 0 229