[BACK]Return to install-sh CVS log [TXT][DIR] Up to [local] / src / usr.bin / sudo

Annotation of src/usr.bin/sudo/install-sh, Revision 1.3

1.1       millert     1: #! /bin/sh
                      2:
                      3: ## (From INN-1.4, written by Rich Salz)
                      4: ##  $Revision: 1.4 $
                      5: ##  A script to install files and directories.
                      6:
                      7: PROGNAME=`basename $0`
                      8:
                      9: ##  Paths to programs.  CHOWN, STRIP and WHOAMI are checked below.
                     10: CHOWN=chown
                     11: CHGRP=chgrp
                     12: CHMOD=chmod
                     13: CP=cp
                     14: LN=ln
                     15: MKDIR=mkdir
                     16: MV=mv
                     17: RM=rm
                     18: STRIP=strip
                     19: WHOAMI=whoami
                     20:
                     21: ##  Some systems don't support -x, so we have to use -f.
                     22: if [ ${CHOWN} = chown ] ; then
1.3     ! millert    23:     if [ -f /sbin/chown ] ; then
        !            24:        CHOWN=/sbin/chown
        !            25:     elif [ -f /etc/chown ] ; then
1.1       millert    26:        CHOWN=/etc/chown
1.3     ! millert    27:     elif [ -f /usr/sbin/chown ] ; then
        !            28:        CHOWN=/usr/sbin/chown
