add doc about interaction with RAMRUN to README.Debian in response to #581393
[debian/sudo] / install-sh
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 SAVESRC=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=`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         ;;
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         ;;
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/`basename $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