]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/POP3D.pm
No ext_urls
[public-inbox.git] / lib / PublicInbox / POP3D.pm
index 5cfe961343a58b732e8d1d52e001ae884ae508ba..3fc85efc904f896d42ce341fcca7b729804191a6 100644 (file)
@@ -14,7 +14,7 @@ use PublicInbox::Syscall;
 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};
@@ -27,7 +27,7 @@ if ($^O eq 'linux' || $^O eq 'freebsd') {
                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));
                }
@@ -45,7 +45,7 @@ sub new {
                # 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;
 }
 
@@ -245,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