1.1       millert    29:     elif [ -f /usr/etc/chown ] ; then
                     30:        CHOWN=/usr/etc/chown
                     31:     fi
                     32: fi
                     33:
                     34: if [ ${WHOAMI} = whoami ] ; then
                     35:     if [ -f /usr/ucb/whoami ] ; then
                     36:        WHOAMI=/usr/ucb/whoami
                     37:     elif [ -f /usr/bin/whoami ] ; then
                     38:        WHOAMI=/usr/bin/whoami
                     39:     fi
                     40: fi
                     41:
                     42: if [ ${STRIP} = strip ] ; then
                     43:     if [ -f /usr/ccs/bin/strip ] ; then
                     44:        STRIP=/usr/ccs/bin/strip
                     45:     elif [ -f /usr/bin/strip ] ; then
                     46:        STRIP=/usr/bin/strip
                     47:     fi
                     48: fi
                     49:
                     50: ##  Defaults.
                     51: CHOWNIT=false
                     52: CHGROUPIT=false
                     53: CHMODIT=false
                     54: STRIPIT=false
                     55: BACKIT=false
                     56: TOUCHIT=true
                     57: SAVESRC=false
                     58: ROOT=unknown
                     59:
                     60: ##  Process JCL.
                     61: MORETODO=true
                     62: while ${MORETODO} ; do
                     63:     case X"$1" in
                     64:     X-b)
                     65:        BACKIT=true
                     66:        BACKUP="$2"
                     67:        shift
                     68:        ;;
                     69:     X-b*)
                     70:        BACKIT=true
                     71:        BACKUP=`expr "$1" : '-b\(.*\)'`
                     72:        ;;
                     73:     X-c)
                     74:        SAVESRC=true
                     75:        ;;
                     76:     X-g)
                     77:        GROUP="$2"
                     78:        CHGROUPIT=true
                     79:        shift
                     80:        ;;
                     81:     X-g*)
                     82:        GROUP=`expr "$1" : '-g\(.*\)'`
                     83:        CHGROUPIT=true
                     84:        ;;
                     85:     X-G)
                     86:        case ${ROOT} in
                     87:        unknown)
                     88:            case `${WHOAMI}` in
                     89:            root)
                     90:                ROOT=true
                     91:                ;;
                     92:            *)
                     93:                ROOT=false
                     94:                ;;
                     95:            esac
                     96:            ;;
                     97:        esac
                     98:        GROUP="$2"
                     99:        shift
                    100:        ${ROOT} && CHGROUPIT=true
                    101:        ;;
                    102:     X-G*)
                    103:        case ${ROOT} in
                    104:        unknown)
                    105:            case `${WHOAMI}` in
                    106:            root)
                    107:                ROOT=true
                    108:                ;;
                    109:            *)
                    110:                ROOT=false
                    111:                ;;
                    112:            esac
                    113:            ;;
                    114:        esac
                    115:        if ${ROOT} ; then
                    116:            GROUP=`expr "$1" : '-g\(.*\)'`
                    117:            CHGROUPIT=true
                    118:        fi
                    119:        ;;
                    120:     X-m)
                    121:        MODE="$2"
                    122:        CHMODIT=true
                    123:        shift
                    124:        ;;
                    125:     X-m*)
                    126:        MODE=`expr "$1" : '-m\(.*\)'`
                    127:        CHMODIT=true
                    128:        ;;
                    129:     X-n)
                    130:        TOUCHIT=false
                    131:        ;;
                    132:     X-o)
                    133:        OWNER="$2"
                    134:        CHOWNIT=true
                    135:        shift
                    136:        ;;
                    137:     X-o*)
                    138:        OWNER=`expr "$1" : '-o\(.*\)'`
                    139:        CHOWNIT=true
                    140:        ;;
                    141:     X-O)
                    142:        case ${ROOT} in
                    143:        unknown)
                    144:            case `${WHOAMI}` in
                    145:            root)
                    146:                ROOT=true
                    147:                ;;
                    148:            *)
                    149:                ROOT=false
                    150:                ;;
                    151:            esac
                    152:            ;;
                    153:        esac
                    154:        OWNER="$2"
                    155:        shift
                    156:        ${ROOT} && CHOWNIT=true
                    157:        ;;
                    158:     X-O*)
                    159:        case ${ROOT} in
                    160:        unknown)
                    161:            case `${WHOAMI}` in
                    162:            root)
                    163:                ROOT=true
                    164:                ;;
                    165:            *)
                    166:                ROOT=false
                    167:                ;;
                    168:            esac
                    169:            ;;
                    170:        esac
                    171:        if ${ROOT} ; then
                    172:            OWNER=`expr "$1" : '-o\(.*\)'`
                    173:            CHOWNIT=true
                    174:        fi
                    175:        ;;
                    176:     X-s)
                    177:        STRIPIT=true
                    178:        ;;
                    179:     X--)
                    180:        shift
                    181:        MORETODO=false
                    182:        ;;
                    183:     X-*)
                    184:        echo "${PROGNAME}:  Unknown flag $1" 1>&2
                    185:        exit 1
                    186:        ;;
                    187:     *)
                    188:        MORETODO=false
                    189:        ;;
                    190:     esac
                    191:     ${MORETODO} && shift
                    192: done
                    193:
                    194: ##  Process arguments.
                    195: if [ $# -ne 2 ] ; then
                    196:     echo "Usage:  ${PROGNAME} [flags] source destination"
                    197:     exit 1
                    198: fi
                    199:
                    200: ##  Making a directory?
                    201: if [ X"$1" = X. ] ; then
                    202:     DEST="$2"
                    203:     if [ ! -d "${DEST}" ] ; then
                    204:        ${MKDIR} "${DEST}" || exit 1
                    205:     fi
                    206:     if ${CHOWNIT} ; then
                    207:        ${CHOWN} "${OWNER}" "${DEST}" || exit 1
                    208:     fi
                    209:     if ${CHGROUPIT} ; then
                    210:        ${CHGRP} "${GROUP}" "${DEST}" || exit 1
                    211:     fi
                    212:     if ${CHMODIT} ; then
                    213:        umask 0
                    214:        ${CHMOD} "${MODE}"  "${DEST}" || exit 1
                    215:     fi
                    216:     exit 0
                    217: fi
                    218:
                    219: ##  Get the destination and a temp file in the destination diretory.
                    220: if [ -d "$2" ] ; then
                    221:     DEST="$2/$1"
                    222:     TEMP="$2/$$.tmp"
                    223: else
                    224:     DEST="$2"
                    225:     TEMP="`expr "$2" : '\(.*\)/.*'`/$$.tmp"
                    226: fi
                    227:
                    228: ##  If not given the same name, we must try to copy.
                    229: if [ X"$1" != X"$2" -o $SAVESRC ] ; then
                    230:     if cmp -s "$1" "${DEST}" ; then
                    231:        ##  Files are same; touch or not.
                    232:        ${TOUCHIT} && touch "${DEST}"
                    233:     else
                    234:        ##  If destination exists and we wish to backup, link to backup.
                    235:        if [ -f "${DEST}" ] ; then
                    236:            if ${BACKIT} ; then
                    237:                ${RM} -f "${DEST}${BACKUP}"
                    238:                ${LN} "${DEST}" "${DEST}${BACKUP}"
                    239:            fi
                    240:        fi
                    241:        ##  Copy source to the right dir, then move to right spot.
                    242:        ##  Done in two parts so we can hope for atomicity.
                    243:        ${RM} -f "${TEMP}" || exit 1
                    244:        ${CP} "$1" "${TEMP}" || exit 1
                    245:        ${MV} -f "${TEMP}" "${DEST}" || exit 1
                    246:     fi
                    247: fi
                    248:
                    249: ##  Strip and set the modes.
                    250: if ${STRIPIT} ; then
                    251:     ${STRIP} "${DEST}" || exit 1
                    252: fi
                    253: if ${CHOWNIT} ; then
                    254:     ${CHOWN} "${OWNER}" "${DEST}" || exit 1
                    255: fi
                    256: if ${CHGROUPIT} ; then
                    257:     ${CHGRP} "${GROUP}" "${DEST}" || exit 1
                    258: fi
                    259: if ${CHMODIT} ; then
                    260:     umask 0
                    261:     ${CHMOD} "${MODE}"  "${DEST}" || exit 1
                    262: fi
                    263: exit 0