]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Watch.pm
use defined-or in a few more places
[public-inbox.git] / lib / PublicInbox / Watch.pm
index 17786377ba8127fe7744acc14216f873ec71edf7..2b44ba430cfb957692da367a0550431f1809ebc6 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2016-2020 all contributors <meta@public-inbox.org>
+# Copyright (C) 2016-2021 all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 #
 # ref: https://cr.yp.to/proto/maildir.html
@@ -41,7 +41,7 @@ sub compile_watchheaders ($) {
 }
 
 sub new {
-       my ($class, $config) = @_;
+       my ($class, $cfg) = @_;
        my (%mdmap, $spamc);
        my (%imap, %nntp); # url => [inbox objects] or 'watchspam'
 
@@ -50,7 +50,7 @@ sub new {
        # indefinitely...
        foreach my $pfx (qw(publicinboxwatch publicinboxlearn)) {
                my $k = "$pfx.watchspam";
-               defined(my $dirs = $config->{$k}) or next;
+               defined(my $dirs = $cfg->{$k}) or next;
                $dirs = PublicInbox::Config::_array($dirs);
                for my $dir (@$dirs) {
                        my $url;
@@ -69,10 +69,10 @@ sub new {
 
        my $k = 'publicinboxwatch.spamcheck';
        my $default = undef;
-       my $spamcheck = PublicInbox::Spamcheck::get($config, $k, $default);
+       my $spamcheck = PublicInbox::Spamcheck::get($cfg, $k, $default);
        $spamcheck = _spamcheck_cb($spamcheck) if $spamcheck;
 
-       $config->each_inbox(sub {
+       $cfg->each_inbox(sub {
                # need to make all inboxes writable for spam removal:
                my $ibx = $_[0] = PublicInbox::InboxWritable->new($_[0]);
 
@@ -113,7 +113,7 @@ sub new {
                spamcheck => $spamcheck,
                mdmap => \%mdmap,
                mdre => $mdre,
-               config => $config,
+               pi_cfg => $cfg,
                imap => scalar keys %imap ? \%imap : undef,
                nntp => scalar keys %nntp? \%nntp : undef,
                importers => {},
@@ -133,8 +133,7 @@ sub _done_for_now {
 }
 
 sub remove_eml_i { # each_inbox callback
-       my ($ibx, $arg) = @_;
-       my ($self, $eml, $loc) = @$arg;
+       my ($ibx, $self, $eml, $loc) = @_;
 
        eval {
                # try to avoid taking a lock or unnecessary spawning
@@ -176,7 +175,7 @@ sub _remove_spam {
        $path =~ /:2,[A-R]*S[T-Za-z]*\z/ or return;
        my $eml = eml_from_path($path) or return;
        local $SIG{__WARN__} = warn_ignore_cb();
-       $self->{config}->each_inbox(\&remove_eml_i, [ $self, $eml, $path ]);
+       $self->{pi_cfg}->each_inbox(\&remove_eml_i, $self, $eml, $path);
 }
 
 sub import_eml ($$$) {
@@ -218,7 +217,7 @@ sub _try_path {
                warn "unmappable dir: $1\n";
                return;
        }
-       my $warn_cb = $SIG{__WARN__} || sub { print STDERR @_ };
+       my $warn_cb = $SIG{__WARN__} || \&CORE::warn;
        local $SIG{__WARN__} = sub {
                my $pfx = ($_[0] // '') =~ /^([A-Z]: )/g ? $1 : '';
                $warn_cb->($pfx, "path: $path\n", @_);
@@ -317,7 +316,7 @@ sub cfg_bool ($$$) {
 # flesh out common IMAP-specific data structures
 sub imap_common_init ($) {
        my ($self) = @_;
-       my $cfg = $self->{config};
+       my $cfg = $self->{pi_cfg};
        my $mic_args = {}; # scheme://authority => Mail:IMAPClient arg
        for my $url (sort keys %{$self->{imap}}) {
                my $uri = PublicInbox::URIimap->new($url);
@@ -419,8 +418,8 @@ sub imap_import_msg ($$$$$) {
                if ($flags =~ /\\Seen\b/) {
                        local $SIG{__WARN__} = warn_ignore_cb();
                        my $eml = PublicInbox::Eml->new($raw);
-                       my $arg = [ $self, $eml, "$url UID:$uid" ];
-                       $self->{config}->each_inbox(\&remove_eml_i, $arg);
+                       $self->{pi_cfg}->each_inbox(\&remove_eml_i,
+                                               $self, $eml, "$url UID:$uid");
                }
        } else {
                die "BUG: destination unknown $inboxes";
@@ -468,7 +467,7 @@ sub imap_fetch_all ($$$) {
        my $key = $req;
        $key =~ s/\.PEEK//;
        my ($uids, $batch);
-       my $warn_cb = $SIG{__WARN__} || sub { print STDERR @_ };
+       my $warn_cb = $SIG{__WARN__} || \&CORE::warn;
        local $SIG{__WARN__} = sub {
                my $pfx = ($_[0] // '') =~ /^([A-Z]: )/g ? $1 : '';
                $batch //= '?';
@@ -584,13 +583,13 @@ sub watch_atfork_child ($) {
        delete $self->{opendirs};
        PublicInbox::DS->Reset;
        %SIG = (%SIG, %{$self->{sig}}, CHLD => 'DEFAULT');
-       PublicInbox::Sigfd::sig_setmask($self->{oldset});
+       PublicInbox::DS::sig_setmask($self->{oldset});
 }
 
 sub watch_atfork_parent ($) {
        my ($self) = @_;
        _done_for_now($self);
-       PublicInbox::Sigfd::block_signals();
+       PublicInbox::DS::block_signals();
 }
 
 sub imap_idle_requeue ($) { # DS::add_timer callback
@@ -626,8 +625,11 @@ sub imap_idle_fork ($$) {
        my ($self, $url_intvl) = @_;
        my ($url, $intvl) = @$url_intvl;
        pipe(my ($r, $w)) or die "pipe: $!";
-       defined(my $pid = fork) or die "fork: $!";
+       my $seed = rand(0xffffffff);
+       my $pid = fork // die "fork: $!";
        if ($pid == 0) {
+               srand($seed);
+               eval { Net::SSLeay::randomize() };
                close $r;
                watch_atfork_child($self);
                watch_imap_idle_1($self, $url, $intvl);
@@ -649,10 +651,10 @@ sub event_step {
                                imap_idle_fork($self, $url_intvl);
                        }
                };
-               PublicInbox::Sigfd::sig_setmask($oldset);
+               PublicInbox::DS::sig_setmask($oldset);
                die $@ if $@;
        }
-       goto(&fs_scan_step) if $self->{mdre};
+       fs_scan_step($self) if $self->{mdre};
 }
 
 sub watch_imap_fetch_all ($$) {
@@ -705,8 +707,11 @@ sub poll_fetch_fork ($) { # DS::add_timer callback
        return if $self->{quit};
        pipe(my ($r, $w)) or die "pipe: $!";
        my $oldset = watch_atfork_parent($self);
+       my $seed = rand(0xffffffff);
        my $pid = fork;
        if (defined($pid) && $pid == 0) {
+               srand($seed);
+               eval { Net::SSLeay::randomize() };
                close $r;
                watch_atfork_child($self);
                if ($urls->[0] =~ m!\Aimaps?://!i) {
@@ -717,7 +722,7 @@ sub poll_fetch_fork ($) { # DS::add_timer callback
                close $w;
                _exit(0);
        }
-       PublicInbox::Sigfd::sig_setmask($oldset);
+       PublicInbox::DS::sig_setmask($oldset);
        die "fork: $!"  unless defined $pid;
        $self->{poll_pids}->{$pid} = [ $intvl, $urls ];
        PublicInbox::EOFpipe->new($r, \&reap, [$pid, \&poll_fetch_reap, $self]);
@@ -776,7 +781,7 @@ sub watch_imap_init ($$) {
 # flesh out common NNTP-specific data structures
 sub nntp_common_init ($) {
        my ($self) = @_;
-       my $cfg = $self->{config};
+       my $cfg = $self->{pi_cfg};
        my $nn_args = {}; # scheme://authority => Net::NNTP->new arg
        for my $url (sort keys %{$self->{nntp}}) {
                my $sec = uri_section(uri_new($url));
@@ -930,7 +935,7 @@ sub nntp_fetch_all ($$$) {
        $beg = $l_art + 1;
 
        warn "I: $url fetching ARTICLE $beg..$end\n";
-       my $warn_cb = $SIG{__WARN__} || sub { print STDERR @_ };
+       my $warn_cb = $SIG{__WARN__} || \&CORE::warn;
        my ($err, $art);
        local $SIG{__WARN__} = sub {
                my $pfx = ($_[0] // '') =~ /^([A-Z]: )/g ? $1 : '';
@@ -967,8 +972,8 @@ sub nntp_fetch_all ($$$) {
                        }
                } elsif ($inboxes eq 'watchspam') {
                        my $eml = PublicInbox::Eml->new(\$raw);
-                       my $arg = [ $self, $eml, "$url ARTICLE $art" ];
-                       $self->{config}->each_inbox(\&remove_eml_i, $arg);
+                       $self->{pi_cfg}->each_inbox(\&remove_eml_i,
+                                       $self, $eml, "$url ARTICLE $art");
                } else {
                        die "BUG: destination unknown $inboxes";
                }
@@ -1067,7 +1072,7 @@ sub fs_scan_step {
 sub scan {
        my ($self, $op) = @_;
        push @{$self->{ops}}, $op;
-       goto &fs_scan_step;
+       fs_scan_step($self);
 }
 
 sub _importer_for {