1*98875883SSimon J. Gerraty#!/bin/sh 2*98875883SSimon J. Gerraty 3*98875883SSimon J. Gerraty# NAME: 4*98875883SSimon J. Gerraty# install.sh - portable version of install(1) 5*98875883SSimon J. Gerraty# 6*98875883SSimon J. Gerraty# SYNOPSIS: 7*98875883SSimon J. Gerraty# install [-CNcs] [-f flags] [-i errs] [-o owner] [-g group] [-m mode] file1 file2 ... 8*98875883SSimon J. Gerraty# install -d [-i errs] [-o owner] [-g group] [-m mode] directory ... 9*98875883SSimon J. Gerraty# 10*98875883SSimon J. Gerraty# DESCRIPTION: 11*98875883SSimon J. Gerraty# Compatible with BSD install(1). Except that '-c' is always 12*98875883SSimon J. Gerraty# true and we always move an already installed target aside as 13*98875883SSimon J. Gerraty# this is important on many systems. Recent BSD install(1) 14*98875883SSimon J. Gerraty# versions have a '-b' option for this. 15*98875883SSimon J. Gerraty# 16*98875883SSimon J. Gerraty# 17*98875883SSimon J. Gerraty# OPTIONS: 18*98875883SSimon J. Gerraty# -b move previous target file aside (always true). 19*98875883SSimon J. Gerraty# 20*98875883SSimon J. Gerraty# -B "suffix" 21*98875883SSimon J. Gerraty# use "suffix" instead of .old for saving existing target. 22*98875883SSimon J. Gerraty# 23*98875883SSimon J. Gerraty# -c copy rather than move the file into place (always true). 24*98875883SSimon J. Gerraty# 25*98875883SSimon J. Gerraty# -C compare. Only install if target is missing or 26*98875883SSimon J. Gerraty# different. 27*98875883SSimon J. Gerraty# 28*98875883SSimon J. Gerraty# -N newer. Only install if target is missing or older. 29*98875883SSimon J. Gerraty# 30*98875883SSimon J. Gerraty# -s strip target 31*98875883SSimon J. Gerraty# 32*98875883SSimon J. Gerraty# -o "owner" 33*98875883SSimon J. Gerraty# make target owned by "owner" 34*98875883SSimon J. Gerraty# 35*98875883SSimon J. Gerraty# -g "group" 36*98875883SSimon J. Gerraty# make target group owned by "group" 37*98875883SSimon J. Gerraty# 38*98875883SSimon J. Gerraty# -m "mode" 39*98875883SSimon J. Gerraty# set permissions to "mode" 40*98875883SSimon J. Gerraty# 41*98875883SSimon J. Gerraty# -f "flags" 42*98875883SSimon J. Gerraty# Pass "flags" onto chflags(1) 43*98875883SSimon J. Gerraty# 44*98875883SSimon J. Gerraty# -i "errs" 45*98875883SSimon J. Gerraty# Ignore errors from steps indicated by "errs" (``s,o,g,m''). 46*98875883SSimon J. Gerraty# 47*98875883SSimon J. Gerraty# BUGS: 48*98875883SSimon J. Gerraty# The '-i' option is to save your sanity when 'bsd.prog.mk' 49*98875883SSimon J. Gerraty# insists on haveing a '-o' "owner" option which is doomed to 50*98875883SSimon J. Gerraty# fail on many systems. We ignore '-b' and '-c' options. 51*98875883SSimon J. Gerraty# 52*98875883SSimon J. Gerraty# AUTHOR: 53*98875883SSimon J. Gerraty# Simon J. Gerraty <sjg@crufty.net> 54*98875883SSimon J. Gerraty# 55*98875883SSimon J. Gerraty 56*98875883SSimon J. Gerraty# RCSid: 57*98875883SSimon J. Gerraty# $Id: install-sh,v 1.25 2023/07/15 05:33:38 sjg Exp $ 58*98875883SSimon J. Gerraty# 59*98875883SSimon J. Gerraty# @(#) Copyright (c) 1993-2023 Simon J. Gerraty 60*98875883SSimon J. Gerraty# 61*98875883SSimon J. Gerraty# This file is provided in the hope that it will 62*98875883SSimon J. Gerraty# be of use. There is absolutely NO WARRANTY. 63*98875883SSimon J. Gerraty# Permission to copy, redistribute or otherwise 64*98875883SSimon J. Gerraty# use this file is hereby granted provided that 65*98875883SSimon J. Gerraty# the above copyright notice and this notice are 66*98875883SSimon J. Gerraty# left intact. 67*98875883SSimon J. Gerraty# 68*98875883SSimon J. Gerraty# Please send copies of changes and bug-fixes to: 69*98875883SSimon J. Gerraty# sjg@crufty.net 70*98875883SSimon J. Gerraty# 71*98875883SSimon J. Gerraty 72*98875883SSimon J. Gerratyset -- `getopt B:bpxCNcsdo:g:m:i:f: $*` 73*98875883SSimon J. Gerraty 74*98875883SSimon J. GerratyMydir=`dirname $0` 75*98875883SSimon J. Gerraty[ -s $Mydir/.installrc ] && . $Mydir/.installrc 76*98875883SSimon J. Gerraty 77*98875883SSimon J. GerratyOLD_EXT=.old 78*98875883SSimon J. Gerratyowner=: 79*98875883SSimon J. Gerratygroup=: 80*98875883SSimon J. Gerratymode=: 81*98875883SSimon J. GerratyMODE=0 82*98875883SSimon J. Gerratystrip=: 83*98875883SSimon J. Gerratymkdirs= 84*98875883SSimon J. Gerratycompare=: 85*98875883SSimon J. Gerratynewer=: 86*98875883SSimon J. Gerratychflags=: 87*98875883SSimon J. GerratyLS_1= 88*98875883SSimon J. GerratyCP_p= 89*98875883SSimon J. Gerraty 90*98875883SSimon J. Gerratywhile : 91*98875883SSimon J. Gerratydo 92*98875883SSimon J. Gerraty case "$1" in 93*98875883SSimon J. Gerraty --) shift; break;; 94*98875883SSimon J. Gerraty -[bc]) ;; # ignore 95*98875883SSimon J. Gerraty -p) CP_p=-p;; 96*98875883SSimon J. Gerraty -x) set -x;; 97*98875883SSimon J. Gerraty -B) OLD_EXT=$2; shift;; 98*98875883SSimon J. Gerraty -C) compare=Different;; 99*98875883SSimon J. Gerraty -N) newer=Newer; 100*98875883SSimon J. Gerraty # check if /bin/ls supports -1 101*98875883SSimon J. Gerraty 'ls' -1 $0 > /dev/null 2>&1 && LS_1=1 102*98875883SSimon J. Gerraty ;; 103*98875883SSimon J. Gerraty -o) owner="${CHOWN:-chown} $2 "; shift;; 104*98875883SSimon J. Gerraty -g) group="${CHGRP:-chgrp} $2 "; shift;; 105*98875883SSimon J. Gerraty -m) MODE=$2 mode="${CHMOD:-chmod} $2 "; shift;; 106*98875883SSimon J. Gerraty -s) strip=${STRIP:-strip};; 107*98875883SSimon J. Gerraty -d) mkdirs="mkdir -p";; 108*98875883SSimon J. Gerraty -i) ignore_err="$ignore_err$2"; shift;; 109*98875883SSimon J. Gerraty -f) chflags="${CHFLAGS:-chflags} $2 "; shift;; 110*98875883SSimon J. Gerraty *) break;; 111*98875883SSimon J. Gerraty esac 112*98875883SSimon J. Gerraty shift 113*98875883SSimon J. Gerratydone 114*98875883SSimon J. Gerraty 115*98875883SSimon J. GerratyNewer() { 116*98875883SSimon J. Gerraty n=`'ls' -t$LS_1 $* 2> /dev/null | head -1` 117*98875883SSimon J. Gerraty [ $1 = $n ] 118*98875883SSimon J. Gerraty} 119*98875883SSimon J. Gerraty 120*98875883SSimon J. GerratyDifferent() { 121*98875883SSimon J. Gerraty cmp -s $* 122*98875883SSimon J. Gerraty [ $? != 0 ] 123*98875883SSimon J. Gerraty} 124*98875883SSimon J. Gerraty 125*98875883SSimon J. GerratyErr() { 126*98875883SSimon J. Gerraty case "$ignore_err" in 127*98875883SSimon J. Gerraty *$1*) ;; 128*98875883SSimon J. Gerraty *) exit 1;; 129*98875883SSimon J. Gerraty esac 130*98875883SSimon J. Gerraty} 131*98875883SSimon J. Gerraty 132*98875883SSimon J. GerratySetem() { 133*98875883SSimon J. Gerraty # the order is important 134*98875883SSimon J. Gerraty if [ ! -d $1 ]; then 135*98875883SSimon J. Gerraty $strip $1 || Err s 136*98875883SSimon J. Gerraty fi 137*98875883SSimon J. Gerraty $group $1 || Err g 138*98875883SSimon J. Gerraty $owner $1 || Err o 139*98875883SSimon J. Gerraty $mode $1 || Err m 140*98875883SSimon J. Gerraty $chflags $1 || Err f 141*98875883SSimon J. Gerraty return 0 142*98875883SSimon J. Gerraty} 143*98875883SSimon J. Gerraty 144*98875883SSimon J. Gerraty# a bug in HP-UX's /bin/sh, means we need to re-set $* 145*98875883SSimon J. Gerraty# after any calls to add_path() 146*98875883SSimon J. Gerratyargs="$*" 147*98875883SSimon J. Gerraty 148*98875883SSimon J. Gerratyadd_path () { 149*98875883SSimon J. Gerraty test -d $1 || return 150*98875883SSimon J. Gerraty case ":$PATH:" in 151*98875883SSimon J. Gerraty *:$1:*) return;; 152*98875883SSimon J. Gerraty esac 153*98875883SSimon J. Gerraty PATH=$PATH:$1 154*98875883SSimon J. Gerraty} 155*98875883SSimon J. Gerraty 156*98875883SSimon J. Gerratyadd_path /sbin 157*98875883SSimon J. Gerratyadd_path /usr/sbin 158*98875883SSimon J. Gerraty 159*98875883SSimon J. Gerratycase "$owner" in 160*98875883SSimon J. Gerraty:) ;; 161*98875883SSimon J. Gerraty*) # some systems put chown in odd places 162*98875883SSimon J. Gerraty add_path /etc 163*98875883SSimon J. Gerraty add_path /usr/etc 164*98875883SSimon J. Gerraty ;; 165*98875883SSimon J. Gerratyesac 166*98875883SSimon J. Gerraty 167*98875883SSimon J. Gerraty# restore saved $* 168*98875883SSimon J. Gerratyset -- $args 169*98875883SSimon J. Gerraty 170*98875883SSimon J. Gerraty# make directories if needed 171*98875883SSimon J. Gerraty# and ensure mode etc are as desired 172*98875883SSimon J. Gerratyif [ "$mkdirs" ]; then 173*98875883SSimon J. Gerraty case "$MODE" in 174*98875883SSimon J. Gerraty [1-7]*) 175*98875883SSimon J. Gerraty # make sure umask is compatible 176*98875883SSimon J. Gerraty case "$MODE" in 177*98875883SSimon J. Gerraty ????*) MODE=`echo $MODE | sed 's,.*\(...\)$,\1,'`;; 178*98875883SSimon J. Gerraty esac 179*98875883SSimon J. Gerraty umask `expr 0777 - 0$MODE | 180*98875883SSimon J. Gerraty sed 's,^,000,;s,^.*\(...\)$,\1,'`;; 181*98875883SSimon J. Gerraty esac 182*98875883SSimon J. Gerraty for d in $* 183*98875883SSimon J. Gerraty do 184*98875883SSimon J. Gerraty [ ! -d $d ] && $mkdirs $d 185*98875883SSimon J. Gerraty Setem $d 186*98875883SSimon J. Gerraty done 187*98875883SSimon J. Gerraty exit 0 # that's all we do 188*98875883SSimon J. Gerratyfi 189*98875883SSimon J. Gerraty 190*98875883SSimon J. Gerraty# install files 191*98875883SSimon J. Gerratyif [ $# -eq 1 ]; then 192*98875883SSimon J. Gerraty echo "what should I do with $*?" >&2 193*98875883SSimon J. Gerraty exit 1 194*98875883SSimon J. Gerratyfi 195*98875883SSimon J. Gerraty 196*98875883SSimon J. Gerraty# get list of files 197*98875883SSimon J. Gerratyfiles= 198*98875883SSimon J. Gerratywhile [ $# -gt 1 ] 199*98875883SSimon J. Gerratydo 200*98875883SSimon J. Gerraty test "x$files" = x || dest_dir=yes 201*98875883SSimon J. Gerraty files="$files $1" 202*98875883SSimon J. Gerraty shift 203*98875883SSimon J. Gerratydone 204*98875883SSimon J. Gerraty# last one is dest 205*98875883SSimon J. Gerratydest=$1 206*98875883SSimon J. Gerratyshift 207*98875883SSimon J. Gerraty 208*98875883SSimon J. Gerratyif [ "$dest_dir" = yes -a ! -d $dest ]; then 209*98875883SSimon J. Gerraty echo "no directory $dest" >&2 210*98875883SSimon J. Gerraty exit 1 211*98875883SSimon J. Gerratyfi 212*98875883SSimon J. Gerraty 213*98875883SSimon J. Gerratyfor f in $files 214*98875883SSimon J. Gerratydo 215*98875883SSimon J. Gerraty b=`basename $f` 216*98875883SSimon J. Gerraty if [ -d $dest ]; then 217*98875883SSimon J. Gerraty t=$dest/$b 218*98875883SSimon J. Gerraty else 219*98875883SSimon J. Gerraty t=$dest 220*98875883SSimon J. Gerraty fi 221*98875883SSimon J. Gerraty $newer $f $t || continue 222*98875883SSimon J. Gerraty $compare $f $t || continue 223*98875883SSimon J. Gerraty [ -f $t ] && { mv -f $t $t$OLD_EXT || exit 1; } 224*98875883SSimon J. Gerraty { cp $CP_p $f $t && Setem $t; } || exit 1 225*98875883SSimon J. Gerratydone 226*98875883SSimon J. Gerratyexit 0 227