Make vers.c creation atomic by using a temporary file, then moving

the temporary file to vers.c at the end of the script

The previous logic wrote out to vers.c multiple times, so the file
could be incorrectly interpreted as being completely written out
after one of the echo calls with recursive make, when in reality it
was only partially written.

Also, in the event the build was interrupted when creating vers.c
(small race window), it would have a leftover file that needed to
be cleaned up before resuming the build.

MFC after: 3 weeks
Sponsored by: EMC / Isilon Storage Division
This commit is contained in:
Enji Cooper 2015-10-24 21:59:58 +00:00
parent eac91e326a
commit a71c657475

View File

@ -32,12 +32,16 @@
#
# @(#)newvers.sh 8.1 (Berkeley) 4/20/94
tempfile=$(mktemp tmp.XXXXXX) || exit
trap "rm -f $tempfile" EXIT INT TERM
LC_ALL=C; export LC_ALL
u=${USER-root} h=${HOSTNAME-`hostname`} t=`date`
#r=`head -n 6 $1 | tail -n 1 | awk -F: ' { print $1 } '`
r=`awk -F: ' /^[0-9]\.[0-9]+:/ { print $1; exit }' $1`
echo "char bootprog_name[] = \"FreeBSD/${3} ${2}\";" > vers.c
echo "char bootprog_rev[] = \"${r}\";" >> vers.c
echo "char bootprog_date[] = \"${t}\";" >> vers.c
echo "char bootprog_maker[] = \"${u}@${h}\";" >> vers.c
echo "char bootprog_name[] = \"FreeBSD/${3} ${2}\";" > $tempfile
echo "char bootprog_rev[] = \"${r}\";" >> $tempfile
echo "char bootprog_date[] = \"${t}\";" >> $tempfile
echo "char bootprog_maker[] = \"${u}@${h}\";" >> $tempfile
mv $tempfile vers.c