Update copyright annotations and license boilerplates to correspond with SGI Legals...
[xfstests-dev.git] / install-sh
1 #! /bin/sh
2 #
3 # Copyright (c) 2000-2001 Silicon Graphics, Inc.  All Rights Reserved.
4 #
5 # This script emulates bsd install and also recognises
6 # two environment variables, with the following semantics :-
7 #
8 # $DIST_MANIFEST - if set, the name of the file to append manifest
9 #                  information in the following format:
10 #                  File     :  f mode owner group src target
11 #                  Directory:  d mode owner group target
12 #                  Symlink  :  l linkval target
13 #
14 # $DIST_ROOT     - if set, prepend to target
15 #
16 # The sematics of all combinations of these two variables
17 # are as follows:
18 #
19 # $DIST_MANIFEST?  $DIST_ROOT? |   Copy?  Append Manifest?
20 # -----------------------------+--------------------------
21 #       not set       not set  |    yes        no
22 #       not set       set      |    yes        no
23 #       set           not set  |    no         yes
24 #       set           set      |    yes        yes
25 #
26 _usage() {
27     echo "Usage: $prog [-o owner] [-g group] [-m mode] -d directory"
28     echo "or     $prog [-D] [-o owner] [-g group] [-m mode] file directory/file"
29     echo "or     $prog [-o owner] [-g group] [-m mode] file [file ...] directory"
30     echo "or     $prog -S file target  (creates \"target\" symlink)"
31     echo ""
32     echo "The \$DIST_MANIFEST and \$DIST_ROOT environment variables affect the"
33     echo "behaviour of this command - see comments in the script."
34     echo "The -D flag is only available for the second usage, and causes"
35     echo "the target directory to be created before installing the file."
36     echo ""
37     exit 1
38 }
39
40 _chown ()
41 {
42     _st=255
43     if [ $# -eq 3 ] ; then
44         chown $1:$2 $3
45         _st=$?
46         if [ $_st -ne 0 ] ; then
47             if [ $REAL_UID != '0' ] ; then
48                 if [ ! -f $DIST_ROOT/.chown.quite ] ; then
49                     echo '==============================================='
50                     echo Ownership of files under ${DIST_ROOT:-/}
51                     echo cannot be changed
52                     echo '==============================================='
53                     if [ -n "$DIST_ROOT" ] ; then
54                         touch $DIST_ROOT/.chown.quite
55                     fi
56                 fi
57                _st=0
58             fi     
59         fi
60     fi
61
62     return $_st
63 }
64
65
66 _manifest ()
67
68     echo $* | sed -e 's/\/\//\//g' >>${DIST_MANIFEST:-/dev/null}
69 }
70
71 prog=`basename $0`
72 HERE=`pwd`
73 dflag=false
74 Dflag=false
75 Sflag=false
76 DIRMODE=755
77 FILEMODE=644
78 OWNER=`id -u`
79 GROUP=`id -g`
80 REAL_UID=$OWNER
81
82 # default is to install and don't append manifest
83 INSTALL=true
84 MANIFEST=:
85
86 [ -n "$DIST_MANIFEST" -a -z "$DIST_ROOT" ] && INSTALL=false
87 [ -n "$DIST_MANIFEST" ] && MANIFEST="_manifest"
88
89 [ $# -eq 0 ] && _usage
90
91 if $INSTALL
92 then
93     CP=cp; LN=ln; MKDIR=mkdir; CHMOD=chmod; CHOWN=_chown
94 else
95     CP=true; LN=true; MKDIR=true; CHMOD=true; CHOWN=true
96 fi
97
98 [ -n "$DIST_ROOT" -a $REAL_UID -ne 0 ] && CHOWN=true
99
100 while getopts "Dcm:d:S:o:g:" c $*
101 do
102    case $c in
103    c)
104         ;;
105    g)
106         GROUP=$OPTARG
107         ;;
108    o)
109         OWNER=$OPTARG
110         ;;
111    m)
112         DIRMODE=`expr $OPTARG`
113         FILEMODE=$DIRMODE
114         ;;
115    D) 
116         Dflag=true
117         ;;
118    S) 
119         symlink=$OPTARG
120         Sflag=true
121         ;;
122    d) 
123         dir=$DIST_ROOT/$OPTARG
124         dflag=true
125         ;;
126    *)
127         _usage
128         ;;
129    esac
130 done
131
132 shift `expr $OPTIND - 1`
133
134 status=0
135 if $dflag
136 then
137     #
138     # first usage
139     #
140     $MKDIR -p $dir 
141     status=$?
142     if [ $status -eq 0 ]
143     then
144         $CHMOD $DIRMODE $dir
145         status=$?
146     fi
147     if [ $status -eq 0 ]
148     then
149         $CHOWN $OWNER $GROUP $dir
150         status=$?
151     fi
152     $MANIFEST d $DIRMODE $OWNER $GROUP ${dir#$DIST_ROOT}
153 elif $Sflag
154 then
155     #
156     # fourth usage (symlink)
157     #
158     if [ $# -ne 1 ]
159     then
160         _usage
161     else
162         target=$DIST_ROOT/$1
163     fi
164     $LN -s -f $symlink $target
165     status=$?
166     $MANIFEST l $symlink ${target#$DIST_ROOT} 
167 else
168     list=""
169     dir=""
170     if [ $# -eq 2 ]
171     then
172         #
173         # second usage
174         #
175         f=$1
176         dir=$DIST_ROOT/$2
177         if $Dflag
178         then
179             mkdir -p `dirname $dir`
180         fi
181         $CP $f $dir
182         status=$?
183         if [ $status -eq 0 ]
184         then 
185             if [ -f $dir/$f ]
186             then
187                 $CHMOD $FILEMODE $dir/$f
188                 status=$?
189                 if [ $status -eq 0 ]
190                 then
191                     $CHOWN $OWNER $GROUP $dir/$f
192                     status=$?
193                 fi
194                 $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f
195             else
196                 $CHMOD $FILEMODE $dir
197                 status=$?
198                 if [ $status -eq 0 ]
199                 then
200                     $CHOWN $OWNER $GROUP $dir
201                     status=$?
202                 fi
203                 $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$dir ${dir#$DIST_ROOT}
204             fi
205         fi
206     else
207         #
208         # third usage
209         #
210         n=1
211         while [ $# -gt 0 ]
212         do
213             if [ $# -gt 1 ]
214             then
215                 list="$list $1"
216             else
217                 dir=$DIST_ROOT/$1
218             fi
219             shift
220         done
221
222         # echo DIR=$dir list=\"$list\"
223         for f in $list
224         do
225             $CP $f $dir
226             status=$?
227             if [ $status -eq 0 ]
228             then
229                 $CHMOD $FILEMODE $dir/$f
230                 status=$?
231                 if [ $status -eq 0 ]
232                 then
233                     $CHOWN $OWNER $GROUP $dir/$f
234                     status=$?
235                 fi
236                 $MANIFEST f $FILEMODE $OWNER $GROUP $HERE/$f ${dir#$DIST_ROOT}/$f
237             fi
238             [ $status -ne 0 ] && break
239         done
240     fi
241 fi
242
243 exit $status