]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LEI.pm
lei q: disable remote externals if locals exist
[public-inbox.git] / lib / PublicInbox / LEI.pm
index f6bc920d4cae9cecf849eb648683703b881eb93e..378113e8446a4179ef1ac78456004541d0b53677 100644 (file)
@@ -83,9 +83,9 @@ sub _config_path ($) {
 our %CMD = ( # sorted in order of importance/use:
 'q' => [ 'SEARCH_TERMS...', 'search for messages matching terms', qw(
        save-as=s output|mfolder|o=s format|f=s dedupe|d=s thread|t augment|a
-       sort|s=s reverse|r offset=i remote local! external! pretty mua-cmd=s
-       verbose|v
-       since|after=s until|before=s), opt_dash('limit|n=i', '[0-9]+') ],
+       sort|s=s reverse|r offset=i remote! local! external! pretty mua-cmd=s
+       torsocks=s no-torsocks verbose|v since|after=s until|before=s),
+       PublicInbox::LeiQuery::curl_opt(), opt_dash('limit|n=i', '[0-9]+') ],
 
 'show' => [ 'MID|OID', 'show a given object (Message-ID or object ID)',
        qw(type=s solve! format|f=s dedupe|d=s thread|t remote local!),
@@ -298,6 +298,9 @@ sub atfork_prepare_wq {
        if (my $pgr = $self->{pgr}) {
                push @$tcafc, @$pgr[1,2];
        }
+       if (my $old_1 = $self->{old_1}) {
+               push @$tcafc, $old_1;
+       }
        for my $f (qw(lxs l2m)) {
                my $ipc = $self->{$f} or next;
                push @$tcafc, grep { defined }
@@ -340,7 +343,7 @@ sub atfork_parent_wq {
                $ret->{dedupe} = $wq->deep_clone($dedupe);
        }
        $self->{env} = $env;
-       delete @$ret{qw(-lei_store cfg pgr lxs)}; # keep l2m
+       delete @$ret{qw(-lei_store cfg old_1 pgr lxs)}; # keep l2m
        my @io = delete @$ret{0..2};
        $io[3] = delete($ret->{sock}) // $io[2];
        my $l2m = $ret->{l2m};
@@ -695,17 +698,21 @@ sub exec_buf ($$) {
 }
 
 sub start_mua {
-       my ($self, $sock) = @_;
+       my ($self) = @_;
        my $mua = $self->{opt}->{'mua-cmd'} // return;
        my $mfolder = $self->{ovv}->{dst};
-       require Text::ParseWords;
-       my $replaced;
-       my @cmd = Text::ParseWords::shellwords($mua);
-       # mutt uses '%f' for open-hook with compressed folders, so we use %f
-       @cmd = map { $_ eq '%f' ? ($replaced = $mfolder) : $_ } @cmd;
+       my (@cmd, $replaced);
+       if ($mua =~ /\A(?:mutt|mailx|mail|neomutt)\z/) {
+               @cmd = ($mua, '-f');
+       # TODO: help wanted: other common FOSS MUAs
+       } else {
+               require Text::ParseWords;
+               my @cmd = Text::ParseWords::shellwords($mua);
+               # mutt uses '%f' for open-hook with compressed mbox, we follow
+               @cmd = map { $_ eq '%f' ? ($replaced = $mfolder) : $_ } @cmd;
+       }
        push @cmd, $mfolder unless defined($replaced);
-       $sock //= $self->{sock};
-       if ($sock) { # lei(1) client process runs it
+       if (my $sock = $self->{sock}) { # lei(1) client process runs it
                send($sock, exec_buf(\@cmd, {}), MSG_EOR);
        } else { # oneshot
                $self->{"mua.pid.$self.$$"} = spawn(\@cmd);
@@ -758,11 +765,10 @@ sub accept_dispatch { # Listener {post_accept} callback
                return send($sock, 'timed out waiting to recv FDs', MSG_EOR);
        my @fds = $recv_cmd->($sock, my $buf, 4096 * 33); # >MAX_ARG_STRLEN
        if (scalar(@fds) == 4) {
-               my $i = 0;
-               for my $rdr (qw(<&= >&= >&= <&=)) {
+               for my $i (0..3) {
                        my $fd = shift(@fds);
-                       open($self->{$i++}, $rdr, $fd) and next;
-                       send($sock, "open($rdr$fd) (FD=$i): $!", MSG_EOR);
+                       open($self->{$i}, '+<&=', $fd) and next;
+                       send($sock, "open(+<&=$fd) (FD=$i): $!", MSG_EOR);
                }
        } else {
                return send($sock, "recv_cmd failed: $!", MSG_EOR);