| #! /bin/sh | |
| ## (From INN-1.4, written by Rich Salz) | |
| ## $Revision$ | |
| ## A script to install files and directories. | |
| PROGNAME=`basename $0` | |
| ## Paths to programs. CHOWN, STRIP and WHOAMI are checked below. | |
| CHOWN=chown | |
| CHGRP=chgrp | |
| CHMOD=chmod | |
| CP=cp | |
| LN=ln | |
| MKDIR=mkdir | |
| MV=mv | |
| RM=rm | |
| STRIP=strip | |
| WHOAMI="echo root" | |
| ## Some systems don't support -x, so we have to use -f. | |
| for d in /sbin /etc /usr/sbin /usr/etc; do | |
| if [ -f $d/chown ]; then | |
| CHOWN=${d}/chown | |
| break | |
| fi | |
| done | |
| for d in /usr/bin /bin /usr/ucb /usr/bsd; do | |
| if [ -f $d/whoami ]; then | |
| WHOAMI=${d}/whoami | |
| break | |
| elif [ -f $d/id ]; then | |
| WHOAMI=${d}/id | sed -n 's/^[^(]*(\([^)]*\)).*/\1/p' | |
| fi | |
| done | |
| for d in /usr/ccs/bin /usr/bin /bin; do | |
| if [ -f $d/strip ]; then | |
| STRIP=${d}/strip | |
| break | |
| fi | |
| done | |
| ## Defaults. | |
| CHOWNIT=false | |
| CHGROUPIT=false | |
| CHMODIT=false | |
| STRIPIT=false | |
| BACKIT=false | |
| TOUCHIT=true | |
| DIRMODE=false | |
| case `${WHOAMI}` in | |
| root) | |
| ROOT=true | |
| ;; | |
| *) | |
| ROOT=false | |
| ;; | |
| esac | |
| ## Process JCL. | |
| MORETODO=true | |
| while ${MORETODO} ; do | |
| case X"$1" in | |
| X-b) | |
| BACKIT=true | |
| BACKUP="$2" | |
| shift | |
| ;; | |
| X-b*) | |
| BACKIT=true | |
| BACKUP=`expr "$1" : '-b\(.*\)'` | |
| ;; | |
| X-c) | |
| # backwards compatibility | |
| ;; | |
| X-d) | |
| DIRMODE=true | |
| ;; | |
| X-g) | |
| GROUP="$2" | |
| CHGROUPIT=true | |
| shift | |
| ;; | |
| X-g*) | |
| GROUP=`expr "$1" : '-g\(.*\)'` | |
| CHGROUPIT=true | |
| ;; | |
| X-G) | |
| GROUP="$2" | |
| shift | |
| ${ROOT} && CHGROUPIT=true | |
| ;; | |
| X-G*) | |
| if ${ROOT} ; then | |
| GROUP=`expr "$1" : '-g\(.*\)'` | |
| CHGROUPIT=true | |
| fi | |
| ;; | |
| X-m) | |
| MODE="$2" | |
| CHMODIT=true | |
| shift | |
| ;; | |
| X-m*) | |
| MODE=`expr "$1" : '-m\(.*\)'` | |
| CHMODIT=true | |
| ;; | |
| X-M) | |
| MODE="$2" | |
| ${ROOT} && CHMODIT=true | |
| shift | |
| ;; | |
| X-M*) | |
| MODE=`expr "$1" : '-m\(.*\)'` | |
| ${ROOT} && CHMODIT=true | |
| ;; | |
| X-n) | |
| TOUCHIT=false | |
| ;; | |
| X-o) | |
| OWNER="$2" | |
| CHOWNIT=true | |
| shift | |
| ;; | |
| X-o*) | |
| OWNER=`expr "$1" : '-o\(.*\)'` | |
| CHOWNIT=true | |
| ;; | |
| X-O) | |
| OWNER="$2" | |
| shift | |
| ${ROOT} && CHOWNIT=true | |
| ;; | |
| X-O*) | |
| if ${ROOT} ; then | |
| OWNER=`expr "$1" : '-o\(.*\)'` | |
| CHOWNIT=true | |
| fi | |
| ;; | |
| X-s) | |
| STRIPIT=true | |
| ;; | |
| X--) | |
| shift | |
| MORETODO=false | |
| ;; | |
| X-*) | |
| echo "${PROGNAME}: Unknown flag $1" 1>&2 | |
| exit 1 | |
| ;; | |
| *) | |
| MORETODO=false | |
| ;; | |
| esac | |
| ${MORETODO} && shift | |
| done | |
| ## Making a directory? | |
| if ${DIRMODE} ; then | |
| while test $# != 0; do | |
| DEST="$1" | |
| if [ ! -d "${DEST}" ] ; then | |
| ${MKDIR} "${DEST}" || exit 1 | |
| fi | |
| if ${CHOWNIT} ; then | |
| ${CHOWN} "${OWNER}" "${DEST}" || exit 1 | |
| fi | |
| if ${CHGROUPIT} ; then | |
| ${CHGRP} "${GROUP}" "${DEST}" || exit 1 | |
| fi | |
| if ${CHMODIT} ; then | |
| ${CHMOD} "${MODE}" "${DEST}" || exit 1 | |
| fi | |
| shift; | |
| done | |
| exit 0 | |
| fi | |
| ## Process arguments. | |
| if [ $# -ne 2 ] ; then | |
| echo "Usage: ${PROGNAME} [flags] source destination" | |
| exit 1 | |
| fi | |
| ## Get the destination and a temp file in the destination diretory. | |
| if [ -d "$2" ] ; then | |
| DEST="$2/`basename $1`" | |
| TEMP="$2/$$.tmp" | |
| else | |
| DEST="$2" | |
| TEMP="`expr "$2" : '\(.*\)/.*'`/$$.tmp" | |
| fi | |
| ## If not given the same name, we must try to copy. | |
| if [ X"$1" != X"$2" ] ; then | |
| if cmp -s "$1" "${DEST}" ; then | |
| ## Files are same; touch or not. | |
| ${TOUCHIT} && touch "${DEST}" | |
| else | |
| ## If destination exists and we wish to backup, link to backup. | |
| if [ -f "${DEST}" ] ; then | |
| if ${BACKIT} ; then | |
| ${RM} -f "${DEST}${BACKUP}" | |
| ${LN} "${DEST}" "${DEST}${BACKUP}" | |
| fi | |
| fi | |
| ## Copy source to the right dir, then move to right spot. | |
| ## Done in two parts so we can hope for atomicity. | |
| ## We need to rm DEST due to bugs in "mv -f" on some systems. | |
| ${RM} -f "${TEMP}" || exit 1 | |
| ${CP} "$1" "${TEMP}" || exit 1 | |
| ${RM} -f "${DEST}" || exit 1 | |
| ${MV} -f "${TEMP}" "${DEST}" || exit 1 | |
| fi | |
| fi | |
| ## Strip and set the modes. | |
| if ${STRIPIT} ; then | |
| ${STRIP} "${DEST}" || exit 1 | |
| fi | |
| if ${CHOWNIT} ; then | |
| ${CHOWN} "${OWNER}" "${DEST}" || exit 1 | |
| fi | |
| if ${CHGROUPIT} ; then | |
| ${CHGRP} "${GROUP}" "${DEST}" || exit 1 | |
| fi | |
| if ${CHMODIT} ; then | |
| ${CHMOD} "${MODE}" "${DEST}" || exit 1 | |
| fi | |
| exit 0 |