sub safe_open { my $fn = shift; my $fh = do { local *FH }; my ($mode, $result); if ($fn =~ /^>[^>]/) { $mode = 1; } elsif ($fn =~ /^>>/) { $mode = 2; } else { $mode = 0; } if ($mode == 1 and $flock_enabled) { # Write mode with flock. $truncate_please = 1; my $fhtemp = do { local *FHT }; $result = open( $fhtemp, "+>>$fn" ); if ($result) { $result = open($filehandle, ">&$fhtemp" ); close($fhtemp); } } elsif ($mode == 1) { # Write mode without flock. $result = open($fh, ">$fn"); } elsif ($mode == 2) { # Append mode. $result = open($fh, ">>$fn"); } elsif ($mode == 0) { $result = open($fh, $fn); } unless ($result) { # Open failed. fatal_error("Couldn't open $fn."); } flock($fh, 2) if $flock_enabled; if ($truncate_please) { truncate($fh, 0) or fatal_error("Could not truncate file $fn."); } return $fh; }