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