user/dev discussion of public-inbox itself
 help / color / mirror / code / Atom feed
2b041fb4636624e4b81af3aa3c5ef4576ac00834 blob 2173 bytes (raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 
#!perl -w
# Copyright (C) 2020 all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
use strict;
use v5.10.1;
use Socket qw(AF_UNIX SOCK_STREAM pack_sockaddr_un);

if (eval { require IO::FDPass; 1 }) { # use daemon to reduce load time
	my $path = do {
		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::mkpath($runtime_dir, 0, 0700);
		}
		"$runtime_dir/sock";
	};
	my $addr = pack_sockaddr_un($path);
	socket(my $sock, AF_UNIX, SOCK_STREAM, 0) or die "socket: $!";
	unless (connect($sock, $addr)) { # start the daemon if not started
		my $err = $! + 0;
		my $env = { PERL5LIB => join(':', @INC) };
		my $cmd = [ $^X, qw[-MPublicInbox::LEI
			-E PublicInbox::LEI::lazy_start(@ARGV)],
			$path, $err ];
		require PublicInbox::Spawn;
		waitpid(PublicInbox::Spawn::spawn($cmd, $env), 0);
		warn "lei-daemon exited with \$?=$?\n" if $?;

		# try connecting again anyways, unlink+bind may be racy
		connect($sock, $addr) or die
			"connect($path): $! (after attempted daemon start)";
	}
	require Cwd;
	my $cwd = Cwd::fastcwd() // die "fastcwd: $!";
	my $pwd = $ENV{PWD} // '';
	if ($pwd eq $cwd) { # likely, all good
	} elsif ($pwd) { # prefer ENV{PWD} if it's a symlink to real cwd
		my @st_cwd = stat($cwd) or die "stat(cwd=$cwd): $!\n";
		my @st_pwd = stat($pwd);
		# make sure st_dev/st_ino match for {PWD} to be valid
		$pwd = $cwd if (!@st_pwd || $st_pwd[1] != $st_cwd[1] ||
					$st_pwd[0] != $st_cwd[0]);
	} else {
		$pwd = $cwd;
	}
	local $ENV{PWD} = $pwd;
	my $buf = "$$\0\0>" . join("]\0[", @ARGV) . "\0\0>";
	while (my ($k, $v) = each %ENV) { $buf .= "$k=$v\0" }
	$buf .= "\0\0";
	select $sock;
	$| = 1; # unbuffer selected $sock
	IO::FDPass::send(fileno($sock), $_) for (0..2);
	print $sock $buf or die "print(sock, buf): $!";
	while ($buf = <$sock>) {
		$buf =~ /\Aexit=([0-9]+)\n\z/ and exit($1 + 0);
		die $buf;
	}
} else { # for systems lacking IO::FDPass
	require PublicInbox::LEI;
	PublicInbox::LEI::oneshot(__PACKAGE__);
}
debug log:

solving 2b041fb4 ...
found 2b041fb4 in https://80x24.org/public-inbox.git

Code repositories for project(s) associated with this inbox:

	https://80x24.org/public-inbox.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).