/usr/share/perl5/Mail/Box/Locker/DotLock.pm is in libmail-box-perl 2.099-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | # Copyrights 2001-2011 by Mark Overmeer.
# For other contributors see ChangeLog.
# See the manual pages for details on the licensing terms.
# Pod stripped from pm file by OODoc 2.00.
use strict;
package Mail::Box::Locker::DotLock;
use vars '$VERSION';
$VERSION = '2.099';
use base 'Mail::Box::Locker';
use IO::File;
use File::Spec;
use Errno qw/EEXIST/;
use Carp;
sub init($)
{ my ($self, $args) = @_;
$args->{file} = $args->{dotlock_file} if $args->{dotlock_file};
$self->SUPER::init($args);
}
sub name() {'DOTLOCK'}
sub folder(;$)
{ my $self = shift;
@_ && $_[0] or return $self->SUPER::folder;
my $folder = shift;
unless(defined $self->filename)
{ my $org = $folder->organization;
my $filename
= $org eq 'FILE' ? $folder->filename . '.lock'
: $org eq 'DIRECTORY'? File::Spec->catfile($folder->directory,'.lock')
: croak "Need lock file name for DotLock.";
$self->filename($filename);
}
$self->SUPER::folder($folder);
}
sub _try_lock($)
{ my ($self, $lockfile) = @_;
return if -e $lockfile;
my $flags = $^O eq 'MSWin32'
? O_CREAT|O_EXCL|O_WRONLY
: O_CREAT|O_EXCL|O_WRONLY|O_NONBLOCK;
my $lock = IO::File->new($lockfile, $flags, 0600);
if($lock)
{ close $lock;
return 1;
}
if($! != EEXIST)
{ $self->log(ERROR => "lockfile $lockfile can never be created: $!");
return 1;
}
}
sub unlock()
{ my $self = shift;
$self->{MBL_has_lock}
or return $self;
my $lock = $self->filename;
unlink $lock
or $self->log(WARNING => "Couldn't remove lockfile $lock: $!");
delete $self->{MBL_has_lock};
$self;
}
sub lock()
{ my $self = shift;
my $lockfile = $self->filename;
if($self->hasLock)
{ $self->log(WARNING => "Folder already locked with file $lockfile");
return 1;
}
my $end = $self->{MBL_timeout} eq 'NOTIMEOUT' ? -1
: $self->{MBL_timeout};
my $expire = $self->{MBL_expires}/86400; # in days for -A
while(1)
{
return $self->{MBL_has_lock} = 1
if $self->_try_lock($lockfile);
if(-e $lockfile && -A $lockfile > $expire)
{
if(unlink $lockfile)
{ $self->log(WARNING => "Removed expired lockfile $lockfile");
redo;
}
else
{ $self->log(ERROR =>
"Failed to remove expired lockfile $lockfile: $!");
last;
}
}
last unless --$end;
sleep 1;
}
return 0;
}
sub isLocked() { -e shift->filename }
1;
|