X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FPOP3D.pm;h=7432a9640c89a20a0e818a9c7262d7ca7bda80f9;hb=cab36ebd00ca72f87ff3a233ccec77aef948c926;hp=0609627e030ca2109ed8593fb3c36cce0fd501d4;hpb=f0b735529e3083e222f3edd6644cd927ad35bb39;p=public-inbox.git
diff --git a/lib/PublicInbox/POP3D.pm b/lib/PublicInbox/POP3D.pm
index 0609627e..7432a964 100644
--- a/lib/PublicInbox/POP3D.pm
+++ b/lib/PublicInbox/POP3D.pm
@@ -1,7 +1,7 @@
# Copyright (C) all contributors
# License: AGPL-3.0+
-# represents an POP3D (currently a singleton)
+# represents an POP3D
package PublicInbox::POP3D;
use v5.12;
use parent qw(PublicInbox::Lock);
@@ -37,23 +37,15 @@ if ($^O eq 'linux' || $^O eq 'freebsd') {
die "File::FcntlLock required for POP3 on $^O: $@\n";
sub new {
- my ($cls, $pi_cfg) = @_;
- $pi_cfg //= PublicInbox::Config->new;
- my $d = $pi_cfg->{'publicinbox.pop3state'} //
- die "publicinbox.pop3state undefined\n";
- -d $d or do {
- require File::Path;
- File::Path::make_path($d, { mode => 0700 });
- PublicInbox::Syscall::nodatacow_dir($d);
- };
+ my ($cls) = @_;
bless {
err => \*STDERR,
out => \*STDOUT,
- pi_cfg => $pi_cfg,
- lock_path => "$d/db.lock", # PublicInbox::Lock to protect SQLite
+ # pi_cfg => PublicInbox::Config
+ # 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;
}
@@ -61,16 +53,22 @@ sub refresh_groups { # PublicInbox::Daemon callback
my ($self, $sig) = @_;
# TODO share pi_cfg with nntpd/imapd inside -netd
my $new = PublicInbox::Config->new;
- my $old = $self->{pi_cfg};
- my $s = 'publicinbox.pop3state';
- $new->{$s} //= $old->{$s};
- if ($new->{$s} ne $old->{$s}) {
- warn <{'publicinbox.pop3state'} //
+ die "publicinbox.pop3state undefined ($new->{-f})\n";
+ -d $d or do {
+ require File::Path;
+ File::Path::make_path($d, { mode => 0700 });
+ PublicInbox::Syscall::nodatacow_dir($d);
+ };
+ $self->{lock_path} //= "$d/db.lock";
+ if (my $old = $self->{pi_cfg}) {
+ my $s = 'publicinbox.pop3state';
+ $new->{$s} //= $old->{$s};
+ return warn <{$s} ne $old->{$s};
$s changed: `$old->{$s}' => `$new->{$s}', config reload ignored
EOM
- } else {
- $self->{pi_cfg} = $new;
}
+ $self->{pi_cfg} = $new;
}
# persistent tables
@@ -247,6 +245,12 @@ SELECT txn_id,uid_dele FROM deletes WHERE user_id = ? AND mailbox_id = ?
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