Beta Shell
v2.0 ยท web2.us.cloudlogin.co
[FM]
[CMD]
[PHP]
[DB]
[INFO]
[SEC]
File Manager
~
/
usr
/
share
/
perl5
/
vendor_perl
/
Log
/
Dispatch
/
FileRotate
Upload
4 items
Name
Size
Perms
Modified
Actions
[ .. / .. ]
Flock.pm
3.43 KB
-rw-r--r--
2018-07-29 19:24:44
Edit
Del
Mutex.pm
4.19 KB
-rw-r--r--
2018-07-29 19:24:44
Edit
Del
Editing: Flock.pm
(3.43 KB)
Path: /usr/share/perl5/vendor_perl/Log/Dispatch/FileRotate/Flock.pm
Back
# # This file is part of Log-Dispatch-FileRotate # # This software is copyright (c) 2005 by Mark Pfeiffer. # # This is free software; you can redistribute it and/or modify it under # the same terms as the Perl 5 programming language system itself. # package Log::Dispatch::FileRotate::Flock; $Log::Dispatch::FileRotate::Flock::VERSION = '1.36'; # ABSTRACT: File Locking Functions for L<Log::Dispatch::FileRotate> use strict; use warnings; use base 'Exporter'; use Fcntl ':flock'; our @EXPORT_OK = qw(safe_flock flopen); sub safe_flock { my ($fh, $flags) = @_; while (1) { unless (flock $fh, $flags) { # retry if we were interrupted or we are in non-blocking and the file is locked next if $!{EAGAIN} or $!{EWOULDBLOCK}; return 0; } else { return 1; } } } sub flopen { my $path = shift; my $flags = LOCK_EX; my $fh; while (1) { unless (open $fh, '>>', $path) { return; } unless (safe_flock($fh, $flags)) { return; } my @path_stat = stat $path; unless (@path_stat) { # file disappeared fron under our feet close $fh; next; } my @fh_stat = stat $fh; unless (@fh_stat) { # This should never happen return; } unless ($^O =~ /^MSWin/) { # stat on a filehandle and path return different "dev" and "rdev" # fields on windows if ($path_stat[0] != $fh_stat[0]) { # file was changed under our feet. try again; close $fh; next; } } # check that inode are the same for the path and fh if ($path_stat[1] != $fh_stat[1]) { # file was changed under our feet. try again; close $fh; next; } return ($fh, $fh_stat[1]); } } 1; __END__ =pod =encoding UTF-8 =head1 NAME Log::Dispatch::FileRotate::Flock - File Locking Functions for L<Log::Dispatch::FileRotate> =head1 VERSION version 1.36 =head1 SYNOPSIS Internal Use Only! =head2 DESCRIPTION Internal Use Only! =head1 METHODS =head2 safe_flock($filehandle, $flags): boolean This is a wrapper around C<flock()> that handles things such as interruption of the call by a signal automatically. =head2 flopen($path): ($filehandle, $inode) This function is similar to BSD's C<flopen()> function. It opens a file, obtiains an exclusive lock on it using C<flock()>, and handles a bunch of race conditions that can happen. It returns the opened filehandle and the inode of the file on success, nothing on failure. =head1 SOURCE The development version is on github at L<https://https://github.com/mschout/perl-log-dispatch-filerotate> and may be cloned from L<git://https://github.com/mschout/perl-log-dispatch-filerotate.git> =head1 BUGS Please report any bugs or feature requests on the bugtracker website L<https://github.com/mschout/perl-log-dispatch-filerotate/issues> When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature. =head1 AUTHOR Michael Schout <mschout@cpan.org> =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2005 by Mark Pfeiffer. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut