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