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