diff options
author | Eric Wong <e@80x24.org> | 2021-01-03 11:24:50 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2021-01-03 18:24:08 +0000 |
commit | b156cb4ef176b41131154a6d7632aed92b143fa0 (patch) | |
tree | 46b13794fbc87a2b0133a1f450328f0b35e0539d /t | |
parent | 0939882b8a883e3f034bd059cdec4984d36f4ac7 (diff) | |
download | public-inbox-b156cb4ef176b41131154a6d7632aed92b143fa0.tar.gz |
We'll always be transferring stdin, stdout, and stderr together for lei. Perhaps I lack imagination or foresight, but I can't think of a reason to send more or less FDs.
Diffstat (limited to 't')
-rw-r--r-- | t/lei.t | 2 | ||||
-rw-r--r-- | t/spawn.t | 33 |
2 files changed, 23 insertions, 12 deletions
@@ -195,7 +195,7 @@ SKIP: { # real socket require_mods(qw(Cwd), my $nr = 46); require PublicInbox::Spawn; skip "Inline::C not installed/configured or IO::FDPass missing", $nr - unless PublicInbox::Spawn->can('send_fd'); + unless PublicInbox::Spawn->can('send_3fds'); local $ENV{XDG_RUNTIME_DIR} = "$home/xdg_run"; my $sock = "$ENV{XDG_RUNTIME_DIR}/lei/sock"; @@ -8,20 +8,31 @@ use PublicInbox::Sigfd; use Socket qw(AF_UNIX SOCK_STREAM); SKIP: { - my $recv_fd = PublicInbox::Spawn->can('recv_fd'); - my $send_fd = PublicInbox::Spawn->can('send_fd'); - skip 'Inline::C not enabled', 3 unless $send_fd && $recv_fd; + my $recv_3fds = PublicInbox::Spawn->can('recv_3fds'); + my $send_3fds = PublicInbox::Spawn->can('send_3fds'); + skip 'Inline::C not enabled', 3 unless $send_3fds && $recv_3fds; my ($s1, $s2); socketpair($s1, $s2, AF_UNIX, SOCK_STREAM, 0) or BAIL_OUT $!; pipe(my ($r, $w)) or BAIL_OUT $!; - ok($send_fd->(fileno($s1), fileno($r)), 'pipe sent'); - my $rfd = $recv_fd->(fileno($s2)); - like($rfd, qr/\A\d+\z/, 'got FD'); - open(my $rfh, '<&=', $rfd) or BAIL_OUT $!; - my @old = stat($r); - my @new = stat($rfh); - is("$old[0]\0$old[1]", "$new[0]\0$new[1]", - 'device/inode matches on received FD'); + my @orig = ($r, $w, $s2); + my @fd = map { fileno($_) } @orig; + ok($send_3fds->(fileno($s1), $fd[0], $fd[1], $fd[2]), + 'FDs sent'); + my (@fds) = $recv_3fds->(fileno($s2)); + is(scalar(@fds), 3, 'got 3 fds'); + use Data::Dumper; diag Dumper(\@fds); + is(scalar(grep(/\A\d+\z/, @fds)), 3, 'all valid FDs'); + my $i = 0; + my @cmp = map { + open my $new, $_, shift(@fds) or BAIL_OUT "open $! $i => $_"; + ($new, shift(@orig), $i++); + } (qw(<&= >&= +<&=)); + while (my ($new, $old, $fd) = splice(@cmp, 0, 3)) { + my @new = stat($new); + my @old = stat($old); + is("$old[0]\0$old[1]", "$new[0]\0$new[1]", + "device/inode matches on received FD:$fd"); + } } { |