use File::Temp 0.19 (); # 0.19 for ->newdir
use Fcntl qw(F_SETLK F_UNLCK F_WRLCK SEEK_SET);
my @FLOCK;
-if ($^O eq 'linux' || $^O eq 'freebsd') {
+if ($^O eq 'linux' || $^O =~ /bsd/) {
require Config;
my $off_t;
my $sz = $Config::Config{lseeksize};
if ($^O eq 'linux') {
@FLOCK = ("ss\@8$off_t$off_t\@32",
qw(l_type l_whence l_start l_len));
- } elsif ($^O eq 'freebsd') {
+ } elsif ($^O =~ /bsd/) {
@FLOCK = ("${off_t}${off_t}lss\@256",
qw(l_start l_len l_pid l_type l_whence));
}
# lock_path => ...
# interprocess lock is the $pop3state/txn.locks file
# txn_locks => {}, # intraworker locks
- # accept_tls => { SSL_server => 1, ..., SSL_reuse_ctx => ... }
+ # ssl_ctx_opt => { SSL_cert_file => ..., SSL_key_file => ... }
}, $cls;
}
sub unlock_mailbox {
my ($self, $pop3) = @_;
my $txn_id = delete($pop3->{txn_id}) // return;
+ if (!$pop3->{did_quit}) { # deal with QUIT-less disconnects
+ my $lk = $self->lock_for_scope;
+ $self->{-state_dbh}->begin_work;
+ $pop3->__cleanup_state($txn_id);
+ $self->{-state_dbh}->commit;
+ }
delete $self->{txn_locks}->{$txn_id}; # same worker
# other workers