Annotation of src/usr.bin/sudo/install-sh, Revision 1.2
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