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