198875883SSimon J. Gerraty#!/bin/sh 298875883SSimon J. Gerraty 398875883SSimon J. Gerraty# NAME: 498875883SSimon J. Gerraty# install.sh - portable version of install(1) 598875883SSimon J. Gerraty# 698875883SSimon J. Gerraty# SYNOPSIS: 798875883SSimon J. Gerraty# install [-CNcs] [-f flags] [-i errs] [-o owner] [-g group] [-m mode] file1 file2 ... 898875883SSimon J. Gerraty# install -d [-i errs] [-o owner] [-g group] [-m mode] directory ... 998875883SSimon J. Gerraty# 1098875883SSimon J. Gerraty# DESCRIPTION: 1198875883SSimon J. Gerraty# Compatible with BSD install(1). Except that '-c' is always 1298875883SSimon J. Gerraty# true and we always move an already installed target aside as 1398875883SSimon J. Gerraty# this is important on many systems. Recent BSD install(1) 1498875883SSimon J. Gerraty# versions have a '-b' option for this. 1598875883SSimon J. Gerraty# 1698875883SSimon J. Gerraty# 1798875883SSimon J. Gerraty# OPTIONS: 1898875883SSimon J. Gerraty# -b move previous target file aside (always true). 1998875883SSimon J. Gerraty# 2098875883SSimon J. Gerraty# -B "suffix" 2198875883SSimon J. Gerraty# use "suffix" instead of .old for saving existing target. 2298875883SSimon J. Gerraty# 2398875883SSimon J. Gerraty# -c copy rather than move the file into place (always true). 2498875883SSimon J. Gerraty# 2598875883SSimon J. Gerraty# -C compare. Only install if target is missing or 2698875883SSimon J. Gerraty# different. 2798875883SSimon J. Gerraty# 2898875883SSimon J. Gerraty# -N newer. Only install if target is missing or older. 2998875883SSimon J. Gerraty# 3098875883SSimon J. Gerraty# -s strip target 3198875883SSimon J. Gerraty# 3298875883SSimon J. Gerraty# -o "owner" 3398875883SSimon J. Gerraty# make target owned by "owner" 3498875883SSimon J. Gerraty# 3598875883SSimon J. Gerraty# -g "group" 3698875883SSimon J. Gerraty# make target group owned by "group" 3798875883SSimon J. Gerraty# 3898875883SSimon J. Gerraty# -m "mode" 3998875883SSimon J. Gerraty# set permissions to "mode" 4098875883SSimon J. Gerraty# 4198875883SSimon J. Gerraty# -f "flags" 4298875883SSimon J. Gerraty# Pass "flags" onto chflags(1) 4398875883SSimon J. Gerraty# 4498875883SSimon J. Gerraty# -i "errs" 4598875883SSimon J. Gerraty# Ignore errors from steps indicated by "errs" (``s,o,g,m''). 4698875883SSimon J. Gerraty# 4798875883SSimon J. Gerraty# BUGS: 4898875883SSimon J. Gerraty# The '-i' option is to save your sanity when 'bsd.prog.mk' 4998875883SSimon J. Gerraty# insists on haveing a '-o' "owner" option which is doomed to 5098875883SSimon J. Gerraty# fail on many systems. We ignore '-b' and '-c' options. 5198875883SSimon J. Gerraty# 5298875883SSimon J. Gerraty# AUTHOR: 5398875883SSimon J. Gerraty# Simon J. Gerraty <sjg@crufty.net> 5498875883SSimon J. Gerraty# 5598875883SSimon J. Gerraty 56*c59c3bf3SSimon J. Gerraty# SPDX-License-Identifier: BSD-2-Clause 57*c59c3bf3SSimon J. Gerraty# 5898875883SSimon J. Gerraty# RCSid: 59*c59c3bf3SSimon J. Gerraty# $Id: install-sh,v 1.26 2024/02/17 17:26:57 sjg Exp $ 6098875883SSimon J. Gerraty# 6198875883SSimon J. Gerraty# @(#) Copyright (c) 1993-2023 Simon J. Gerraty 6298875883SSimon J. Gerraty# 6398875883SSimon J. Gerraty# This file is provided in the hope that it will 6498875883SSimon J. Gerraty# be of use. There is absolutely NO WARRANTY. 6598875883SSimon J. Gerraty# Permission to copy, redistribute or otherwise 6698875883SSimon J. Gerraty# use this file is hereby granted provided that 6798875883SSimon J. Gerraty# the above copyright notice and this notice are 6898875883SSimon J. Gerraty# left intact. 6998875883SSimon J. Gerraty# 7098875883SSimon J. Gerraty# Please send copies of changes and bug-fixes to: 7198875883SSimon J. Gerraty# sjg@crufty.net 7298875883SSimon J. Gerraty# 7398875883SSimon J. Gerraty 7498875883SSimon J. Gerratyset -- `getopt B:bpxCNcsdo:g:m:i:f: $*` 7598875883SSimon J. Gerraty 7698875883SSimon J. GerratyMydir=`dirname $0` 7798875883SSimon J. Gerraty[ -s $Mydir/.installrc ] && . $Mydir/.installrc 7898875883SSimon J. Gerraty 7998875883SSimon J. GerratyOLD_EXT=.old 8098875883SSimon J. Gerratyowner=: 8198875883SSimon J. Gerratygroup=: 8298875883SSimon J. Gerratymode=: 8398875883SSimon J. GerratyMODE=0 8498875883SSimon J. Gerratystrip=: 8598875883SSimon J. Gerratymkdirs= 8698875883SSimon J. Gerratycompare=: 8798875883SSimon J. Gerratynewer=: 8898875883SSimon J. Gerratychflags=: 8998875883SSimon J. GerratyLS_1= 9098875883SSimon J. GerratyCP_p= 9198875883SSimon J. Gerraty 9298875883SSimon J. Gerratywhile : 9398875883SSimon J. Gerratydo 9498875883SSimon J. Gerraty case "$1" in 9598875883SSimon J. Gerraty --) shift; break;; 9698875883SSimon J. Gerraty -[bc]) ;; # ignore 9798875883SSimon J. Gerraty -p) CP_p=-p;; 9898875883SSimon J. Gerraty -x) set -x;; 9998875883SSimon J. Gerraty -B) OLD_EXT=$2; shift;; 10098875883SSimon J. Gerraty -C) compare=Different;; 10198875883SSimon J. Gerraty -N) newer=Newer; 10298875883SSimon J. Gerraty # check if /bin/ls supports -1 10398875883SSimon J. Gerraty 'ls' -1 $0 > /dev/null 2>&1 && LS_1=1 10498875883SSimon J. Gerraty ;; 10598875883SSimon J. Gerraty -o) owner="${CHOWN:-chown} $2 "; shift;; 10698875883SSimon J. Gerraty -g) group="${CHGRP:-chgrp} $2 "; shift;; 10798875883SSimon J. Gerraty -m) MODE=$2 mode="${CHMOD:-chmod} $2 "; shift;; 10898875883SSimon J. Gerraty -s) strip=${STRIP:-strip};; 10998875883SSimon J. Gerraty -d) mkdirs="mkdir -p";; 11098875883SSimon J. Gerraty -i) ignore_err="$ignore_err$2"; shift;; 11198875883SSimon J. Gerraty -f) chflags="${CHFLAGS:-chflags} $2 "; shift;; 11298875883SSimon J. Gerraty *) break;; 11398875883SSimon J. Gerraty esac 11498875883SSimon J. Gerraty shift 11598875883SSimon J. Gerratydone 11698875883SSimon J. Gerraty 11798875883SSimon J. GerratyNewer() { 11898875883SSimon J. Gerraty n=`'ls' -t$LS_1 $* 2> /dev/null | head -1` 11998875883SSimon J. Gerraty [ $1 = $n ] 12098875883SSimon J. Gerraty} 12198875883SSimon J. Gerraty 12298875883SSimon J. GerratyDifferent() { 12398875883SSimon J. Gerraty cmp -s $* 12498875883SSimon J. Gerraty [ $? != 0 ] 12598875883SSimon J. Gerraty} 12698875883SSimon J. Gerraty 12798875883SSimon J. GerratyErr() { 12898875883SSimon J. Gerraty case "$ignore_err" in 12998875883SSimon J. Gerraty *$1*) ;; 13098875883SSimon J. Gerraty *) exit 1;; 13198875883SSimon J. Gerraty esac 13298875883SSimon J. Gerraty} 13398875883SSimon J. Gerraty 13498875883SSimon J. GerratySetem() { 13598875883SSimon J. Gerraty # the order is important 13698875883SSimon J. Gerraty if [ ! -d $1 ]; then 13798875883SSimon J. Gerraty $strip $1 || Err s 13898875883SSimon J. Gerraty fi 13998875883SSimon J. Gerraty $group $1 || Err g 14098875883SSimon J. Gerraty $owner $1 || Err o 14198875883SSimon J. Gerraty $mode $1 || Err m 14298875883SSimon J. Gerraty $chflags $1 || Err f 14398875883SSimon J. Gerraty return 0 14498875883SSimon J. Gerraty} 14598875883SSimon J. Gerraty 14698875883SSimon J. Gerraty# a bug in HP-UX's /bin/sh, means we need to re-set $* 14798875883SSimon J. Gerraty# after any calls to add_path() 14898875883SSimon J. Gerratyargs="$*" 14998875883SSimon J. Gerraty 15098875883SSimon J. Gerratyadd_path () { 15198875883SSimon J. Gerraty test -d $1 || return 15298875883SSimon J. Gerraty case ":$PATH:" in 15398875883SSimon J. Gerraty *:$1:*) return;; 15498875883SSimon J. Gerraty esac 15598875883SSimon J. Gerraty PATH=$PATH:$1 15698875883SSimon J. Gerraty} 15798875883SSimon J. Gerraty 15898875883SSimon J. Gerratyadd_path /sbin 15998875883SSimon J. Gerratyadd_path /usr/sbin 16098875883SSimon J. Gerraty 16198875883SSimon J. Gerratycase "$owner" in 16298875883SSimon J. Gerraty:) ;; 16398875883SSimon J. Gerraty*) # some systems put chown in odd places 16498875883SSimon J. Gerraty add_path /etc 16598875883SSimon J. Gerraty add_path /usr/etc 16698875883SSimon J. Gerraty ;; 16798875883SSimon J. Gerratyesac 16898875883SSimon J. Gerraty 16998875883SSimon J. Gerraty# restore saved $* 17098875883SSimon J. Gerratyset -- $args 17198875883SSimon J. Gerraty 17298875883SSimon J. Gerraty# make directories if needed 17398875883SSimon J. Gerraty# and ensure mode etc are as desired 17498875883SSimon J. Gerratyif [ "$mkdirs" ]; then 17598875883SSimon J. Gerraty case "$MODE" in 17698875883SSimon J. Gerraty [1-7]*) 17798875883SSimon J. Gerraty # make sure umask is compatible 17898875883SSimon J. Gerraty case "$MODE" in 17998875883SSimon J. Gerraty ????*) MODE=`echo $MODE | sed 's,.*\(...\)$,\1,'`;; 18098875883SSimon J. Gerraty esac 18198875883SSimon J. Gerraty umask `expr 0777 - 0$MODE | 18298875883SSimon J. Gerraty sed 's,^,000,;s,^.*\(...\)$,\1,'`;; 18398875883SSimon J. Gerraty esac 18498875883SSimon J. Gerraty for d in $* 18598875883SSimon J. Gerraty do 18698875883SSimon J. Gerraty [ ! -d $d ] && $mkdirs $d 18798875883SSimon J. Gerraty Setem $d 18898875883SSimon J. Gerraty done 18998875883SSimon J. Gerraty exit 0 # that's all we do 19098875883SSimon J. Gerratyfi 19198875883SSimon J. Gerraty 19298875883SSimon J. Gerraty# install files 19398875883SSimon J. Gerratyif [ $# -eq 1 ]; then 19498875883SSimon J. Gerraty echo "what should I do with $*?" >&2 19598875883SSimon J. Gerraty exit 1 19698875883SSimon J. Gerratyfi 19798875883SSimon J. Gerraty 19898875883SSimon J. Gerraty# get list of files 19998875883SSimon J. Gerratyfiles= 20098875883SSimon J. Gerratywhile [ $# -gt 1 ] 20198875883SSimon J. Gerratydo 20298875883SSimon J. Gerraty test "x$files" = x || dest_dir=yes 20398875883SSimon J. Gerraty files="$files $1" 20498875883SSimon J. Gerraty shift 20598875883SSimon J. Gerratydone 20698875883SSimon J. Gerraty# last one is dest 20798875883SSimon J. Gerratydest=$1 20898875883SSimon J. Gerratyshift 20998875883SSimon J. Gerraty 21098875883SSimon J. Gerratyif [ "$dest_dir" = yes -a ! -d $dest ]; then 21198875883SSimon J. Gerraty echo "no directory $dest" >&2 21298875883SSimon J. Gerraty exit 1 21398875883SSimon J. Gerratyfi 21498875883SSimon J. Gerraty 21598875883SSimon J. Gerratyfor f in $files 21698875883SSimon J. Gerratydo 21798875883SSimon J. Gerraty b=`basename $f` 21898875883SSimon J. Gerraty if [ -d $dest ]; then 21998875883SSimon J. Gerraty t=$dest/$b 22098875883SSimon J. Gerraty else 22198875883SSimon J. Gerraty t=$dest 22298875883SSimon J. Gerraty fi 22398875883SSimon J. Gerraty $newer $f $t || continue 22498875883SSimon J. Gerraty $compare $f $t || continue 22598875883SSimon J. Gerraty [ -f $t ] && { mv -f $t $t$OLD_EXT || exit 1; } 22698875883SSimon J. Gerraty { cp $CP_p $f $t && Setem $t; } || exit 1 22798875883SSimon J. Gerratydone 22898875883SSimon J. Gerratyexit 0 229