Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 24 Oct 2015 21:59:58 +0000 (UTC)
From:      Garrett Cooper <ngie@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r289896 - head/sys/boot/common
Message-ID:  <201510242159.t9OLxwUZ079861@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ngie
Date: Sat Oct 24 21:59:58 2015
New Revision: 289896
URL: https://svnweb.freebsd.org/changeset/base/289896

Log:
  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

Modified:
  head/sys/boot/common/newvers.sh

Modified: head/sys/boot/common/newvers.sh
==============================================================================
--- head/sys/boot/common/newvers.sh	Sat Oct 24 21:59:22 2015	(r289895)
+++ head/sys/boot/common/newvers.sh	Sat Oct 24 21:59:58 2015	(r289896)
@@ -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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201510242159.t9OLxwUZ079861>