| #! /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 |