#!/usr/bin/perl -w # Copyright (C) 2016-2020 all contributors # License: AGPL-3.0+ use strict; use IO::Handle; use PublicInbox::WatchMaildir; use PublicInbox::Config; use PublicInbox::DS; use PublicInbox::Sigfd; use PublicInbox::Syscall qw(SFD_NONBLOCK); my $oldset = PublicInbox::Sigfd::block_signals(); STDOUT->autoflush(1); STDERR->autoflush(1); my ($config, $watch_md); my $reload = sub { $config = PublicInbox::Config->new; $watch_md->quit if $watch_md; $watch_md = PublicInbox::WatchMaildir->new($config); }; $reload->(); if ($watch_md) { my $scan = sub { $watch_md->trigger_scan('full') if $watch_md }; my $quit = sub { $watch_md->quit if $watch_md; $watch_md = undef; }; my $sig = { HUP => $reload, USR1 => $scan, CHLD => \&PublicInbox::DS::enqueue_reap, }; $sig->{QUIT} = $sig->{TERM} = $sig->{INT} = $quit; # --no-scan is only intended for testing atm, undocumented. unless (grep(/\A--no-scan\z/, @ARGV)) { PublicInbox::DS::requeue($scan); } my $sigfd = PublicInbox::Sigfd->new($sig, SFD_NONBLOCK); local %SIG = (%SIG, %$sig) if !$sigfd; if (!$sigfd) { PublicInbox::Sigfd::set_sigmask($oldset); PublicInbox::DS->SetLoopTimeout(1000); } $watch_md->watch($sig, $oldset) while ($watch_md); }