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