xref: /freebsd/contrib/openpam/install-sh (revision b33ab32994ffe18ef58799f3bf6f347b63dbb7a5)
1ca236e63SDag-Erling Smørgrav#!/bin/sh
2ca236e63SDag-Erling Smørgrav# install - install a program, script, or datafile
3b33ab329SDag-Erling Smørgrav
4b33ab329SDag-Erling Smørgravscriptversion=2004-04-01.17
5b33ab329SDag-Erling Smørgrav
6b33ab329SDag-Erling Smørgrav# This originates from X11R5 (mit/util/scripts/install.sh), which was
7b33ab329SDag-Erling Smørgrav# later released in X11R6 (xc/config/util/install.sh) with the
8b33ab329SDag-Erling Smørgrav# following copyright and license.
9ca236e63SDag-Erling Smørgrav#
10b33ab329SDag-Erling Smørgrav# Copyright (C) 1994 X Consortium
11ca236e63SDag-Erling Smørgrav#
12b33ab329SDag-Erling Smørgrav# Permission is hereby granted, free of charge, to any person obtaining a copy
13b33ab329SDag-Erling Smørgrav# of this software and associated documentation files (the "Software"), to
14b33ab329SDag-Erling Smørgrav# deal in the Software without restriction, including without limitation the
15b33ab329SDag-Erling Smørgrav# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
16b33ab329SDag-Erling Smørgrav# sell copies of the Software, and to permit persons to whom the Software is
17b33ab329SDag-Erling Smørgrav# furnished to do so, subject to the following conditions:
18b33ab329SDag-Erling Smørgrav#
19b33ab329SDag-Erling Smørgrav# The above copyright notice and this permission notice shall be included in
20b33ab329SDag-Erling Smørgrav# all copies or substantial portions of the Software.
21b33ab329SDag-Erling Smørgrav#
22b33ab329SDag-Erling Smørgrav# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23b33ab329SDag-Erling Smørgrav# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24b33ab329SDag-Erling Smørgrav# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
25b33ab329SDag-Erling Smørgrav# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26b33ab329SDag-Erling Smørgrav# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
27b33ab329SDag-Erling Smørgrav# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28b33ab329SDag-Erling Smørgrav#
29b33ab329SDag-Erling Smørgrav# Except as contained in this notice, the name of the X Consortium shall not
30b33ab329SDag-Erling Smørgrav# be used in advertising or otherwise to promote the sale, use or other deal-
31b33ab329SDag-Erling Smørgrav# ings in this Software without prior written authorization from the X Consor-
32b33ab329SDag-Erling Smørgrav# tium.
33b33ab329SDag-Erling Smørgrav#
34b33ab329SDag-Erling Smørgrav#
35b33ab329SDag-Erling Smørgrav# FSF changes to this file are in the public domain.
36ca236e63SDag-Erling Smørgrav#
37ca236e63SDag-Erling Smørgrav# Calling this script install-sh is preferred over install.sh, to prevent
38ca236e63SDag-Erling Smørgrav# `make' implicit rules from creating a file called install from it
39ca236e63SDag-Erling Smørgrav# when there is no Makefile.
40ca236e63SDag-Erling Smørgrav#
41ca236e63SDag-Erling Smørgrav# This script is compatible with the BSD install script, but was written
42ca236e63SDag-Erling Smørgrav# from scratch.  It can only install one file at a time, a restriction
43ca236e63SDag-Erling Smørgrav# shared with many OS's install programs.
44ca236e63SDag-Erling Smørgrav
45ca236e63SDag-Erling Smørgrav# set DOITPROG to echo to test this script
46ca236e63SDag-Erling Smørgrav
47ca236e63SDag-Erling Smørgrav# Don't use :- since 4.3BSD and earlier shells don't like it.
48ca236e63SDag-Erling Smørgravdoit="${DOITPROG-}"
49ca236e63SDag-Erling Smørgrav
50ca236e63SDag-Erling Smørgrav# put in absolute paths if you don't have them in your path; or use env. vars.
51ca236e63SDag-Erling Smørgrav
52ca236e63SDag-Erling Smørgravmvprog="${MVPROG-mv}"
53ca236e63SDag-Erling Smørgravcpprog="${CPPROG-cp}"
54ca236e63SDag-Erling Smørgravchmodprog="${CHMODPROG-chmod}"
55ca236e63SDag-Erling Smørgravchownprog="${CHOWNPROG-chown}"
56ca236e63SDag-Erling Smørgravchgrpprog="${CHGRPPROG-chgrp}"
57ca236e63SDag-Erling Smørgravstripprog="${STRIPPROG-strip}"
58ca236e63SDag-Erling Smørgravrmprog="${RMPROG-rm}"
59ca236e63SDag-Erling Smørgravmkdirprog="${MKDIRPROG-mkdir}"
60ca236e63SDag-Erling Smørgrav
61b33ab329SDag-Erling Smørgravtransformbasename=
62b33ab329SDag-Erling Smørgravtransform_arg=
63ca236e63SDag-Erling Smørgravinstcmd="$mvprog"
64ca236e63SDag-Erling Smørgravchmodcmd="$chmodprog 0755"
65b33ab329SDag-Erling Smørgravchowncmd=
66b33ab329SDag-Erling Smørgravchgrpcmd=
67b33ab329SDag-Erling Smørgravstripcmd=
68ca236e63SDag-Erling Smørgravrmcmd="$rmprog -f"
69ca236e63SDag-Erling Smørgravmvcmd="$mvprog"
70b33ab329SDag-Erling Smørgravsrc=
71b33ab329SDag-Erling Smørgravdst=
72b33ab329SDag-Erling Smørgravdir_arg=
73ca236e63SDag-Erling Smørgrav
74b33ab329SDag-Erling Smørgravusage="Usage: $0 [OPTION]... SRCFILE DSTFILE
75b33ab329SDag-Erling Smørgrav   or: $0 [OPTION]... SRCFILES... DIRECTORY
76b33ab329SDag-Erling Smørgrav   or: $0 -d DIRECTORIES...
77b33ab329SDag-Erling Smørgrav
78b33ab329SDag-Erling SmørgravIn the first form, install SRCFILE to DSTFILE, removing SRCFILE by default.
79b33ab329SDag-Erling SmørgravIn the second, create the directory path DIR.
80b33ab329SDag-Erling Smørgrav
81b33ab329SDag-Erling SmørgravOptions:
82b33ab329SDag-Erling Smørgrav-b=TRANSFORMBASENAME
83b33ab329SDag-Erling Smørgrav-c         copy source (using $cpprog) instead of moving (using $mvprog).
84b33ab329SDag-Erling Smørgrav-d         create directories instead of installing files.
85b33ab329SDag-Erling Smørgrav-g GROUP   $chgrp installed files to GROUP.
86b33ab329SDag-Erling Smørgrav-m MODE    $chmod installed files to MODE.
87b33ab329SDag-Erling Smørgrav-o USER    $chown installed files to USER.
88b33ab329SDag-Erling Smørgrav-s         strip installed files (using $stripprog).
89b33ab329SDag-Erling Smørgrav-t=TRANSFORM
90b33ab329SDag-Erling Smørgrav--help     display this help and exit.
91b33ab329SDag-Erling Smørgrav--version  display version info and exit.
92b33ab329SDag-Erling Smørgrav
93b33ab329SDag-Erling SmørgravEnvironment variables override the default commands:
94b33ab329SDag-Erling Smørgrav  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
95b33ab329SDag-Erling Smørgrav"
96b33ab329SDag-Erling Smørgrav
97b33ab329SDag-Erling Smørgravwhile test -n "$1"; do
98ca236e63SDag-Erling Smørgrav  case $1 in
99b33ab329SDag-Erling Smørgrav    -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
100b33ab329SDag-Erling Smørgrav        shift
101b33ab329SDag-Erling Smørgrav        continue;;
102b33ab329SDag-Erling Smørgrav
103b33ab329SDag-Erling Smørgrav    -c) instcmd=$cpprog
104ca236e63SDag-Erling Smørgrav        shift
105ca236e63SDag-Erling Smørgrav        continue;;
106ca236e63SDag-Erling Smørgrav
107ca236e63SDag-Erling Smørgrav    -d) dir_arg=true
108ca236e63SDag-Erling Smørgrav        shift
109ca236e63SDag-Erling Smørgrav        continue;;
110ca236e63SDag-Erling Smørgrav
111b33ab329SDag-Erling Smørgrav    -g) chgrpcmd="$chgrpprog $2"
112b33ab329SDag-Erling Smørgrav        shift
113b33ab329SDag-Erling Smørgrav        shift
114b33ab329SDag-Erling Smørgrav        continue;;
115b33ab329SDag-Erling Smørgrav
116b33ab329SDag-Erling Smørgrav    --help) echo "$usage"; exit 0;;
117b33ab329SDag-Erling Smørgrav
118ca236e63SDag-Erling Smørgrav    -m) chmodcmd="$chmodprog $2"
119ca236e63SDag-Erling Smørgrav        shift
120ca236e63SDag-Erling Smørgrav        shift
121ca236e63SDag-Erling Smørgrav        continue;;
122ca236e63SDag-Erling Smørgrav
123ca236e63SDag-Erling Smørgrav    -o) chowncmd="$chownprog $2"
124ca236e63SDag-Erling Smørgrav        shift
125ca236e63SDag-Erling Smørgrav        shift
126ca236e63SDag-Erling Smørgrav        continue;;
127ca236e63SDag-Erling Smørgrav
128b33ab329SDag-Erling Smørgrav    -s) stripcmd=$stripprog
129ca236e63SDag-Erling Smørgrav        shift
130ca236e63SDag-Erling Smørgrav        continue;;
131ca236e63SDag-Erling Smørgrav
132ca236e63SDag-Erling Smørgrav    -t=*) transformarg=`echo $1 | sed 's/-t=//'`
133ca236e63SDag-Erling Smørgrav        shift
134ca236e63SDag-Erling Smørgrav        continue;;
135ca236e63SDag-Erling Smørgrav
136b33ab329SDag-Erling Smørgrav    --version) echo "$0 $scriptversion"; exit 0;;
137ca236e63SDag-Erling Smørgrav
138b33ab329SDag-Erling Smørgrav    *)  # When -d is used, all remaining arguments are directories to create.
139b33ab329SDag-Erling Smørgrav	test -n "$dir_arg" && break
140b33ab329SDag-Erling Smørgrav        # Otherwise, the last argument is the destination.  Remove it from $@.
141b33ab329SDag-Erling Smørgrav	for arg
142b33ab329SDag-Erling Smørgrav	do
143b33ab329SDag-Erling Smørgrav          if test -n "$dstarg"; then
144b33ab329SDag-Erling Smørgrav	    # $@ is not empty: it contains at least $arg.
145b33ab329SDag-Erling Smørgrav	    set fnord "$@" "$dstarg"
146b33ab329SDag-Erling Smørgrav	    shift # fnord
147ca236e63SDag-Erling Smørgrav	  fi
148b33ab329SDag-Erling Smørgrav	  shift # arg
149b33ab329SDag-Erling Smørgrav	  dstarg=$arg
150b33ab329SDag-Erling Smørgrav	done
151b33ab329SDag-Erling Smørgrav	break;;
152ca236e63SDag-Erling Smørgrav  esac
153ca236e63SDag-Erling Smørgravdone
154ca236e63SDag-Erling Smørgrav
155b33ab329SDag-Erling Smørgravif test -z "$1"; then
156b33ab329SDag-Erling Smørgrav  if test -z "$dir_arg"; then
157b33ab329SDag-Erling Smørgrav    echo "$0: no input file specified." >&2
158ca236e63SDag-Erling Smørgrav    exit 1
159b33ab329SDag-Erling Smørgrav  fi
160b33ab329SDag-Erling Smørgrav  # It's OK to call `install-sh -d' without argument.
161b33ab329SDag-Erling Smørgrav  # This can happen when creating conditional directories.
162b33ab329SDag-Erling Smørgrav  exit 0
163ca236e63SDag-Erling Smørgravfi
164ca236e63SDag-Erling Smørgrav
165b33ab329SDag-Erling Smørgravfor src
166b33ab329SDag-Erling Smørgravdo
167b33ab329SDag-Erling Smørgrav  # Protect names starting with `-'.
168b33ab329SDag-Erling Smørgrav  case $src in
169b33ab329SDag-Erling Smørgrav    -*) src=./$src ;;
170b33ab329SDag-Erling Smørgrav  esac
171b33ab329SDag-Erling Smørgrav
172b33ab329SDag-Erling Smørgrav  if test -n "$dir_arg"; then
173ca236e63SDag-Erling Smørgrav    dst=$src
174b33ab329SDag-Erling Smørgrav    src=
175ca236e63SDag-Erling Smørgrav
176b33ab329SDag-Erling Smørgrav    if test -d "$dst"; then
177ca236e63SDag-Erling Smørgrav      instcmd=:
178b33ab329SDag-Erling Smørgrav      chmodcmd=
179ca236e63SDag-Erling Smørgrav    else
180b33ab329SDag-Erling Smørgrav      instcmd=$mkdirprog
181ca236e63SDag-Erling Smørgrav    fi
182ca236e63SDag-Erling Smørgrav  else
183ca236e63SDag-Erling Smørgrav    # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
184ca236e63SDag-Erling Smørgrav    # might cause directories to be created, which would be especially bad
185ca236e63SDag-Erling Smørgrav    # if $src (and thus $dsttmp) contains '*'.
186b33ab329SDag-Erling Smørgrav    if test ! -f "$src" && test ! -d "$src"; then
187b33ab329SDag-Erling Smørgrav      echo "$0: $src does not exist." >&2
188ca236e63SDag-Erling Smørgrav      exit 1
189ca236e63SDag-Erling Smørgrav    fi
190ca236e63SDag-Erling Smørgrav
191b33ab329SDag-Erling Smørgrav    if test -z "$dstarg"; then
192b33ab329SDag-Erling Smørgrav      echo "$0: no destination specified." >&2
193ca236e63SDag-Erling Smørgrav      exit 1
194ca236e63SDag-Erling Smørgrav    fi
195ca236e63SDag-Erling Smørgrav
196b33ab329SDag-Erling Smørgrav    dst=$dstarg
197b33ab329SDag-Erling Smørgrav    # Protect names starting with `-'.
198b33ab329SDag-Erling Smørgrav    case $dst in
199b33ab329SDag-Erling Smørgrav      -*) dst=./$dst ;;
200b33ab329SDag-Erling Smørgrav    esac
201ca236e63SDag-Erling Smørgrav
202b33ab329SDag-Erling Smørgrav    # If destination is a directory, append the input filename; won't work
203b33ab329SDag-Erling Smørgrav    # if double slashes aren't ignored.
204b33ab329SDag-Erling Smørgrav    if test -d "$dst"; then
205b33ab329SDag-Erling Smørgrav      dst=$dst/`basename "$src"`
206ca236e63SDag-Erling Smørgrav    fi
207ca236e63SDag-Erling Smørgrav  fi
208ca236e63SDag-Erling Smørgrav
209b33ab329SDag-Erling Smørgrav  # This sed command emulates the dirname command.
210b33ab329SDag-Erling Smørgrav  dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
211ca236e63SDag-Erling Smørgrav
212ca236e63SDag-Erling Smørgrav  # Make sure that the destination directory exists.
213ca236e63SDag-Erling Smørgrav
214ca236e63SDag-Erling Smørgrav  # Skip lots of stat calls in the usual case.
215b33ab329SDag-Erling Smørgrav  if test ! -d "$dstdir"; then
216ca236e63SDag-Erling Smørgrav    defaultIFS='
217ca236e63SDag-Erling Smørgrav	 '
218b33ab329SDag-Erling Smørgrav    IFS="${IFS-$defaultIFS}"
219ca236e63SDag-Erling Smørgrav
220b33ab329SDag-Erling Smørgrav    oIFS=$IFS
221ca236e63SDag-Erling Smørgrav    # Some sh's can't handle IFS=/ for some reason.
222ca236e63SDag-Erling Smørgrav    IFS='%'
223b33ab329SDag-Erling Smørgrav    set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
224b33ab329SDag-Erling Smørgrav    IFS=$oIFS
225ca236e63SDag-Erling Smørgrav
226b33ab329SDag-Erling Smørgrav    pathcomp=
227ca236e63SDag-Erling Smørgrav
228b33ab329SDag-Erling Smørgrav    while test $# -ne 0 ; do
229b33ab329SDag-Erling Smørgrav      pathcomp=$pathcomp$1
230ca236e63SDag-Erling Smørgrav      shift
231b33ab329SDag-Erling Smørgrav      if test ! -d "$pathcomp"; then
232b33ab329SDag-Erling Smørgrav        $mkdirprog "$pathcomp" || lasterr=$?
233b33ab329SDag-Erling Smørgrav	# mkdir can fail with a `File exist' error in case several
234b33ab329SDag-Erling Smørgrav	# install-sh are creating the directory concurrently.  This
235b33ab329SDag-Erling Smørgrav	# is OK.
236b33ab329SDag-Erling Smørgrav	test ! -d "$pathcomp" && { (exit ${lasterr-1}); exit; }
237ca236e63SDag-Erling Smørgrav      fi
238b33ab329SDag-Erling Smørgrav      pathcomp=$pathcomp/
239ca236e63SDag-Erling Smørgrav    done
240ca236e63SDag-Erling Smørgrav  fi
241ca236e63SDag-Erling Smørgrav
242b33ab329SDag-Erling Smørgrav  if test -n "$dir_arg"; then
243b33ab329SDag-Erling Smørgrav    $doit $instcmd "$dst" \
244b33ab329SDag-Erling Smørgrav      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
245b33ab329SDag-Erling Smørgrav      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
246b33ab329SDag-Erling Smørgrav      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
247b33ab329SDag-Erling Smørgrav      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
248ca236e63SDag-Erling Smørgrav
249ca236e63SDag-Erling Smørgrav  else
250ca236e63SDag-Erling Smørgrav    # If we're going to rename the final executable, determine the name now.
251b33ab329SDag-Erling Smørgrav    if test -z "$transformarg"; then
252b33ab329SDag-Erling Smørgrav      dstfile=`basename "$dst"`
253ca236e63SDag-Erling Smørgrav    else
254b33ab329SDag-Erling Smørgrav      dstfile=`basename "$dst" $transformbasename \
255b33ab329SDag-Erling Smørgrav               | sed $transformarg`$transformbasename
256ca236e63SDag-Erling Smørgrav    fi
257ca236e63SDag-Erling Smørgrav
258b33ab329SDag-Erling Smørgrav    # don't allow the sed command to completely eliminate the filename.
259b33ab329SDag-Erling Smørgrav    test -z "$dstfile" && dstfile=`basename "$dst"`
260ca236e63SDag-Erling Smørgrav
261b33ab329SDag-Erling Smørgrav    # Make a couple of temp file names in the proper directory.
262b33ab329SDag-Erling Smørgrav    dsttmp=$dstdir/_inst.$$_
263b33ab329SDag-Erling Smørgrav    rmtmp=$dstdir/_rm.$$_
264ca236e63SDag-Erling Smørgrav
265b33ab329SDag-Erling Smørgrav    # Trap to clean up those temp files at exit.
266b33ab329SDag-Erling Smørgrav    trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
267b33ab329SDag-Erling Smørgrav    trap '(exit $?); exit' 1 2 13 15
268ca236e63SDag-Erling Smørgrav
269ca236e63SDag-Erling Smørgrav    # Move or copy the file name to the temp name
270b33ab329SDag-Erling Smørgrav    $doit $instcmd "$src" "$dsttmp" &&
271ca236e63SDag-Erling Smørgrav
272b33ab329SDag-Erling Smørgrav    # and set any options; do chmod last to preserve setuid bits.
273b33ab329SDag-Erling Smørgrav    #
274ca236e63SDag-Erling Smørgrav    # If any of these fail, we abort the whole thing.  If we want to
275ca236e63SDag-Erling Smørgrav    # ignore errors from any of these, just make sure not to ignore
276ca236e63SDag-Erling Smørgrav    # errors from the above "$doit $instcmd $src $dsttmp" command.
277b33ab329SDag-Erling Smørgrav    #
278b33ab329SDag-Erling Smørgrav    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
279b33ab329SDag-Erling Smørgrav      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
280b33ab329SDag-Erling Smørgrav      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
281b33ab329SDag-Erling Smørgrav      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
282ca236e63SDag-Erling Smørgrav
283ca236e63SDag-Erling Smørgrav    # Now rename the file to the real destination.
284b33ab329SDag-Erling Smørgrav    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
285b33ab329SDag-Erling Smørgrav      || {
286b33ab329SDag-Erling Smørgrav	   # The rename failed, perhaps because mv can't rename something else
287b33ab329SDag-Erling Smørgrav	   # to itself, or perhaps because mv is so ancient that it does not
288b33ab329SDag-Erling Smørgrav	   # support -f.
289ca236e63SDag-Erling Smørgrav
290b33ab329SDag-Erling Smørgrav	   # Now remove or move aside any old file at destination location.
291b33ab329SDag-Erling Smørgrav	   # We try this two ways since rm can't unlink itself on some
292b33ab329SDag-Erling Smørgrav	   # systems and the destination file might be busy for other
293b33ab329SDag-Erling Smørgrav	   # reasons.  In this case, the final cleanup might fail but the new
294b33ab329SDag-Erling Smørgrav	   # file should still install successfully.
295b33ab329SDag-Erling Smørgrav	   {
296b33ab329SDag-Erling Smørgrav	     if test -f "$dstdir/$dstfile"; then
297b33ab329SDag-Erling Smørgrav	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
298b33ab329SDag-Erling Smørgrav	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
299b33ab329SDag-Erling Smørgrav	       || {
300b33ab329SDag-Erling Smørgrav		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
301b33ab329SDag-Erling Smørgrav		 (exit 1); exit
302b33ab329SDag-Erling Smørgrav	       }
303b33ab329SDag-Erling Smørgrav	     else
304b33ab329SDag-Erling Smørgrav	       :
305b33ab329SDag-Erling Smørgrav	     fi
306b33ab329SDag-Erling Smørgrav	   } &&
307ca236e63SDag-Erling Smørgrav
308b33ab329SDag-Erling Smørgrav	   # Now rename the file to the real destination.
309b33ab329SDag-Erling Smørgrav	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
310b33ab329SDag-Erling Smørgrav	 }
311b33ab329SDag-Erling Smørgrav    }
312b33ab329SDag-Erling Smørgrav  fi || { (exit 1); exit; }
313b33ab329SDag-Erling Smørgravdone
314ca236e63SDag-Erling Smørgrav
315b33ab329SDag-Erling Smørgrav# The final little trick to "correctly" pass the exit status to the exit trap.
316b33ab329SDag-Erling Smørgrav{
317b33ab329SDag-Erling Smørgrav  (exit 0); exit
318b33ab329SDag-Erling Smørgrav}
319ca236e63SDag-Erling Smørgrav
320b33ab329SDag-Erling Smørgrav# Local variables:
321b33ab329SDag-Erling Smørgrav# eval: (add-hook 'write-file-hooks 'time-stamp)
322b33ab329SDag-Erling Smørgrav# time-stamp-start: "scriptversion="
323b33ab329SDag-Erling Smørgrav# time-stamp-format: "%:y-%02m-%02d.%02H"
324b33ab329SDag-Erling Smørgrav# time-stamp-end: "$"
325b33ab329SDag-Erling Smørgrav# End:
326