X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FLEI.pm;h=320a2bfc28695e9f513a8bcb85a438ebdf4b90f7;hb=af0b0fb7a454470a32c452119d0392e0dedb3fe1;hp=bb77198e437d605436d2ee56a36388f488265347;hpb=52acde10d4c149bb73b717abdc70720be9a4fe24;p=public-inbox.git diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index bb77198e..320a2bfc 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -1,4 +1,4 @@ -# Copyright (C) 2020 all contributors +# Copyright (C) 2020-2021 all contributors # License: AGPL-3.0+ # Backend for `lei' (local email interface). Unlike the C10K-oriented @@ -16,10 +16,10 @@ use POSIX (); use IO::Handle (); use Sys::Syslog qw(syslog openlog); use PublicInbox::Config; -use PublicInbox::Syscall qw($SFD_NONBLOCK EPOLLIN EPOLLONESHOT); +use PublicInbox::Syscall qw(SFD_NONBLOCK EPOLLIN EPOLLONESHOT); use PublicInbox::Sigfd; -use PublicInbox::DS qw(now); -use PublicInbox::Spawn qw(spawn); +use PublicInbox::DS qw(now dwaitpid); +use PublicInbox::Spawn qw(spawn run_die); use PublicInbox::OnDestroy; use Text::Wrap qw(wrap); use File::Path qw(mkpath); @@ -482,8 +482,7 @@ sub lei_config { my $cfg = _lei_cfg($self, 1); my $cmd = [ qw(git config -f), $cfg->{'-f'}, @argv ]; my %rdr = map { $_ => $self->{$_} } (0..2); - require PublicInbox::Import; - PublicInbox::Import::run_die($cmd, $env, \%rdr); + run_die($cmd, $env, \%rdr); } sub lei_init { @@ -605,7 +604,7 @@ sub lei_git { # support passing through random git commands my ($self, @argv) = @_; my %rdr = map { $_ => $self->{$_} } (0..2); my $pid = spawn(['git', @argv], $self->{env}, \%rdr); - PublicInbox::DS::dwaitpid($pid, \&reap_exec, $self); + dwaitpid($pid, \&reap_exec, $self); } sub accept_dispatch { # Listener {post_accept} callback @@ -676,7 +675,7 @@ sub lazy_start { require IO::FDPass; require PublicInbox::Listener; require PublicInbox::EOFpipe; - (-p STDOUT && -p STDERR) or die "E: stdout+stderr must be pipes\n"; + (-p STDOUT) or die "E: stdout must be a pipe\n"; open(STDIN, '+<', '/dev/null') or die "redirect stdin failed: $!"; POSIX::setsid() > 0 or die "setsid: $!"; my $pid = fork // die "fork: $!"; @@ -705,7 +704,7 @@ sub lazy_start { USR1 => \&noop, USR2 => \&noop, }; - my $sigfd = PublicInbox::Sigfd->new($sig, $SFD_NONBLOCK); + my $sigfd = PublicInbox::Sigfd->new($sig, SFD_NONBLOCK); local %SIG = (%SIG, %$sig) if !$sigfd; if ($sigfd) { # TODO: use inotify/kqueue to detect unlinked sockets PublicInbox::DS->SetLoopTimeout(5000); @@ -741,17 +740,16 @@ sub lazy_start { $n; # true: continue, false: stop }); - # STDIN was redirected to /dev/null above, closing STDOUT and - # STDERR will cause the calling `lei' client process to finish - # reading <$daemon> pipe. - open STDOUT, '>&STDIN' or die "redirect stdout failed: $!"; + # STDIN was redirected to /dev/null above, closing STDERR and + # STDOUT will cause the calling `lei' client process to finish + # reading the <$daemon> pipe. openlog($path, 'pid', 'user'); local $SIG{__WARN__} = sub { syslog('warning', "@_") }; - my $owner_pid = $$; - my $on_destroy = PublicInbox::OnDestroy->new(sub { - syslog('crit', "$@") if $@ && $$ == $owner_pid; + my $on_destroy = PublicInbox::OnDestroy->new($$, sub { + syslog('crit', "$@") if $@; }); open STDERR, '>&STDIN' or die "redirect stderr failed: $!"; + open STDOUT, '>&STDIN' or die "redirect stdout failed: $!"; # $daemon pipe to `lei' closed, main loop begins: PublicInbox::DS->EventLoop; @$on_destroy = (); # cancel on_destroy if we get here