A long time ago, a Debian user submitted the following bug report (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=221483): I noticed that if I ctrl-c autoconf, it can leave a partially written, executable configure script. I was lucky enough to get a configure script that exited with a shell parse error, but if I had been unlucky, it might have exited 0 without doing all the tests I expected it to do. That would have sucked to ship to users. There are many ways to update a file in a way that is not prone to these problems, and I suggest that autoconf adopt one of them. Since that time, I've been carrying along the following as a Debian-specific patch. I'd appreciate feedback on whether it, or something that achieves the same effect, is suitable for commitment upstream. --- autoconf-2.59.cvs.2006.05.25.orig/bin/autom4te.in +++ autoconf-2.59.cvs.2006.05.25/bin/autom4te.in @@ -540,13 +540,21 @@ # stdout is to be handled by hand :(. Don't use fdopen as it means # we will close STDOUT, which we already do in END. my $out = new Autom4te::XFile; - if ($output eq '-') + my $atomic_replace; + if ($output eq '-' || (-e $output && ! -f _)) { $out->open (">$output"); + $atomic_replace = 0; } else { - $out->open($output, O_CREAT | O_WRONLY | O_TRUNC, oct ($mode)); + $out->open("$output.tmp", O_CREAT | O_WRONLY | O_TRUNC, oct ($mode)); + if ($out) { + $atomic_replace = 1; + } else { + $out->open($output, O_CREAT | O_WRONLY | O_TRUNC, oct ($mode)); + $atomic_replace = 0; + } } fatal "cannot create $output: $!" unless $out; @@ -581,6 +589,11 @@ print $out "$res\n"; } + if ($atomic_replace && !rename("$output.tmp", "$output")) { + move ("${output}.tmp", "$output") + or fatal "cannot rename ${output}.tmp as $output: $!"; + } + # If no forbidden words, we're done. return if ! %prohibited; -- Ben Pfaff email: blp@xxxxxxxxxxxxxxx web: http://benpfaff.org _______________________________________________ Autoconf mailing list Autoconf@xxxxxxx http://lists.gnu.org/mailman/listinfo/autoconf