Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re: Safe way to open files

by danger (Priest)
on Jun 15, 2002 at 17:42 UTC ( #174854=note: print w/ replies, xml ) Need Help??


in reply to Safe way to open files

Here's an approach that reduces the number of file-opening calls you need to manage --- determine what flags you want on the file handle and use sysopen once. In the following modes 1 and 2 act like > and >> respectively, else the file is opened read-only. This can be altered --- if you'd rather fail on attempting to append to a non-existing file, remove the O_CREAT flag from mode 2 for example.

use Fcntl qw(:DEFAULT :flock); # assume $flock_enabled set accordingly sub safe_open { my $fn = shift; $fn =~ s/^(>>?)//; $mode = length($1); my $flags = $mode == 1 ? O_CREAT | O_WRONLY | O_TRUNC : $mode == 2 ? O_CREAT | O_WRONLY | O_APPEND : O_RDONLY; sysopen(my $fh, $fn, $flags) || die "Can't open $fn: $!"; flock($fh, LOCK_EX) || die "Can't flock $fn: $!" if $flock_enabled +; return $fh; }


Comment on Re: Safe way to open files
Select or Download Code
Replies are listed 'Best First'.
Re: Re: Safe way to open files
by L0rdPhi1 (Sexton) on Jun 16, 2002 at 10:44 UTC
    I'm now using the below. Anyone see any problems? Should I still use truncate($fh, 0); after seek or does the sysopen take care of that?
    sub safe_open { my $fn = shift; $fn =~ s/^(>>?)//; $mode = length($1); my $flags = $mode == 1 ? O_CREAT | O_WRONLY | O_TRUNC : $mode == 2 ? O_CREAT | O_WRONLY | O_APPEND : O_RDONLY; sysopen(my $fh, $fn, $flags) or die "Can't open $fn: $!"; if ($flock_enabled) { flock($fh, LOCK_EX) or die "Can't flock $fn: $!"; } seek $fh, 0, 0; return $fh; }
      No. You do not want an unconditional seek in the routine. If it was opened with O_TRUNC or O_RDONLY it isn't needed (neither is truncate), if it was opened with O_APPEND then you definitely do not want to seek nor truncate.
        Okay! Thanks a lot++

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://174854]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (10)
As of 2015-07-30 08:59 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (270 votes), past polls