- 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");
+ }