- my $addr = pack_sockaddr_un($path);
- socket($sock, AF_UNIX, SOCK_STREAM, 0) or die "socket: $!";
- unless (connect($sock, $addr)) { # start the daemon if not started
- local $ENV{PERL5LIB} = join(':', @INC);
- open(my $daemon, '-|', $^X, qw[-MPublicInbox::LEI
- -E PublicInbox::LEI::lazy_start(@ARGV)],
- $path, $! + 0, $narg) or die "popen: $!";
- while (<$daemon>) { warn $_ } # EOF when STDERR is redirected
- close($daemon) or warn <<"";
+ $SIG{CHLD} = $sigchld;
+ my $pid = fork // die "fork: $!";
+ if ($pid == 0) {
+ $do_exec->() if $fds->[1]; # git-credential, pager
+
+ # parent backgrounds on MUA
+ POSIX::setsid() > 0 or die "setsid: $!";
+ @parent = ($parent);
+ return; # continue $recv_cmd in background
+ }
+ if ($fds->[1]) {
+ $pids{$pid} = undef;
+ } else {
+ $do_exec->(); # MUA reuses stdout
+ }
+};
+
+my $runtime_dir = ($ENV{XDG_RUNTIME_DIR} // '') . '/lei';
+if ($runtime_dir eq '/lei') {
+ require File::Spec;
+ $runtime_dir = File::Spec->tmpdir."/lei-$<";
+}
+unless (-d $runtime_dir) {
+ require File::Path;
+ File::Path::make_path($runtime_dir, { mode => 0700 });
+}
+my $path = "$runtime_dir/$narg.seq.sock";
+my $addr = pack_sockaddr_un($path);
+socket($sock, AF_UNIX, SOCK_SEQPACKET, 0) or die "socket: $!";
+unless (connect($sock, $addr)) { # start the daemon if not started
+ local $ENV{PERL5LIB} = join(':', @INC);
+ open(my $daemon, '-|', $^X, qw[-MPublicInbox::LEI
+ -E PublicInbox::LEI::lazy_start(@ARGV)],
+ $path, $! + 0, $narg) or die "popen: $!";
+ while (<$daemon>) { warn $_ } # EOF when STDERR is redirected
+ close($daemon) or warn <<"";