masqmail-0.2

view install-sh @ 179:ec3fe72a3e99

Fixed an important bug with folded headers! g_strconcat() returns a *copy* of the string, but hdr->value still pointed to the old header (which probably was a memory leak, too). If the folded part had been quite small it was likely that the new string was at the same position as the old one, thus making everything go well. But if pretty long headers were folded several times it was likely that the new string was allocated somewhere else in memory, thus breaking things. In result mails to lots of recipients (folded header) were frequently only sent to the ones in the first line. Sorry for the inconvenience.
author meillo@marmaro.de
date Fri, 03 Jun 2011 09:52:17 +0200
parents
children
line source
1 #!/bin/sh
2 #
3 # install - install a program, script, or datafile
4 # This comes from X11R5 (mit/util/scripts/install.sh).
5 #
6 # Copyright 1991 by the Massachusetts Institute of Technology
7 #
8 # Permission to use, copy, modify, distribute, and sell this software and its
9 # documentation for any purpose is hereby granted without fee, provided that
10 # the above copyright notice appear in all copies and that both that
11 # copyright notice and this permission notice appear in supporting
12 # documentation, and that the name of M.I.T. not be used in advertising or
13 # publicity pertaining to distribution of the software without specific,
14 # written prior permission. M.I.T. makes no representations about the
15 # suitability of this software for any purpose. It is provided "as is"
16 # without express or implied warranty.
17 #
18 # Calling this script install-sh is preferred over install.sh, to prevent
19 # `make' implicit rules from creating a file called install from it
20 # when there is no Makefile.
21 #
22 # This script is compatible with the BSD install script, but was written
23 # from scratch. It can only install one file at a time, a restriction
24 # shared with many OS's install programs.
27 # set DOITPROG to echo to test this script
29 # Don't use :- since 4.3BSD and earlier shells don't like it.
30 doit="${DOITPROG-}"
33 # put in absolute paths if you don't have them in your path; or use env. vars.
35 mvprog="${MVPROG-mv}"
36 cpprog="${CPPROG-cp}"
37 chmodprog="${CHMODPROG-chmod}"
38 chownprog="${CHOWNPROG-chown}"
39 chgrpprog="${CHGRPPROG-chgrp}"
40 stripprog="${STRIPPROG-strip}"
41 rmprog="${RMPROG-rm}"
42 mkdirprog="${MKDIRPROG-mkdir}"
44 transformbasename=""
45 transform_arg=""
46 instcmd="$mvprog"
47 chmodcmd="$chmodprog 0755"
48 chowncmd=""
49 chgrpcmd=""
50 stripcmd=""
51 rmcmd="$rmprog -f"
52 mvcmd="$mvprog"
53 src=""
54 dst=""
55 dir_arg=""
57 while [ x"$1" != x ]; do
58 case $1 in
59 -c) instcmd="$cpprog"
60 shift
61 continue;;
63 -d) dir_arg=true
64 shift
65 continue;;
67 -m) chmodcmd="$chmodprog $2"
68 shift
69 shift
70 continue;;
72 -o) chowncmd="$chownprog $2"
73 shift
74 shift
75 continue;;
77 -g) chgrpcmd="$chgrpprog $2"
78 shift
79 shift
80 continue;;
82 -s) stripcmd="$stripprog"
83 shift
84 continue;;
86 -t=*) transformarg=`echo $1 | sed 's/-t=//'`
87 shift
88 continue;;
90 -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
91 shift
92 continue;;
94 *) if [ x"$src" = x ]
95 then
96 src=$1
97 else
98 # this colon is to work around a 386BSD /bin/sh bug
99 :
100 dst=$1
101 fi
102 shift
103 continue;;
104 esac
105 done
107 if [ x"$src" = x ]
108 then
109 echo "install: no input file specified"
110 exit 1
111 else
112 true
113 fi
115 if [ x"$dir_arg" != x ]; then
116 dst=$src
117 src=""
119 if [ -d $dst ]; then
120 instcmd=:
121 chmodcmd=""
122 else
123 instcmd=mkdir
124 fi
125 else
127 # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
128 # might cause directories to be created, which would be especially bad
129 # if $src (and thus $dsttmp) contains '*'.
131 if [ -f $src -o -d $src ]
132 then
133 true
134 else
135 echo "install: $src does not exist"
136 exit 1
137 fi
139 if [ x"$dst" = x ]
140 then
141 echo "install: no destination specified"
142 exit 1
143 else
144 true
145 fi
147 # If destination is a directory, append the input filename; if your system
148 # does not like double slashes in filenames, you may need to add some logic
150 if [ -d $dst ]
151 then
152 dst="$dst"/`basename $src`
153 else
154 true
155 fi
156 fi
158 ## this sed command emulates the dirname command
159 dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
161 # Make sure that the destination directory exists.
162 # this part is taken from Noah Friedman's mkinstalldirs script
164 # Skip lots of stat calls in the usual case.
165 if [ ! -d "$dstdir" ]; then
166 defaultIFS='
167 '
168 IFS="${IFS-${defaultIFS}}"
170 oIFS="${IFS}"
171 # Some sh's can't handle IFS=/ for some reason.
172 IFS='%'
173 set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
174 IFS="${oIFS}"
176 pathcomp=''
178 while [ $# -ne 0 ] ; do
179 pathcomp="${pathcomp}${1}"
180 shift
182 if [ ! -d "${pathcomp}" ] ;
183 then
184 $mkdirprog "${pathcomp}"
185 else
186 true
187 fi
189 pathcomp="${pathcomp}/"
190 done
191 fi
193 if [ x"$dir_arg" != x ]
194 then
195 $doit $instcmd $dst &&
197 if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
198 if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
199 if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
200 if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
201 else
203 # If we're going to rename the final executable, determine the name now.
205 if [ x"$transformarg" = x ]
206 then
207 dstfile=`basename $dst`
208 else
209 dstfile=`basename $dst $transformbasename |
210 sed $transformarg`$transformbasename
211 fi
213 # don't allow the sed command to completely eliminate the filename
215 if [ x"$dstfile" = x ]
216 then
217 dstfile=`basename $dst`
218 else
219 true
220 fi
222 # Make a temp file name in the proper directory.
224 dsttmp=$dstdir/#inst.$$#
226 # Move or copy the file name to the temp name
228 $doit $instcmd $src $dsttmp &&
230 trap "rm -f ${dsttmp}" 0 &&
232 # and set any options; do chmod last to preserve setuid bits
234 # If any of these fail, we abort the whole thing. If we want to
235 # ignore errors from any of these, just make sure not to ignore
236 # errors from the above "$doit $instcmd $src $dsttmp" command.
238 if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
239 if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
240 if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
241 if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
243 # Now rename the file to the real destination.
245 $doit $rmcmd -f $dstdir/$dstfile &&
246 $doit $mvcmd $dsttmp $dstdir/$dstfile
248 fi &&
251 exit 0