qw(.topbloke));
}
+sub wf_start ($) {
+ my ($path) = @_;
+ my $fh = new IO::File '>', "$path.tmp" or die "$path.tmp: $!";
+ $writing{$fh} = $path;
+ return [ $fh, $path ];
+}
+
+sub wf ($$) {
+ my ($wf, $data) = @_;
+ print $wf->[0] $data or die "$wf->[1]: $!";
+}
+
+sub wf_abort ($) {
+ my ($wf) = @_;
+ close $wf->[0];
+ unlink $wf->[1] or die "$wf->[1]: $!";
+}
+
+sub wf_done ($) {
+ my ($wf) = @_;
+ close $wf->[0] or die "$wf->[1]: $!";
+ rename $wf->[1].'.tmp', $wf->[1] or die "$wf->[1]: $!";
+}
+
+sub wf_contents ($$) {
+ my ($path,$contents) = @_;
+ my $wf = wf_start($path);
+ wf($wf, $contents);
+ wf_done($wf);
+}
+
1;